選單項
選單項是向編輯器新增自定義操作的好方法。你可以將選單項新增到選單欄,將它們作為上下文單擊特定元件,或者甚至作為上下文單擊指令碼中的欄位。
以下是如何應用選單項的示例。
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();
}
}
看起來像這樣
我們來看看基本選單項。如下所示,你需要使用 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
}
看起來像這樣
MenuCommand 引數使你可以訪問元件值以及隨之傳送的任何使用者資料。
你還可以使用 ContextMenu 屬性將上下文選單項新增到你自己的元件中。此屬性僅採用名稱,無驗證或優先順序,並且必須是非靜態方法的一部分。
[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();
}
看起來像這樣