選單項

選單項是向編輯器新增自定義操作的好方法。你可以將選單項新增到選單欄,將它們作為上下文單擊特定元件,或者甚至作為上下文單擊指令碼中的欄位。

以下是如何應用選單項的示例。

public class MenuItemsExample : MonoBehaviour {

    [MenuItem( "Example/DoSomething %#&d" )]
    private static void DoSomething() {
        // Execute some code
    }

    [MenuItem( "Example/DoAnotherThing", true )]
    private static bool DoAnotherThingValidator() {
        return Selection.gameObjects.Length > 0;
    }

    [MenuItem( "Example/DoAnotherThing _PGUP", false )]
    private static void DoAnotherThing() {
        // Execute some code
    }

    [MenuItem( "Example/DoOne %a", false, 1 )]
    private static void DoOne() {
        // Execute some code
    }

    [MenuItem( "Example/DoTwo #b", false, 2 )]
    private static void DoTwo() {
        // Execute some code
    }

    [MenuItem( "Example/DoFurther &c", false, 13 )]
    private static void DoFurther() {
        // Execute some code
    }

    [MenuItem( "CONTEXT/Camera/DoCameraThing" )]
    private static void DoCameraThing( MenuCommand cmd ) {
        // Execute some code
    }

    [ContextMenu( "ContextSomething" )]
    private void ContentSomething() {
        // Execute some code
    }

    [ContextMenuItem( "Reset", "ResetDate" )]
    [ContextMenuItem( "Set to Now", "SetDateToNow" )]
    public string Date = "";

    public void ResetDate() {
        Date = "";
    }

    public void SetDateToNow() {
        Date = DateTime.Now.ToString();
    }
}

看起來像這樣

StackOverflow 文件

我們來看看基本選單項。如下所示,你需要使用 MenuItem 屬性定義靜態函式,你可以將字串作為選單項的標題傳遞。你可以通過在名稱中新增/來將選單項設定為多個級別。

[MenuItem( "Example/DoSomething %#&d" )]
private static void DoSomething() {
    // Execute some code
}

你不能在頂層有一個選單項。你的選單項需要在子選單中!

MenuItem 名稱末尾的特殊字元用於快捷鍵,這些不是必需項。

你可以使用特殊字元作為快捷鍵,它們是:

  • % - Windows 上的 Ctrl,OS X 上的 Cmd
  • - 轉移

  • & - Alt

這意味著快捷方式 %#&d 代表 Windows 上的 ctrl + shift + alt + D,而 OS X 上代表 cmd + shift + alt + D.

如果你希望使用沒有任何特殊鍵的快捷方式,例如只需 D 鍵,則可以將_(下劃線)字元新增到你希望使用的快捷鍵中。

還支援一些其他特殊鍵,它們是:

  • 左,右,上,下 - 用於箭頭鍵
  • F1..F12 - 用於功能鍵
  • HOME,END,PGUP,PGDN - 用於導航鍵

快捷鍵需要與具有空格的任何其他文字分開

接下來是驗證器選單項。驗證器選單項允許在不滿足條件時禁用選單項(灰顯,不可點選)。這方面的一個示例可能是你的選單項作用於當前選擇的 GameObjects,你可以在驗證器選單項中檢查它們。

[MenuItem( "Example/DoAnotherThing", true )]
private static bool DoAnotherThingValidator() {
    return Selection.gameObjects.Length > 0;
}

[MenuItem( "Example/DoAnotherThing _PGUP", false )]
private static void DoAnotherThing() {
    // Execute some code
}

要使驗證器選單項起作用,你需要建立兩個靜態函式,這兩個函式都具有 MenuItem 屬性和相同的名稱(快捷鍵無關緊要)。它們之間的區別在於你通過傳遞布林引數將它們標記為驗證器函式。

你還可以通過新增優先順序來定義選單項的順序。優先順序由作為第三個引數傳遞的整數定義。數字越小,列表中的較高者,列表中較低的數字越大。你可以通過確保選單項的優先順序之間至少有 10 位數字,在兩個選單項之間新增分隔符。

[MenuItem( "Example/DoOne %a", false, 1 )]
private static void DoOne() {
    // Execute some code
}

[MenuItem( "Example/DoTwo #b", false, 2 )]
private static void DoTwo() {
    // Execute some code
}

[MenuItem( "Example/DoFurther &c", false, 13 )]
private static void DoFurther() {
    // Execute some code
}

如果你有一個選單列表,其中包含優先順序和非優先順序專案的組合,則非優先順序將與優先順序專案分開。

接下來是將選單項新增到現有元件的上下文選單中。你必須使用 CONTEXT(區分大小寫)啟動 MenuItem 的名稱,並使你的函式接受 MenuCommand 引數。

以下程式碼段將向 Camera 元件新增上下文選單項。

[MenuItem( "CONTEXT/Camera/DoCameraThing" )]
private static void DoCameraThing( MenuCommand cmd ) {
    // Execute some code
}

看起來像這樣

StackOverflow 文件

MenuCommand 引數使你可以訪問元件值以及隨之傳送的任何使用者資料。

你還可以使用 ContextMenu 屬性將上下文選單項新增到你自己的元件中。此屬性僅採用名稱,無驗證或優先順序,並且必須是非靜態方法的一部分。

[ContextMenu( "ContextSomething" )]
private void ContentSomething() {
    // Execute some code
}

看起來像這樣

StackOverflow 文件

你還可以將上下文選單項新增到你自己元件中的欄位。當你在上下文中單擊它們所屬的欄位時,將顯示這些選單項,並且可以執行你在該元件中定義的方法。這樣你就可以新增例如預設值或當前日期,如下所示。

[ContextMenuItem( "Reset", "ResetDate" )]
[ContextMenuItem( "Set to Now", "SetDateToNow" )]
public string Date = "";

public void ResetDate() {
    Date = "";
}

public void SetDateToNow() {
    Date = DateTime.Now.ToString();
}

看起來像這樣

StackOverflow 文件