2016年1月8日 星期五

【翻譯】Unity官方教學 - UI Button (UGUI)


翻譯:
按鈕是通過檢測使用者輸入的觸發事件的元件,對於一般使用者輸入按鈕的圖形、滑鼠點擊或移動到上方產生不同的效果

要創建現有按鈕:右鍵>UI>Button
按鈕跟其他UI元素一樣必須是canvas的child子物件,如果沒有canvas直接創建button則會自動產生一個canvas,有關更多canvas詳細訊息可以參考canvas影片

New一個button會帶有一個text,這個text是一個可選的,button中不一定要有text(例如純圖示的按鈕),因此創建後不需要也可以直接刪掉,有關image跟text的詳細訊息可以參考其影片

按鈕中的Interactable(可互動性)是定義按鈕是否可接受輸入,如果要禁用按鈕可以把他勾掉(例如子選單彈出時,避免母畫面的button被觸發就可以禁用)
Transition(變換模式)
是指按鈕在一般狀態(normal) / 焦點(highlight) / 按壓(pressed) / disabled(離開)等狀態切換,一開始button預設是ColorTint模式

Transition(變換模式)此外還有none(無)模式,不會有任何變換效果
SpriteSwap(精靈切換模式):這個可以透過不同的sprite來呈現不同狀態,sprite通常是做為圖片型態的按鈕
Animation(動畫模式):這個模式則是透握大量的動畫來呈現按鈕不同的效果
在動畫模式中可以從window(視窗)中點選animation來叫出動畫編輯器(windows中是Ctrl+6)
在動畫編輯器左上角有個Normal這是按鈕狀態,點下可以彈出其他狀態,因此可以在各種狀態中放入需要的動畫,如果多個按鈕共享一個動畫效果的話,也可以利用Animator controller,把所有的按鈕點選後,切換成動畫模式後,再新增Animator組件,再把Animator Controller拖曳上去就可以讓所有按鈕都套用同一個controller的效果
(Animation官方也有另外一部教學)

Target Graphic可以指定按鈕的圖片
normal為按鈕平常的顏色
highlight為焦點(滑鼠移在按鈕上)的顏色
pressed為按壓未放開時的顏色
disabled為不能使用時的顏色

按鈕最常見的是最為一個觸發事件,其中On Click會出現在Button的屬性欄
上面會有一個On Click(Button)的列表
按下"+"可以新增對象跟觸發事件(function),此外也可以自己編寫script,而後面欄位則是參數
這裡的Click function都是做為public void也就是公共、不回傳值

2016年1月7日 星期四

【實作】Unity音樂/音效開關與調整音量大小(UGUI)


音樂/音效勾選鍵與控制條
適用情景:當你的遊戲在選項選單中需要勾選開啟音樂/音效以及調節音量大小控制條

結果圖如下:

【步驟】
1.創建UI ToggleToggle底下有個Label是說明文字可以改成你要的字樣,或是整塊取消掉改成用底下的Background圖片當作按鈕也OK,這邊用預設的方式。
2.創建UI Slider,調整條也可以套用客製的圖片或效果,這邊也是用預設的
3.新增Audio Souce,然後可以把一個mp3或其他音訊檔匯入Unity中(直接拖曳),然後放到Audio Source中的AudioClip,這邊先勾選Mute(靜音)跟Play on awake(場景起始直接播放)跟Loop(重複播放),Volume(音量)調整成0.5,也可以根據專案需求去做調整,調成0則無聲音,調成1則音量為最大
4.在Slider中預設Value是0.5,或可以調整成跟剛剛Volume同樣,底下On Value Changed按"+"號,並且對象改成音訊檔物件Audio,然後右邊下拉式選單改成AudioSource.volume這樣調整條就跟音量做連動了
5.Toggle底下Graphic可以改成想要的選取圖片,這邊用預設的,在底下On Value Changed按兩次"+"號,一個對象是Slider,下拉式為Slider.enabled這樣未勾選時調整條就鎖住不能動,此外這邊可以考慮使用別的圖示或顏色去讓使用者知道右邊的調整條被鎖住,而另一個對象是Audio,下拉式是AudioSource.enabled,這樣音樂就可以開與關了

