1. 程式人生 > >Unity 編輯器擴充套件總結 一:編輯器開發入門

Unity 編輯器擴充套件總結 一:編輯器開發入門

編輯器擴充套件總結

工欲善其事必先利其器

引言: 在專案開發中,編輯器擴充套件為開發者提供了開發自定義工具的功能,讓開發者更加便利地使用編輯器開發專案。近期小生一直在學習編輯器擴充套件的知識,發現網路上關於編輯器知識點的部落格較為零散且混亂。當然,有一些大佬已經總結的很好了,小生這就算是狗尾續貂,主要目的為自我學習,近期會整理一系列編輯器相關的部落格,分享給每一位在學習道路上奮鬥的童鞋。如若部落格中存在錯誤,還請大佬們不吝賜教。所有參考的部落格或者視訊來源將在文末展示。
開發版本: Unity 2018.1.3f1

相關部落格傳送門
一、編輯器開發入門

二、Gizmos輔助除錯工具

三、編輯器的相關特性

四、自定義Inspector面板

五、陣列或list集合的顯示方式

文章目錄

編輯器開發入門

編輯器相關資料夾介紹

  1. Editor
  • 該資料夾可以放在專案的任何資料夾下,可以有多個"Editor"資料夾。
  • 編輯器擴充套件相關的指令碼都要放在該資料夾內,該資料夾中的指令碼只會對Unity編輯器起作用。
  • 專案打包的時候,不會被打包到專案中。如果編輯器相關指令碼不放在該資料夾中,打包專案可能會出錯。
  • 如果非要有些編輯器相關指令碼不放在該資料夾中,需要在該類的前後加上UNITY_EDITOR的巨集定義
  1. Editor Default Resources
  • 該資料夾需要放在Assets根目錄下,用來儲存編輯器所需要的圖片等資源,書寫的時候需要注意中間有空格隔開。此資料夾也不會被打包,訪問方法為:EditorGUIUtility.Load()
  • 當然,也可以在Editor資料夾內建立一個Resources資料夾,將相關資源放在該資料夾內,通過Resources.Load()獲取資源,也是可以的
  1. Gizmos
  • 該資料夾也需要放在Assets根目錄下,可以用來存放Gizmos.DrawIcon()的圖片資源

編輯器擴充套件的名稱空間:
Using UnityEditor

[MenuItem]

新增選單欄按鈕

[MenuItem(“MyTools/test1”,false,priority)]

  • 第一個引數用來表示選單的路徑;
  • 第二個引數用來判斷是否是有效函式,是否需要顯示;
  • 第三個引數priority是優先順序,用來表示選單按鈕的先後順序,預設值為1000。一般選單中的分欄,數值相差大於10。
  • 注意需要是靜態方法

    例如:[MenuItem(“MyTools/test1”)]
    也可以新增在Unity預設的選單欄中,例如新增到Window選單中,[MenuItem(“Window/test2”)],新增到Assets下,[MenuItem(“Assets/Project中的按鈕”)]

實現點選選單按鈕,刪除場景或者Project中選中的多個物件

[MenuItem("MyTool/DeleteAllObj", true)]
private static bool DeleteValidate()   
{
    if (Selection.objects.Length > 0)
        return true;
    else
        return false;
}

[MenuItem("MyTool/DeleteAllObj",false)]
private static void MyToolDelete()
{
    //Selection.objects 返回場景或者Project中選擇的多個物件
    foreach (Object item in Selection.objects)
    {
        //記錄刪除操作,允許撤銷
        Undo.DestroyObjectImmediate(item);
    }
} 

DeleteValidate方法是MyToolDelete方法的有效函式,所以第二個引數為true。該有效函式用來判斷當前是否選擇了物件,如果選擇了,返回true,才可以執行MyToolDelete方法。

新增快捷鍵

符號 字元
% Ctr/Command
# Shift
& Alt
LEFT/Right/UP/DOWN 方向鍵
F1-F2 F功能鍵
_g 字母g

例如:[MenuItem(“MyTools/test1 %_q”)] 快捷鍵 Ctrl+Q

CONTEXT

給某元件新增右鍵選單選項

[MenuItem(“CONTEXT/元件名/按鈕名”)]
注意CONTEXT大寫

[MenuItem("CONTEXT/Rigidbody/Init")]
private static void RigidbodyInit() 
{
    //TODO
}

MenuCommand

用於獲取當前操作的元件
如下,給自定義的元件PlayerHealth新增右鍵Init按鈕

[MenuItem("CONTEXT/PlayerHealth/Init")]
static void Init(MenuCommand cmd)
{
    PlayerHealth health = cmd.contex as PlayerHealth;
}

ContextMenu、ContextMenuItem

給某元件新增右邊小齒輪選單選項

[ContextMenu("FunctionName")]
public void FunctionName()
{
    //ToDo
}

給某屬性新增右鍵選單選項

[ContextMenuItem("Handle", "HandleHealth")]
public float health;

private void HandleHealth()
{
    //ToDo
}

P.S. 這兩個特性是在UnityEngine名稱空間下的,而不像其他[MenuItem]、Selection是在UnityEditor下的。

Selection

用於獲取選擇的遊戲物體

  • Selection.activeGameObject 返回第一個選擇的場景中的物件
  • Selection.gameObjects 返回場景中選擇的多個物件,包含預製體等
  • Selection.objects 返回選擇的多個物件
//遍歷選擇的物件,並立刻銷燬
foreach(object obj in Selection.objects)
{
    DestroyImmediate(obj);
}

P.S. Destroy方法會將刪除的物件放在快取中,快取滿了,才完全刪除,而在編輯器未執行的時候,是沒有這片快取的,所以需要用DestroyImmediate(),立刻銷燬。當然,可以直接使用Undo.DestroyObjectImmediate()來銷燬物件並記錄銷燬操作

參考資料

編輯器特殊資料夾及內建資源讀取

Unity編輯器小教程

MenuItem和ContextMenu的使用方法