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("建立"); } }