擴展Unity的菜單MenuItem
MenuItem 屬性用於向主菜單和檢視面板上下文菜單添加菜單項。
該 MenuItem 屬性能夠將任何靜態函數轉變為菜單命令,僅靜態函數可使用 MenuItem 屬性
我的Unity版本:2019.3.7f1
創建菜單這幾種寫法都是可行
- 函數參數有MenuCommand (menuCommand.context是當前菜單選中的對象)
[MenuItem("GameObject/KSFramework/Custom Game Object", false, 10)]
static void CreateCustomGameObject(MenuCommand menuCommand)
{
GameObject go = new GameObject("Custom Game Object");
//把新創建的gameobject放在選中節點下
GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);
// Ctrl+Z可撤銷當前操作
Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
Selection.activeObject = go;
}
- 普通創建一個菜單
[MenuItem("GameObject/排在系統菜單前(-1)", false, -1)]
public static void GameObjectMenu1()
{
Debug.Log("hello");
}
菜單排序
使用MenuItem創建菜單時,最后一個字段就是菜單的排序
[MenuItem("GameObject/UI/Image/創建", false, 2001)]
static public void AddImage(MenuCommand menuCommand)
{
GameObject go = DefaultControls.CreateImage(GetStandardResources());
PlaceUIElementRoot(go, menuCommand);
var image = go.GetComponent<img>();
image.raycastTarget = false;
}
MenuItem函數定義
MenuItem(string path, bool isValidateFunction, int priority)
- path 在那個菜單上顯示的,如GameObject/UI/xx ,會在Hierchy的右鍵菜單中顯示
- isValidateFunction 當設置為true時,函數的返回值要為bool。另一個和它用MenuItem標記的相同路徑的方法在調用之前會調用它,根據返回值來驗證方法是否可執行,比如:開啟服務菜單只能點一次,點完之后置灰,需要關閉才能再點擊。
- Priority 菜單的排序
Unity內置菜單排序
Assets菜單的排序優先級
注意:不指定排序,也是在最后面,比如:[MenuItem("Assets/獲取size")]

Assets/Create菜單排序

GameObject菜單排序
GameObject菜單中優先級小於50的,也將出現在Hierarchy的右鍵菜單中

Window菜單排序

其它
自定義AddComponent名字
一般情況下,我們點AddComponent,然后輸入腳本的名字就可以附加上去,當然也可以自定義一個名字,比如
[AddComponentMenu("KSFramework/ActorBase")]
public class ActorBase : MonoBehaviour

參考資料
這篇文章非常詳細地講解了菜單項中的排序,包括Unity默認菜單的排序數值,本文的一些圖也是來源於這篇文章 《 Guide to Extending Unity Editor’s Menus》
