Unity Editor自定义菜单排序(MenuItem Order)

扩展Unity的菜单MenuItem

MenuItem 属性用于向主菜单和检视面板上下文菜单添加菜单项。

该 MenuItem 属性能够将任何静态函数转变为菜单命令,仅静态函数可使用 MenuItem 属性

我的Unity版本:2019.3.7f1

创建菜单这几种写法都是可行

  1. 函数参数有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;
}
  1. 普通创建一个菜单
[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(string path, bool isValidateFunction, int priority)

- path 在那个菜单上显示的,如GameObject/UI/xx ,会在Hierchy的右键菜单中显示
- isValidateFunction 当设置为true时,函数的返回值要为bool。另一个和它用MenuItem标记的相同路径的方法在调用之前会调用它,根据返回值来验证方法是否可执行,比如:开启服务菜单只能点一次,点完之后置灰,需要关闭才能再点击。
- Priority 菜单的排序

Unity内置菜单排序

Assets菜单的排序优先级

注意:不指定排序,也是在最后面,比如:[MenuItem("Assets/获取size")]

Unity原生Assets菜单的排序优先级

Assets/Create菜单排序

Assets/Create菜单排序

GameObject菜单排序

GameObject菜单中优先级小于50的,也将出现在Hierarchy的右键菜单中

GameObject菜单排序

Window菜单排序

Window菜单排序

其它

自定义AddComponent名字

一般情况下,我们点AddComponent,然后输入脚本的名字就可以附加上去,当然也可以自定义一个名字,比如

[AddComponentMenu("KSFramework/ActorBase")]
public class ActorBase : MonoBehaviour

自定义AddComponent名字

参考资料

这篇文章非常详细地讲解了菜单项中的排序,包括Unity默认菜单的排序数值,本文的一些图也是来源于这篇文章 《 Guide to Extending Unity Editor’s Menus

posted @ 2021-06-01 15:39  赵青青  阅读(1507)  评论(0编辑  收藏  举报