1. 程式人生 > >unity編輯器擴充套件學習

unity編輯器擴充套件學習

擴充套件編輯器實際上就是在unity選單欄中新增一些按鈕,可以一鍵執行一些重複性的工作。

一.新增按鈕

1.簡單使用MenuItem特性

using UnityEngine;
using UnityEditor;

public class Tools
{
    [MenuItem("Tools/test")]
    static void Test()
    {
        Debug.Log("test");
    }
}

 

 2.路徑設定

在方法上新增MenuItem特性,在MenuItem的括號中傳入路徑字串引數,路徑中使用/進行目錄分級。第3個引數priority為選項在目錄中的顯示順序,這個值預設是1000。
using UnityEngine;
using UnityEditor;

public class Tools
{
    //MenuItem的第3個引數priority為當前選項在選單欄中的顯示順序,數字越大,顯示在越下面
    //當相鄰兩個選項的priority值相差大於等於11時,系統將在這兩個選項之間新增一條橫線進行分組
    [MenuItem("Tools/test1",false,2)]
    static void Test1()
    {
        Debug.Log("test1");
    }

    [MenuItem("Tools/test2",false,1)]
    static void Test2()
    {
        Debug.Log("test2");
    }

    [MenuItem("Tools/test3",false,13)]
    static void Test3()
    {
        Debug.Log("test3");
    }
}

3.Hierarchy和Project視窗的右鍵選單

Hierarchy視窗中右鍵的選單實際上是一些複製貼上等按鈕和GameObject目錄下第一類的按鈕的組合,因此將按鈕新增到GameObject選單下第一類按鈕中即可在Hierachy視窗中右鍵出這個按鈕。

Project視窗的右鍵選單實際上就是Assets目錄,因此將按鈕新增到Assets目錄下即可在Project視窗中右鍵出這個按鈕。

4.在元件的右鍵選單中新增按鈕

using UnityEditor;
using UnityEngine;

public class PlayerEditor
{
    //在元件上的右鍵選單中新增按鈕路徑引數為“CONTEXT/需要新增按鈕的元件名稱/按鈕目錄和名稱”
    [MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]
    static void InitHealthAndSpeed(MenuCommand command)
    {
        //在按下按鈕後,系統自動傳遞引數MenuCommand,物件的context屬性的內容就是當前元件
        CompleteProject.PlayerHealth health = command.context as CompleteProject.PlayerHealth;
        //獲取當前元件後,可以進行修改元件的變數等操作
        health.startingHealth = 10000;
        health.flashSpeed = 15;
    }
}

5.Selection獲取選擇的遊戲物體

using UnityEditor;
using UnityEngine;

public class PlayerEditor
{
    [MenuItem("Test/showInfo")]
    static void InitHealthAndSpeed()
    {
        Debug.Log(Selection.objects.Length);
    }
}

 

 6.按鈕快捷鍵

using UnityEditor;
using UnityEngine;

public class PlayerEditor
{
    //在路徑名稱後空格再指定快捷鍵,這裡指定快捷鍵是T
    //一些快捷鍵例子:_t ==> T
    //              %t ==> Ctrl+T
    //              #t ==> Shift+T
    //              &t ==> Alt+T
    [MenuItem("Test/showInfo _t")]
    static void InitHealthAndSpeed()
    {
        Debug.Log(Selection.objects.Length);
    }
}

7.按鈕的驗證方法

using UnityEditor;
using UnityEngine;

public class PlayerEditor
{
    //按鈕的驗證方法和按鈕方法的選單路徑一致,返回值為bool值,將MenuItem的第二個引數置為true代表這是一個按鈕的驗證方法
    //這個方法判斷選中的遊戲物體數,如果選中了任意遊戲物體才能點選按鈕;未選中游戲物體按鈕將變為不可點選狀態
    [MenuItem("Test/showInfo _t",true,11)]
    static bool InitHealthAndSpeedValidate()
    {
        if (Selection.objects.Length > 0)
            return true;
        else
            return false;
    }

    //日誌輸出選中的遊戲物體數目
    [MenuItem("Test/showInfo _t",false,11)]
    static void InitHealthAndSpeed()
    {
        Debug.Log(Selection.objects.Length);
    }
}

