扩展顶部菜单栏
通过设置并添加 MenuItem
属性,我们可以在顶部主菜单栏中添加菜单项目。 MenuItem
属性可以把静态函数转化成菜单命令,只有静态函数可以使用 MenuItem
属性。作为一个最简单的例子,我们用菜单命令新建一个场景:
/*** MenuBarExtension/Assets/Tools/MenuItems/Editor/NewLevelScene.cs
*/
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
namespace MenuBarExtension.MenuItems {
public static class NewLevelScene {
[MenuItem ("Tools/Level/New Level Scene", false)]
private static void NewLevel () {
EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo ();
EditorSceneManager.NewScene (NewSceneSetup.EmptyScene);
}
}
}
Unity 编译完成后顶部菜单栏如下:
官方文档中给出 MenuItem
的用法:
public MenuItem(string itemName);
public MenuItem(string itemName, bool isValidateFunction);
public MenuItem(string itemName, bool isValidateFunction, int priority);
itemName
表示菜单命令路径的字符串,例如 "Tools/Level/New Level Scene"
。在字符串末尾增加用空格隔开的字符则可以设置快捷键,例如 _g
、%g
、#g
、&g
、#LEFT
依次表示 g
、ctrl
+ g
、shift
+ g
、alt
+ g
和左方向键。
isValidateFunction
表示是否是验证函数,取 false
时用法与只有一个参数的重载一样,取 true
时该函数为一个返回 bool
的验证函数,返回值为 false
时该菜单命令禁用。例如:
[MenuItem ("Tools/Level/Delete Selected Object #d", false)]
private static void DeleteSelected () {
Object.DestroyImmediate (Selection.activeGameObject);
}
[MenuItem ("Tools/Level/Delete Selected Object #d", true)]
private static bool ValidateDeleteSelected () {
return Selection.activeGameObject != null;
}
编译完成后,选中场景中的物体和未选中时顶部菜单栏依次为:
priority
代表该菜单命令的优先级, priority
取值小的优先级高,对应菜单命令将会显示在上方,两个优先级相差不超过 10 的命令会被分在一组,与相差超过 10 的其他命令用分割线分开: