1. 程式人生 > >拓展編輯器(十二)_Context選單

拓展編輯器(十二)_Context選單

  點選元件中設定(滑鼠右鍵),可以彈出Context選單,我們可以在原有選單中拓展出新的選單欄,程式碼如下所示:

using UnityEngine;
using UnityEditor;

public class Context選單 
{
    [MenuItem("CONTEXT/Transform/New Context 1")]
    public static void NewContext1(MenuCommand command)
    {
        //獲取物件名
        Debug.Log(command.context.name);
    }
    [MenuItem(
"CONTEXT/Transform/New Context 2")] public static void NewContext2(MenuCommand command) { Debug.Log(command.context.name); } }

  其中,[MenuItem("CONTEXT/Transform/New Context 1")]表示將新選單擴充套件在Transform元件上。如果想拓展在別的元件上,例如攝像機元件,直接修改字串中的Transform為Camera即可。如果想給所有元件都新增選單欄,這裡改成Compoment即可。程式碼效果如下:

  

  除此以外,以上的設定也可以應用在自己的寫的指令碼中。程式碼如下:

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class Context選單2 :MonoBehaviour
{
    public string contextName;
#if UNITY_EDITOR
    [MenuItem("CONTEXT/Context選單2/New Context 1")]
    public static void NewContext2(MenuCommand command)
    {
        Context選單2 script 
= (command.context as Context選單2); script.contextName = "hello world!"; } #endif }

  這段程式碼通過MenuCommand來獲取指令碼物件,從而訪問指令碼中的變數。同時使用了巨集定義標籤,其中UNITY_EDITOR標識這段程式碼只會在Editor模式下執行,釋出後將會被剔除掉。效果如下:

   

  當然,我們也可以在自己的指令碼中這樣寫。如果和系統中的選單名稱一樣,還可以覆蓋它。比如,這裡重寫了刪除元件的按鈕,這樣就可以執行自己的一些操作了:

[ContextMenu("Remove Comconent")]
    void RemoveComponent()
    {
        Debug.Log("RemoveComponent");
        //等一幀再刪除自己
        UnityEditor.EditorApplication.delayCall = delegate ()
          {
              DestroyImmediate(this);
          };
    }

  編輯模式下的程式碼同步時可能會有問題,比如上述DestroyImmediate(this)刪除自己的程式碼時,會觸發引擎底層的一個錯誤。不過我們可以使用UnityEditor.EditorApplication.delayCall來延遲一幀呼叫。如果大家在開發編輯器程式碼時發現類似問題,也可以嘗試延遲一幀再執行自己的程式碼。