8.為元件新增按鈕的另一種方式

使用ContextMenu特性為元件新增按鈕,注意這個特性新增在一個具體的方法上方,代表按鈕觸發這個方法,而這個方法必須是要新增按鈕的指令碼內的方法,可以理解為直接在指令碼中定義按鈕。

        //為指令碼新增SetColor按鈕,按鈕觸發這個方法改變指令碼中flashColour的屬性值
        [ContextMenu("SetColor")]
        void SetColor()
        {
            flashColour = Color.blue;
        }

使用ContextMenuItem特性為指令碼的某個屬性新增按鈕,這個特性自然也就定義在需要新增按鈕的屬性上方,按鈕觸發的方法也定義在指令碼中。

        //這個特性代表為startingHealth屬性新增一個AddHP100按鈕,在屬性上右鍵即可看到這個按鈕,這個按鈕會觸發AddHP這個方法
        [ContextMenuItem("AddHP100","AddHP")]
        public int startingHealth = 100;
        void AddHP()
        {
            startingHealth += 100;
        }

二.新增和使用對話方塊

1.簡單新增對話方塊

首先建立一個按鈕用於彈出對話方塊。

using UnityEditor;
using UnityEngine;

public class PlayerEditor
{
    [MenuItem("Tools/CreateWizard")]
    static void CreateWizard()
    {
        //按下按鈕後彈出對話方塊,對話方塊的標題為“這是對話方塊”,對話方塊的內容由ShowDialog這個指令碼進行定義
        ScriptableWizard.DisplayWizard<ShowDialog>("這是對話方塊");
    }
}

然後定義對話方塊,對話方塊需要繼承自ScriptableWizard類。

using UnityEditor;

public class ShowDialog : ScriptableWizard
{
    public int changeHealthValue = 100;
}

最後儲存後在unity中點選按鈕就可以看到對話方塊了。

 

 注意:推薦將按鈕的程式碼寫在對話方塊的類中,結構會更加清晰,方便管理。

2.DisplayWizard方法的引數

using UnityEditor;

public class ShowDialog : ScriptableWizard
{
    [MenuItem("Tools/CreateWizard")]
    static void CreateWizard()
    {
        //兩個引數都是字串,第一個引數定義對話方塊的標題,第二個引數定義右下角確認提交按鈕的名稱,預設是Create
        ScriptableWizard.DisplayWizard<ShowDialog>("這是對話方塊","Change");
    }

    public int changeHealthValue = 100;

 

 3.在對話方塊確認提交後觸發OnWizardCreate方法

using UnityEditor;
using UnityEngine;

public class ShowDialog : ScriptableWizard
{
    [MenuItem("Tools/CreateWizard")]
    static void CreateWizard()
    {
        //兩個引數都是字串,第一個引數定義對話方塊的標題,第二個引數定義右下角確認提交按鈕的名稱,預設是Create
        ScriptableWizard.DisplayWizard<ShowDialog>("這是對話方塊","Change");
    }

    public int changeHealthValue = 100;

    //監測對話方塊確認提交按鈕,對話方塊確認提交後觸發
    private void OnWizardCreate()
    {
        GameObject[] gos = Selection.gameObjects;
        foreach(GameObject go in gos)
        {
            go.GetComponent<EnemyHealth>().startingHealth += changeHealthValue;
        }
    }
}

4.ScriptableWizard類中的其他Message

OnWizardUpdate方法:當開啟對話方塊或對話方塊中的值發生改變時觸發。

OnWizardOtherButton方法:當用戶點選others按鈕時觸發,這個按鈕可以通過DisplayWizard方法的第3個引數指定名稱,others按鈕不會關閉對話方塊。

 

三.使用EditorWindow類建立視窗

using UnityEngine;
using UnityEditor;

public class ShowWindow : EditorWindow
{
    [MenuItem("Window/show mywindow")]
    static void ShowMyWindow()
    {
        ShowWindow window = EditorWindow.GetWindow<ShowWindow>("MyWindow");
        window.Show();
    }

    private void OnGUI()
    {
        GUILayout.Label("我的視窗");
        GUILayout.TextField("");
        GUILayout.Button("建立");
    }
}