簡介
在 Unity 中,大家可以看到在 Editor 視窗在編輯時可以看到有一些提示使用者的Icon或是指標提示,例如燈、PostProcessing、Camera、Particle等等等。這篇主要想跟大家分享,假使有一天我們要自己製作某些工具或是外掛,要引導使用者容易編輯的話,都是需要一些指標,在 Unity 中稱作 Gizmos。
Gizmos & Handles
上圖是透過程式來畫出 Gizmos,而在簡介提到 Unity 內建的導引 Icon 是用到 DrawIcon()此用法,但我們可以試試看其他的方法來做實驗,在這邊我們的主題是想畫出假如某物件掛載此 Gizmos 程式後,會顯示物件原點與範圍,讓其他物件進入此範圍時會觸發其他事件。
先來看看結果,如上圖,這邊我們先來新增可供使用者調整的顏色與參數。放置好後可以看到如上圖的顏色區可調整。
public Color gizmosColor;
public Color gizmosWireColor;
public Color gizmosTriggerRangeColor;
public float gizmosSize;
public float TriggerRange;
接著就要講到本篇的重點如何使用 Gizmos 與 Handle,這邊我們使用到 Handle 方法是想要在物件上顯示該物件的名稱,Gizmos不支援 String 用法,所以就另尋了有相同功能解可以顯示 String Gizmos 的 Handle。
在使用Handles之前要先加入 UnityEditor,由於在 Using 假如新增UnityEditor,Handles此用法會出現錯誤,所以必須直接加在前面。而這邊我們就新增兩個參數,字體的 Color 與顯示的字內容 Label,細節如下程式碼。
//指定Label的顏色,可在Inspectors調整,剛剛有宣告外部讀取
UnityEditor.Handles.color = gizmosWireColor;
//設定Label位置、要顯示的名稱
UnityEditor.Handles.Label(new Vector3(0, gizmosSize, 0), ScenarioObject.name);
再來我們來新增指定該程式 Trigger 的原點指示,這邊就用到 Gizmos.DrawCube()與 Gizmos.DrawWireCube(),使用 Gizmos畫出方形 Gizmos實體與外框,程式解析如下。
//指定gizmos cube顏色
Gizmos.color = gizmosColor;
//畫出Cube,方法參數包含產生位置、方塊大小
Gizmos.DrawCube(transform.position, new Vector3(gizmosSize, gizmosSize, gizmosSize));
//指定Cube外框顏色
Gizmos.color = gizmosWireColor;
//劃出外框,外框的位置與大小
Gizmos.DrawWireCube(transform.position, new Vector3(gizmosSize, gizmosSize, gizmosSize));
最後我們來畫 Trigger 範圍,這邊也要用到 Handle,我們一樣跟上一段的畫出實體與外框,但這次來畫圓,詳細如下方程式碼。
//指定Handles顏色
UnityEditor.Handles.color = gizmosTriggerRangeColor;
//畫出圓形實體,並沿著XZ軸畫出
UnityEditor.Handles.DrawSolidDisc(transform.position, new Vector3(0, 1, 0), TriggerRange);
//指定顏色
UnityEditor.Handles.color = gizmosWireColor;
//畫出圓形外框
UnityEditor.Handles.DrawWireDisc(transform.position, new Vector3(0, 1, 0), TriggerRange);
小結
這次介紹的算式之前沒碰過功能,但是這是在未來我們要自己開發工具時,除了 OnGUI之外,這可是很重要的一個元素。在先前的 Mesh Editor 那篇中所提到編輯頂點,也是透過 Gizmos 來實做的,我們來繼續研究下去。