*音效的呈現方式也亦同
*這邊的概念是勾選就重頭播放,但也有別種方式可以讓音樂直接撥放,未勾選時靜音,這樣就不會中斷主題曲或BGM的播放進度,不過這部分需求則是依照專案而定。

【實作】Unity公告系統(UGUI)


Unity 公佈欄 / 公告 / 說明框 UI系統
適用情景:當你的遊戲需要再開始畫面有一個公佈欄或是更新日誌


示意圖如下:
結果圖如下:
【步驟】
1.創建UI Image
2.在Image中添加Scroll Rect
3.在Image中添加Mask
4.在Image底下添加一個Text
5.在Image底下添加一個Scrollbar,在Direction中選擇Bottom to Top,Value調整1,下面On Value Changed按"+"號,選擇上面添加的Text

【解說】
首先通常會有一個背景圖,所以會創建一個UI Image當作背景,可以在屬性欄中Source image選擇圖片,或是練習過程如本次結果圖中在Color那邊做一個半透明的白色背景,然後新增一個Text在底下當作是內文,接著可以換成矩形工具模式,將內文拉長到能夠顯示完整內文,超出畫面也可以,然後在Image中增加Scroll Rect是為了可以滾動內文,Mask是為了遮蓋超出Image背景範圍的內文,

通常在Text中會放入內文,不過實際上會另外寫Script接收Server每次更新項目的Text

*注意當版面中有很多UI時,每個UI最好都另外取名字,像是主畫面的Text就叫做Title,Button的Text就叫做Button_text,如果Button功能是Menu_StartGame,那底下Text就叫做Menu_StartGame_Text會比較清楚,避免專案越來越複雜的時候命名的元件完全不知道他到底是哪一個Text。

2016年1月6日 星期三

【翻譯】Unity官方教學- Rect Transform (UGUI)



翻譯:
Rect Transform被用於所有的UI上,傳統的物件我們會變換對象的角度與位置,Rect Transform是針對對象中心位置的高度與寬度,在顯示中是一個簡單的2D矩形,Z軸作為對象的位置,也可以用來在3D環境下做變化,Rect Transform跟一般的Transform的差別就是錨的概念,如果父子物件都是Rect Transform,那你可以固定子物件的父物件,父UI元素的定位對象基於所指定的位置與大小而去移動、變大變小等等,在某UI底下的子UI一定會定錨在父UI身上

如果要調整Rect Transform請點選左上角的矩形工具或使用快捷鍵"T"
在Rect模式中你可以移動縮放旋轉,可以單擊邊緣拉長短或放大縮小
如果加上Shift則會等比例放大縮小
如果要旋轉則是在角落的點外圍單擊拖動
如果你要調整大小/旋轉你需要知道支點位置,一般單位的預設軸點在正中央,他會顯示一個藍色圈圈,單擊拖曳就可以改變支點位置
而子物件會有一個父物件的錨點,長得像花瓣,是四個三角形,每個三角形對應到矩形的拐角,這四個三角形可以分別拉開,而子物件的Anchors的Min/Max是針對父物件相對位置的


Lza心得:簡單來說Rect Transform跟一般的位置系統差在錨的概念,他可以將一組父子關係的UI定錨,例如父panel子是Button,想讓Button永遠在canvas的中心,就可以定錨後不管怎樣移動或放大縮小panel都不會改變其相對的位置
點擊Center/middle有個瞄準圖案會出現Anchor Presets可以調整錨點位置
而錨點可以很好的配置UI的位置而不用手動拉來拉去還會容易因為螢幕大小改變而使位置產生偏移。

2016年1月5日 星期二

【翻譯】Unity官方教學- UI Text(UGUI)


The Text component, used to render text onscreen for various purposes such as labels, buttons, and other information.
文本組件,主要是用於呈現文字在螢幕上,並用於例如標籤,按鈕,和其他訊息

Text主要是渲染文本在螢幕上,主要的功能就是顯示內文(Text),欄位為顯示在螢幕上的字符串,可以是簡單的文字或是動態顯示分數等等
如果換行會UI顯示上也會換行,所以最好在底下留下新的空白處
Character風格
Font 字體,支援TureType, OpenType, Dafont字體,中文的部分請點這
Font Style 風格如粗體、斜體
Fon Size 字體大小調整,若字體大小超出格子則會不顯示,可勾選overflow填滿
Line Spacing 間距,為了更容易閱讀也可以用Line spacing調整文字間距
Rich Text 富文本為可以嵌入RTC&HTML等格式
Paragraph段落
Alignment 校準,可以調整整個段落位置
Horizontal Overflow:Warp會自動換行,overflow則會直接溢出(超過格子只有一行這樣)
Vertical Overflow:Truncate則是會切斷垂直超過格子範圍的,同理overflow則允許超過
Best Fit 最佳配適,會讓文字自動適應格子大小
勾選Best Fit之後會出現Max/Min Size是期望出現自動適應字體大小的最大與最小值

Lza hint:如果要調整Text的邊界框框,需要選擇紅框內的選取模式


Color 顏色:就是字體顏色
Material 材質:影片中提到通常紋理材質是不會對字體有影響的

最後如果要動態變動文本的話,可以在script中new一個text,然後在update()中就可以更動內文
可以參考官方API文件

Lza心得:
這部分算是比較簡單,並沒有比較複雜的元素,在blog第一篇有提到中文字體的處理方案

【翻譯】Unity官方教學- UI Canvas(UGUI)


前言:這個系列是翻譯Unity官網上的UI教學,暫時沒有時間做成中文字幕,翻譯的如果沒有很好請多包涵XD

先簡單介紹一下Unity的UI史

OnGUI時期(Unity4.6以前)
在Untiy4.6以前官方式提供OnGUI函數來提供UI,而且不支援可視化開發,並且始終在3d object上方,也因此後來ArenMook就開發出一套NGUI plug-in讓UI這塊變得更容易開發,也可以顯示3d model跟粒子效果,網路上也有大量的教學,幾乎也被視為Unity的必備插件之一

UGUI時期(Unity4.6以後)
而4.6版本後出現了新版的UGUI,也是NGUI作者ArenMook從2012年11月加入Unity協助開發GUI讓UI的呈現更優化,因此在選擇GUI上通常會選擇UGUI,但NGUI仍然有持續更新也有使用者持續使用,如果已經使用NGUI的專案或是熟悉的開發者通常也會選擇繼續使用

到底要用UGUI還是NGUI:
有用過/正在用NGUI→選擇NGUI
沒用過NGUI的開發者→直接使用原生的UGUI即可

大致上是這樣,網路上也有一些比較專業的分析文,去針對兩者比較與效能表現
例如Drawcall數量,記憶體配置等等,不過大致上都是可用,而不如當初OnGUI可用性極低
所以兩者之中選擇影響並不會太大,而以下則是4.6版本時期的介紹,延用至5.0的今天也是OK的

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

UI CANVAS
版本檢查: 4.6 / 難度: 新手 / 日期: 24 Jul 2015
The Canvas is the root component for rendering all UI objects in Unity.
Canvas(畫布)是渲染所有UI物件的根容器

重點整理:
在UGUI中,只要添加任何UI到場景中就會自動生成Canvas跟Event System
所以的UI都必須位於Canvas底下



翻譯內容:
Canvas(畫布)
1.Canvas是一個控制將被渲染UI元素的組件
2.所有UI都必須是Canvas的子物件
3.同一個場景中是有可能有超過一個以上的canvas出現
4.使用UI元素至少需要一個可用canvas,如果沒有canvas而加入一個UI時會自動生成一個canvas並且讓其UI附在底下
5.每個canvas有不同的渲染模式可以設置
6.每個渲染模式可以在Render Mode pop-up menu(渲染模式彈出選單)中設定

