1. 程式人生 > >Unity Editor 基礎篇(十三):MenuItem屬性

Unity Editor 基礎篇(十三):MenuItem屬性

MenuItem選單項 

MenuItem屬性允許你新增選單項到主選單和檢視面板上下文選單。 

(該屬性把任意靜態函式變為一個選單命令。僅靜態函式能使用這個MenuItem屬性。)

1.為Unity新增選單項

使用方法:

MenuItem(string itemName, bool isValidateFunction, int priority)

itemName:選單名稱路徑

isValidateFunction:不寫為false,true則點選選單前就會呼叫

priority:選單項顯示排序

第一個引數為選單路徑名稱,可新增選單快捷鍵:(空格後加如下符號設定) 


_w 單一的快捷鍵 W

#w shift+w

%w ctrl+w

&w Alt+w

例如:


[MenuItem("GameObject/caymanwindow #w")]

//這樣就可以自定義快捷鍵呼叫方法,相當於點選了選單項

第三個引數為優先順序,表示上下排列的順序,小的在上,不寫則預設為1000。

例如:

[MenuItem("EamTools/T1",false,1)]
    static void T1()
    {
 
    }
    [MenuItem("EamTools/T2",false,2)]
    static void T2()
    {
 
    }
    [MenuItem("EamTools/T3",false,0)]
    static void T3()
    {
 
    }
效果:順序受引數影響了

另外,如果相鄰的兩個的priority引數值相差>=11,則認為是不同組的,中間會有線分割顯示:

 [MenuItem("EamTools/T1",false,1)]
    static void T1()
    {
 
    }
    [MenuItem("EamTools/T2",false,12)]
    static void T2()
    {
 
    }
    [MenuItem("EamTools/T3",false,0)]
    static void T3()
    {
 
    }

第二個引數,預設為false,設為ture則擊選單前就會呼叫 如:檢測按鈕是否要顯示(要謝兩個方法,一個引數true控制按鈕顯示,一個引數false控制點選要做的事)

 [MenuItem("GameObject/caymanwindow", true)]   //用於判斷按鈕什麼時候顯示
    static bool ValidateSelection()
    {
        return Selection.activeGameObject != null;
    }
    [MenuItem("GameObject/caymanwindow", false)]   //點選按鈕要做的事
    static void Show()
    {
        Debug.Log("Show:"+Selection.activeGameObject.name);
    }

2.為元件新增選單項

1. 使用方法:

[MenuItem("CONTEXT/元件名/顯示方法名")]

這是個固定寫法。

把“元件名“對應的指令碼掛在物體上,則這個指令碼元件右擊後顯示的上下文裡便有了這樣的選單顯示。

如:

 [MenuItem("CONTEXT/Peoplr/InitMe")]
    static void InitMe()
    {
        Debug.Log("Init");
    }

有兩個變數:

context:上下文是一個選單命令的目標物件。獲取到的就是這個指令碼元件物件。

userData:傳遞自定義資訊到一個選單項的整數。

在點選選單呼叫的靜態方法中加入MenuCommand引數,點選時系統便會自動的傳入點選的指令碼物件選單進去:

 [MenuItem("CONTEXT/Peoplr/InitMe")]
    static void InitMe(MenuCommand cmd)
    {
        Peoplr po = cmd.context as Peoplr;
        po.a = 5;
        Debug.Log("Init");
    }

然後我們獲取到指令碼元件物件,修改公開變數的值,形成初始化。

2. 還有一種方法:ContextMenu內建屬性

注意事項:

1.必須是放在 Assets / Editor 資料夾下的類,且使用了 using UnityEditor  2.呼叫的函式必須是靜態函式(static)