1. 程式人生 > >Unity Editor 基礎篇(四):Handles

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去嘗試嘗試:

這裡寫圖片描述