Lza解說:
簡單來說,就是Canvas就是UI的母容器,而沒有canvas就直接new個UI就會生成1個canvas&1個eventsystem,而場景可以有多個canvas來控制或切換所需的UI
(例如一個是遊戲畫面UI,按ESC跳到另一個canvas進入選單畫面)
而渲染模式則是改良原本OnGUI僅有Overlay模式,也就是UI僅在最上層,下面會提到三種渲染模式

Screen Space - Overlay(覆蓋)
是最常見的渲染模式,也是canvas預設的渲染模式
在Overlay中,UI會覆蓋在場景上,而所有的UI都會渲染在所有場景最上層\
在這個模式中,canvas會自動填滿螢幕,並且根據螢幕設定改變自動調整大小
在Overlay模式中,canvas是由Rect Transform組件來驅動的,而canvas會變成不可編輯的

如果對Rect Transform有興趣,可以參考另外一隻教學(本期會翻譯)


這個渲染模式有一個Pixel Perfect(完美像素)選項
當勾選這個選項,UI會被調整到最近的像素
可以在某些情況下銳化UI元素的外觀

Screen Space - Camera(攝影機)
相較於覆蓋模式他是由一個場景特定的攝影機來呈現
他被允許一個特定攝影機設定螢幕場景UI的攝影機
最常使用的是立體攝影機給UI一個深度
在這個模式canvas會自動充滿整個攝影機視角
並且當攝影機的視角設定改變會自動調整
而這個模式一樣有Pixel Perfect的選項
Render Camera則是選取你要把UI渲染上去的目標攝影機,若沒設定攝影機則會回到預設的Overlay模式
Plane Distance為調整攝影機與UI的距離(調整大小會讓場景中UI元件變大或小,不過在預覽畫面是不變的),如果沒有設置距離的話,渲染出來的UI可能會被裁減掉
還可以根據Depth(深度)來調整UI,如果要詳細研究可以參考Camera教學(之後會翻譯)

World Space
1.這個模式不由RectTransform驅動
2.有可能擁有1個以上的canvas來作為UI渲染
3.屬性欄位中Event Camera是接受事件的攝影機
4.Receives Events為是否受到事件點擊或暫停所影響,如果取消的話,這個UI則會忽略該事件
5.Sorting Layer跟Order Layer則是相對於場景中其他渲染,用來控制canvas的呈現順序

Lza解說:
在這個模式中很適合用於RPG常常需要進入情境動畫或是切換視角來做不同UI的呈現,又或是簡單如本影片最後範例可以當作切換UI前後順序等等,主要是跟事件有緊密的關係。


備註其他欄位:
Blueprint:啟用後,物體不會旋轉和缩放。
Raw Edit:啟用後,調整物體的Pivot和Anchor不會改變物體的位置和尺寸。
Render Mode : 
  Screen Space  - Overlay - 將UI元件在場景中最上面渲染,螢幕縮放自動會改變大小。
  Screen Space  - Camera - 將UI元件指定某個攝影機前一定距離上,螢幕縮放自動會改變大小跟攝影機設定有關。
  World Space   - 將UI元件在空間中,大小由RectTransform調整,善用於3D上不要在2D上。

Pixel Perfect     - 保持實際大小,不會自動調整大小。
Render Camera - 渲染的攝影機
Event Camera   - 接收事件的攝影機
Plane Distance  - 距離
Sorting Layer    - 渲染的層級
Order in Layer   - 渲染的層級

Ui Scaler Mode :
  1.   Constant Pixel Size      - 使UI元件保留相同的大小(以像素为单位)無論屏幕大小。
  2.   Scale With Screen Size - 使UI元件自動調整屏幕。
Screen Math Mode 
  1.     Mathc Width Or Height  依寬度or高度
  2.     Reference Resolution X Y  寬高大小
  3.     Mathc Width Or Height
  4.     Math
每個Canvas都有一個Graphic Raycaster,用於獲取用戶選中的uGUI控件。
多個Canvas之間通過設置Graphic Raycaster的priority來設置事件響應的先後次序。
當Canvas採用World Space或Camera Space時,Graphic Raycaster的Block選項可以用來設置遮擋目標。

2015年11月22日 星期日

