Unity Editor 基礎篇(四):Handles
本文為本人學習上鍊接的筆記微有改動,請點選以上鍊接檢視原文,尊重樓主智慧財產權。
Unity Editor:Handles
最終效果:
準備: Scripts資料夾中建立C#指令碼”MyHandles”,在Editor資料夾中建立C#指令碼”HandleInspector”,將下小圖示儲存到Img資料夾中。
關於:Handles控制柄類
繪製半徑操作柄:
首先開啟我們的MyHandles.cs指令碼,為其新增一個變數:
public float areaRadius; //半徑
然後開啟HandlesInspector.cs指令碼新增:
using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(MyHandles))] public class HandlesInspector:Editor { MyHandles myHandles; void OnEnable() { myHandles=(MyHandles)target; } public override void OnInspectorGUI() { DrawDefaultInspector(); } private void OnSceneGUI() { //第一個引數為在場景中顯示的位置(以物體的中心位置為基準) //第二個引數為顯示的名字 //用於在場景中顯示設定的名字 Handles.Label(myHandles.transform.position+new Vector3(0,1,0),"MyHandles"); //第一個引數為該旋轉操作柄的初始旋轉角度 //第二個引數為操作柄顯示的位置(以物體的旋轉位置為基準) //第三個引數為設定操作柄的半徑 //用於在場景中顯示半徑操作柄 myHandles.areaRadius = Handles.RadiusHandle(Quaternion.identity,myHandles.transform.position,myHandles.areaRadius); } }
將這兩個指令碼儲存,回到Unity中建立一個空物體,併為其新增 MyHandles.cs 指令碼:
此時我們觀察場景,除了場景中出了 “MyHandles” 幾個字外,似乎啥事兒也沒發生,不急,讓我們來調整調整 Area Radius 引數的值,便能看到如下效果:
程式碼很簡單,註釋也給大家弄上了,相信大家都能看懂吧。還是不太懂的可以多看看API:
作用:這個東西是不是有點型別於碰撞體的那個框框啊,這玩意多用於製作AI,用於判斷和指定UI影響範圍用的。
繪製縮放操作柄:
開啟 MyHandles.cs 指令碼,新增如下變數:
public float size;//大小
然後為 HandlesInspector.cs 指令碼新增如下程式碼:
參看API:
作用:多用於繪製一些自定義的操作,比如Unity的粒子系統就用到了好多自定義的操作柄,比如粒子系統的Shape引數就用到了該函式的第五個引數來繪製:
繪製位置操作柄:
開啟 MyHandles.cs 指令碼,新增如下變數:
然後為 HandlesInspector.cs 指令碼新增如下程式碼:
效果:
參見API:
作用:這個可以用在AI上面,然後為每一個AI新增一個位置操作柄,這樣好像看上去方便不少吧?
繪製旋轉操作柄:
開啟 MyHandles.cs 指令碼,新增如下變數:
然後為 HandlesInspector.cs 指令碼新增如下程式碼:
效果:
PS:nodePointsRotation的個數要與nodePoints的個數要相等或者小於nodePoints。
做一個操作,看看大夥們能不能看懂我想表達的意思:
是不是感覺像是靜止一般,一動不動的呢?下面修改一下程式碼:
此時,你會看到如下的錯誤,不要慌張,我們只有越到錯誤,解決多了,那以後越到錯誤就不是什麼可怕的事情了:
相信很多人都知道這個是什麼錯誤吧,那是因為由三維向量轉為四元素W的值不能為0,因此我們只要把W設定為1即可,如下所示:
這個操作呢,主要是幫大家找出一些開發過程中容易遺漏的錯誤,還有一個目的就是讓座標軸跟隨著旋轉而旋轉(因為第二個引數是位置操作柄的旋轉方向嘛,我把它改為了我們設定好的旋轉方向,因此位置操作柄便能跟隨著我們的旋轉而旋轉了)。
連線操作柄:
為 HandlesInspector.cs 指令碼新增如下程式碼:
此時回到場景中便能看到如下所示:
這段程式碼呢,也很簡單,可能有點不明白的也就是 Mathf.Repeat()函式,這個簡單,看下圖便能明白:
其實這樣做的原因大夥們都知道,就是為了防止下標越界。
開啟和關閉操作柄:
開啟 MyHandles.cs 指令碼,新增如下變數:
然後為 HandlesInspector.cs 指令碼新增如下程式碼:
就是當showNodeHandles為false時便不執行 if 程式碼塊裡的程式碼,因此便無法繪製出位置操作柄和旋轉操作柄咯,最終的效果如下:
繪製場景GUI:
為 HandlesInspector.cs 指令碼新增如下程式碼:
回到場景便能看到如下圖所示的介面:
這段程式碼呢,其實也很簡單,不過是運用了兩對函式。
第一對為:Handles.BeginGUI() 和 Handles.EndGUI()。這對函式表名你想要在Scene檢視下繪製東西。
第二對為:GUILayout.BeginHorizontal() 和 GUILayout.EndHorizontal()。這對函式表明你想要以水平方向繪製東西。相信第二對函式大夥們都不陌生吧,記得在《Unity Editor 基礎篇(三):Editor Window》中有介紹過。
裡面的邏輯程式碼也很簡單,那就是繪製一個按鈕,當我點選時讓 MyHandles.shoNodeHandles的值取反(也就是原來為true,點選後取反,便為false)。
補充:在第一對函式裡得操作和自定義窗口裡得操作幾乎相同,大家可以參考下面得API去嘗試嘗試: