📕

扩展顶部菜单栏

通过设置并添加 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 依次表示 gctrl + gshift + galt + 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 的其他命令用分割线分开