【Lesson 1】如何製作開頭動畫/影片 How to make opening video/animation


【影片播放/Movie player】

遊戲製作中常常開頭就會放一個影片,所以今天就來分享製作方式
在Unity5中有三種播放影片的方式,主要是透過MovieTexture(),透過貼圖的方式渲染出影片

  1. 藉由投射在Panel來播放(如果用VR可以移動視角)
  2. 直接在GUI上播放
  3. 行動裝置無法使用MovieTexture,所以有另外一種解法是Handheld.PlayFullScreenMovie()

Unity適用影片格式:PC需要安裝Quicktime播放器
 .mov、.mpg、.mpeg、.mp4、.avi、.asf(PC限定,可以做為測試時使用)
.ogg / .ogv (Moblie Device Only移動裝置限定)
預先動作是將目標影片拖曳進Project中,建議特別新增一個folder專門存放影音圖檔等Assets,不然檔案一多的時候Project裡面就會變得十分雜亂。
如果影片中含有音檔,會自動產生Audio檔,之後記得也要跟著拖到Panel

※以下的Script是為了展示API功能包含播放、暫停與停止等
實際上做開頭動畫就不用特別畫GUI來給別人播放暫停,是直接在Start放movTexture.Play()

【方法1】
在Hierarchy視圖中
  1. 創建一個Plane
  2. 創建Directional light照亮Plane
  3. 創建Main Camera對著Plane(可以利用2d場景來固定)
  4. 創建MoviePlayer.cs,拖曳到Plane上
