天天看點

Unity編輯器拓展<二>

四.場景視圖拓展

建立兩個檔案夾Script,Editor,将我們的腳本都放在Script裡,建立一個腳本ChangeObjInfor,再建立一個腳本SceneEditor

讓SceneEditor繼承Editor類,在這裡,我們要使用Editor類,就必須把腳本放在Editor檔案夾中,才能驅動這個腳本。

引用一下Editor的命名空間UnityEditor,我們需要在Scene場景中繪制一個UI,需要使用OnSceneUI的方法

private void OnSceneGUI()
    {
        Handles.BeginGUI();//開始繪制GUI
        GUILayout.BeginArea(new Rect(0, 0, 150, 200));//繪制GUI的顯示區域
        GUILayout.Label("選擇顔色");//添加文字提示
        if (GUILayout.Button("黃色"))//添加按鈕
        {
            
        }
        GUILayout.EndArea();//結束區域
        Handles.EndGUI();//結束GUI
    }
           

自定義腳本

[CustomEditor(typeof(ChangeObjInfor))]
           

自定義完以後,我們得到腳本所挂載的物體目标

Target就是我們腳本所挂載的目标,是在Editor類裡面

ChangeObjInfor theTarget = (ChangeObjInfor)target;
           

回到場景,我們建立一個Cube,然後把我們的ChangeObjInfor挂載到Cube上,就可以看到Scene場景中有了三個按鈕,當我們點選的時候,就可以輸出相應的Debug。

下面我們真正的修改一下cube的顔色,回到代碼中,我們擷取一下目标的材質

theTarget.GetComponent<Renderer>().sharedMaterial.color = Color.red;
           

我們也可以在場景中繪制一下Cube的坐标

參數;坐标 要顯示的東西

Handles.Label(theTarget.transform.position, theTarget.name + ":" + theTarget.transform.position.ToString());
           

現在Scene就顯示坐标了,當我們移動cube,坐标也會改變

五.自定義視窗

在Editor中建立一個腳本MyWindowEditor,繼承EditorWindow,引用命名空間UnityEditor

首先我們在GameObject下繪制一個菜單按鈕

[MenuItem("GameObject/ShowWindow")]
           

然後我們來繪制,在點選ShowWindow的時候彈出一個視窗

Rect theRect = new Rect(0, 0, 500, 500);//繪制視窗的大小和位置
        MyWindowEditor window =(MyWindowEditor) EditorWindow.GetWindowWithRect(typeof(MyWindowEditor), theRect, true, "我的視窗");
           
//繪制視窗,四個參數:類型,坐标和大小,bool值(控制視窗的類型,視窗有兩種類型,一種是獨立類型一種是頁籤類型,true是獨立視窗),視窗名稱。
        window.Show();//顯示視窗
           

我們可以在視窗裡面繪制我們需要的東西

繪制一個可以啟用的分組

Unity編輯器拓展&lt;二&gt;

我們還可以在視窗裡面打開系統自帶的通知

繪制兩個按鈕

Unity編輯器拓展&lt;二&gt;

我們可以再繪制一個關閉視窗的按鈕

Unity編輯器拓展&lt;二&gt;

窗體裡面常用的函數

private void OnFocus()
    {
        Debug.Log("視窗被選中");
    }
    private void OnLostFocus()
    {
        Debug.Log("視窗失去選中");
    }
    private void OnHierarchyChange()
    {
        Debug.Log("層次面闆的對象發生改變");
    }
    private void OnProjectChange()
    {
        Debug.Log("項目面闆的對象發生改變");
    }
    private void OnSelectionChange()
    {
        foreach (Transform item in Selection.transforms)
        
            {
            Debug.Log("被選中的物體是:" + item.name);
            }
    }
    private void OnDestroy()
    {
        Debug.Log("視窗被關閉了");
    }
           

六.其他擴充

我們在Script中添加一個腳本Test

1.想要實作,當我給一個物體添加Text腳本時,自動添加一個剛體元件

[RequireComponent(typeof(Rigidbody))]
           

我們這樣添加的Rigidbody是不能删除了,防止了我們的誤操作

如果我們想要挂載其他的元件也是一樣的,隻要在typeof裡加入元件的名字

2.我們還可以把腳本當做元件來快速添加,可以把腳本放在Component裡面

[AddComponentMenu("Script/Test")]
           

3.元件的右鍵操作

Unity編輯器拓展&lt;二&gt;

寫一個方法,在方法上面添加

[ContextMenu("測試")]
    public void TestMenu()
    {

    }