菜单项是向编辑器添加自定义操作的好方法。您可以将菜单项添加到菜单栏中,将它们作为对特定组件的上下文单击,甚至作为对脚本中字段的上下文单击。
下面是如何应用菜单项的示例。
public class MenuItemsExample : MonoBehaviour { [MenuItem( "Example/DoSomething %#&d" )] private static void DoSomething() { // 执行一些代码 } [MenuItem( "Example/DoAnotherThing", true )] private static bool DoAnotherThingValidator() { return Selection.gameObjects.Length > 0; } [MenuItem( "Example/DoAnotherThing _PGUP", false )] private static void DoAnotherThing() { // 执行一些代码 } [MenuItem( "Example/DoOne %a", false, 1 )] private static void DoOne() { // 执行一些代码 } [MenuItem( "Example/DoTwo #b", false, 2 )] private static void DoTwo() { // 执行一些代码 } [MenuItem( "Example/DoFurther &c", false, 13 )] private static void DoFurther() { // 执行一些代码 } [MenuItem( "CONTEXT/Camera/DoCameraThing" )] private static void DoCameraThing( MenuCommand cmd ) { // 执行一些代码 } [ContextMenu( "ContextSomething" )] private void ContentSomething() { // 执行一些代码 } [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() { // 执行一些代码 }
您不能在顶级菜单项。您的菜单项需要在子菜单中!
MenuItem 名称末尾的特殊字符用于快捷键,这些不是必需的。
您可以将一些特殊字符用作快捷键,它们是:
% - Windows 上的 Ctrl,OS X 上的 Cmd
# - 转移
& - Alt
这意味着快捷方式%#&d在 Windows 上代表 ctrl+shift+alt+D,在 OS X 上代表 cmd+shift+alt+D。
如果您希望使用没有任何特殊键的快捷键,例如仅使用 'D' 键,您可以在您希望使用的快捷键前添加 _(下划线)字符。
还有其他一些受支持的特殊键,它们是:
LEFT, RIGHT, UP, DOWN - 用于方向键
F1..F12 - 用于功能键
HOME、END、PGUP、PGDN - 用于导航键
快捷键需要与任何其他文本用空格隔开
接下来是验证器菜单项。验证器菜单项允许在不满足条件时禁用菜单项(变灰、不可点击)。一个例子可能是您的菜单项作用于当前选择的游戏对象,您可以在验证器菜单项中检查。
[MenuItem( "Example/DoAnotherThing", true )] private static bool DoAnotherThingValidator() { return Selection.gameObjects.Length > 0; } [MenuItem( "Example/DoAnotherThing _PGUP", false )] private static void DoAnotherThing() { // 执行一些代码 }
要使验证器菜单项起作用,您需要创建两个静态函数,它们都具有 MenuItem 属性和相同的名称(快捷键无关紧要)。它们之间的区别在于您是否通过传递布尔参数将它们标记为验证器函数。
您还可以通过添加优先级来定义菜单项的顺序。优先级由作为第三个参数传递的整数定义。列表中较高的数字越小,列表中较低的数字越大。通过确保菜单项的优先级之间至少有 10 位数字,您可以在两个菜单项之间添加分隔符。
[MenuItem( "Example/DoOne %a", false, 1 )] private static void DoOne() { // 执行一些代码 } [MenuItem( "Example/DoTwo #b", false, 2 )] private static void DoTwo() { // 执行一些代码 } [MenuItem( "Example/DoFurther &c", false, 13 )] private static void DoFurther() { // 执行一些代码 }
如果您的菜单列表包含优先和非优先项目的组合,则非优先项目将与优先项目分开。
接下来是将菜单项添加到现有组件的上下文菜单中。您必须以 CONTEXT(区分大小写)开头 MenuItem 的名称,并让您的函数接受 MenuCommand 参数。
以下代码段将向 Camera 组件添加一个上下文菜单项。
[MenuItem( "CONTEXT/Camera/DoCameraThing" )] private static void DoCameraThing( MenuCommand cmd ) { // 执行一些代码 }
看起来像这样
MenuCommand 参数使您可以访问组件值以及随它发送的任何用户数据。
您还可以使用 ContextMenu 属性将上下文菜单项添加到您自己的组件中。这个属性只需要一个名字,没有验证或优先级,并且必须是非静态方法的一部分。
[ContextMenu( "ContextSomething" )] private void ContentSomething() { // 执行一些代码 }
看起来像这样
您还可以将上下文菜单项添加到您自己组件中的字段。当您右键单击它们所属的字段时,这些菜单项将出现,并且可以执行您在该组件中定义的方法。通过这种方式,您可以添加例如默认值或当前日期,如下所示。
[ContextMenuItem( "Reset", "ResetDate" )] [ContextMenuItem( "Set to Now", "SetDateToNow" )] public string Date = ""; public void ResetDate() { Date = ""; } public void SetDateToNow() { Date = DateTime.Now.ToString(); }
看起来像这样