using UnityEngine;
using
System.Collections;
public class MoviePlayer: MonoBehaviour
{
public MovieTexture movTexture; //影片紋理
void Start()
{
GetComponent<Renderer>().material.mainTexture = movTexture; //設置當前對象為主紋理為影片紋理(這邊我有做修正)
movTexture.loop = true;//設置循環撥放,如果要當開頭的話可以設計成不循環然後自動切場景下面會再提
}
void OnGUI()
{
if(GUILayout.Button("Play"))
{
if(!movTexture.isPlaying)
{movTexture.Play(); //播放與繼續 }
}
if(GUILayout.Button("Pause"))
{movTexture.Pause();//暫停播放 }
if(GUILayout.Button("Stop"))
{ovTexture.Stop();//停止播放 }
}
}
 如下圖所示,點擊按鈕後輕鬆的實現播放、暫停、停止操作。預設影片大小各位可在編輯器直接縮放Plane對象平面,而如果需要在遊戲運行中動態的縮放平面使用方法:
transform.localScale = new Vector(1,1,1);
模型預設縮放係數為1,這裡可以調節平面X、Y、Z三個方向的縮放係數,平面的大小會隨之改變,對應影片的大小也會隨之改變。

【方法2】
第二種播放視頻的方式基於GUI。
可以不用新增Plane&Directional light
創建 MoviePlayer2.cs,將以下Script套進Camera中即可

using UnityEngine;
using System.Collections;
public class MoviePlayer2: MonoBehaviour
{
 //影片紋理
 public MovieTexture movTexture;
 void Start()
 {
  //設置是否循環撥放,這邊設定開頭撥放完就跳轉場景所以不需要Loop
  movTexture.loop = false;
 }
 void OnGUI()
 {
  //繪製紋理
  GUI.DrawTexture (new Rect (0,0, Screen.width, Screen.height),movTexture,ScaleMode.StretchToFill);  
  if(GUILayout.Button("Play"))
  {
   //播放
   if(!movTexture.isPlaying)
   {
    movTexture.Play();
   }
  }
  if(GUILayout.Button("Pause"))
  {
   //暫定
   movTexture.Pause();
  }
  if(GUILayout.Button("Stop"))
  {
   //停止
   movTexture.Stop();
  }
 }
} 【移動裝置/Mobile Device解法】

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
 void OnGUI()
 {
     if (GUI.Button (new Rect (20,10,200,50), "PLAY ControlMode.CancelOnTouch")) 
  {
         Handheld.PlayFullScreenMovie("movie.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
  }
  if (GUI.Button (new Rect (20,90,200,25), "PLAY ControlMode.Full")) 
  {
         Handheld.PlayFullScreenMovie("movie.mp4", Color.black, FullScreenMovieControlMode.Full);
  }
  if (GUI.Button (new Rect (20,170,200,25), "PLAY ControlMode.Hidden")) 
  {
          Handheld.PlayFullScreenMovie("movie.mp4", Color.black, FullScreenMovieControlMode.Hidden); 
  }
  if (GUI.Button (new Rect (20,250,200,25), "PLAY ControlMode.Minimal")) 
  {
         Handheld.PlayFullScreenMovie("movie.mp4", Color.black, FullScreenMovieControlMode.Minimal);
  }
 }
}

1.播放時觸摸螢幕會影片關閉
2.播放時彈出IOS控制項,可以控制暫停播放全螢幕等等
3.播放時無法停止,當其播放完一次後自動關閉(適用在開頭場景)
4.播放時彈出IOS控制項,可以跳轉播放進度


注意:需要把影片放在Assets/StreamingAssets/路徑下才能讀取

影片播放加速(限PC):可到 雨松MOMO 這來看,這部分非本文主題

【SKIP/跳過影片】
接著,通常影片會附帶直接點擊螢幕就跳過開頭
一般而言會透過 Application.LoadLevel() 來達成
新增一個Button
把Button調成透明
把Button底下Text的文字刪除(或刪掉Text也可)
新增一個script(C#)LoadOnClick
using UnityEngine;
using System.Collections;
public class LoadOnClick : MonoBehaviour {
public void LoadScene(int level)
{
Application.LoadLevel(level);
}
}
在Button的Inspector最下面會找到一個onclick()點擊觸發事件

  1. 按一下加號
  2. 在把None(object)改成Canvas
  3. 右邊No Function應該會多出上述的LoadOnClick,裡面應該有一個LoadScene
  4. 選擇之後下面空格填1就會跳轉到場景1

場景編號可以透過File>Build Settings 去編號,初始場景是0,所以理論上也是跳轉到1去

【影片播放完畢後自動跳轉場景】
由於不一定玩家會透過觸控來跳轉,所以在影片播放完畢後仍然需要設置一個自動跳轉點
我研究了一下Movietexture的部分,好像沒有偵測影片播放完畢的狀態,只有判斷影片是否有播放的isPlaying(),但是影片播放完後他不會自動消失,而是停在最後一幀的圖片,所以他還是會判斷isPlaying=true,而duration也沒有用,最後只好採取比較土炮的方式就是直接用計數器,直接根據影片長度來結束強制跳轉,Code如下,可以直接加在上面影片播放的Script裡面

  void Update()
    {
        StartCoroutine(load());
    }
    IEnumerator load()
    {
        yield return new WaitForSeconds(20);//填入影片時間,這邊假設是20秒
        Application.LoadLevel(1);//自動跳轉第n關,這邊假設是第1關
    }

最後呈現出來應該是,程式一開啟自動撥放影片,然後按螢幕可以跳過
(或是在Button放一個自製的SKIP字樣的image)
或是到影片播放結束時自動跳轉到開始畫面
那我們下篇文章再來談開始畫面製作
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
參考網站: 泰課在線 Movie Texture
延伸閱讀:關於場景切換與優化 Unity:設計靈活的無縫場景轉換機制
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
使用版本:Unity5.2.0f3個人版
使用系統:Windows 10
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
最後PC版的Script應該長這樣,然後可以直接丟到Camera上
using UnityEngine;
using System.Collections;

public class Movie : MonoBehaviour
{
    public MovieTexture movTexture;
        void Start()
    {
        movTexture.loop = false;
    }
    void Update()
    {
        StartCoroutine(load());
    }
    IEnumerator load()
    {
        yield return new WaitForSeconds(19);
        Application.LoadLevel(1);
    }
    void OnGUI()
    {
        GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), movTexture, ScaleMode.StretchToFill);
            movTexture.Play();
    }
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
行動版的寫法這幾天再補上

Popular Posts