菜单项

菜单项是向编辑器添加自定义操作的好方法。你可以将菜单项添加到菜单栏,将它们作为上下文单击特定组件,或者甚至作为上下文单击脚本中的字段。

以下是如何应用菜单项的示例。

public class MenuItemsExample : MonoBehaviour {

    [MenuItem( "Example/DoSomething %#&d" )]
    private static void DoSomething() {
        // Execute some code
    }

    [MenuItem( "Example/DoAnotherThing", true )]
    private static bool DoAnotherThingValidator() {
        return Selection.gameObjects.Length > 0;
    }

    [MenuItem( "Example/DoAnotherThing _PGUP", false )]
    private static void DoAnotherThing() {
        // Execute some code
    }

    [MenuItem( "Example/DoOne %a", false, 1 )]
    private static void DoOne() {
        // Execute some code
    }

    [MenuItem( "Example/DoTwo #b", false, 2 )]
    private static void DoTwo() {
        // Execute some code
    }

    [MenuItem( "Example/DoFurther &c", false, 13 )]
    private static void DoFurther() {
        // Execute some code
    }

    [MenuItem( "CONTEXT/Camera/DoCameraThing" )]
    private static void DoCameraThing( MenuCommand cmd ) {
        // Execute some code
    }

    [ContextMenu( "ContextSomething" )]
    private void ContentSomething() {
        // Execute some code
    }

    [ContextMenuItem( "Reset", "ResetDate" )]
    [ContextMenuItem( "Set to Now", "SetDateToNow" )]
    public string Date = "";

    public void ResetDate() {
        Date = "";
    }

    public void SetDateToNow() {
        Date = DateTime.Now.ToString();
    }
}

看起来像这样

StackOverflow 文档

我们来看看基本菜单项。如下所示,你需要使用 MenuItem 属性定义静态函数,你可以将字符串作为菜单项的标题传递。你可以通过在名称中添加/来将菜单项设置为多个级别。

[MenuItem( "Example/DoSomething %#&d" )]
private static void DoSomething() {
    // Execute some code
}

你不能在顶层有一个菜单项。你的菜单项需要在子菜单中!

MenuItem 名称末尾的特殊字符用于快捷键,这些不是必需项。

你可以使用特殊字符作为快捷键,它们是:

  • % - Windows 上的 Ctrl,OS X 上的 Cmd
  • - 转移

  • & - Alt

这意味着快捷方式 %#&d 代表 Windows 上的 ctrl + shift + alt + D,而 OS X 上代表 cmd + shift + alt + D.

如果你希望使用没有任何特殊键的快捷方式,例如只需 D 键,则可以将_(下划线)字符添加到你希望使用的快捷键中。

还支持一些其他特殊键,它们是:

  • 左,右,上,下 - 用于箭头键
  • F1..F12 - 用于功能键
  • HOME,END,PGUP,PGDN - 用于导航键

快捷键需要与具有空格的任何其他文本分开

接下来是验证器菜单项。验证器菜单项允许在不满足条件时禁用菜单项(灰显,不可点击)。这方面的一个示例可能是你的菜单项作用于当前选择的 GameObjects,你可以在验证器菜单项中检查它们。

[MenuItem( "Example/DoAnotherThing", true )]
private static bool DoAnotherThingValidator() {
    return Selection.gameObjects.Length > 0;
}

[MenuItem( "Example/DoAnotherThing _PGUP", false )]
private static void DoAnotherThing() {
    // Execute some code
}

要使验证器菜单项起作用,你需要创建两个静态函数,这两个函数都具有 MenuItem 属性和相同的名称(快捷键无关紧要)。它们之间的区别在于你通过传递布尔参数将它们标记为验证器函数。

你还可以通过添加优先级来定义菜单项的顺序。优先级由作为第三个参数传递的整数定义。数字越小,列表中的较高者,列表中较低的数字越大。你可以通过确保菜单项的优先级之间至少有 10 位数字,在两个菜单项之间添加分隔符。

[MenuItem( "Example/DoOne %a", false, 1 )]
private static void DoOne() {
    // Execute some code
}

[MenuItem( "Example/DoTwo #b", false, 2 )]
private static void DoTwo() {
    // Execute some code
}

[MenuItem( "Example/DoFurther &c", false, 13 )]
private static void DoFurther() {
    // Execute some code
}

如果你有一个菜单列表,其中包含优先级和非优先级项目的组合,则非优先级将与优先级项目分开。

接下来是将菜单项添加到现有组件的上下文菜单中。你必须使用 CONTEXT(区分大小写)启动 MenuItem 的名称,并使你的函数接受 MenuCommand 参数。

以下代码段将向 Camera 组件添加上下文菜单项。

[MenuItem( "CONTEXT/Camera/DoCameraThing" )]
private static void DoCameraThing( MenuCommand cmd ) {
    // Execute some code
}

看起来像这样

StackOverflow 文档

MenuCommand 参数使你可以访问组件值以及随之发送的任何用户数据。

你还可以使用 ContextMenu 属性将上下文菜单项添加到你自己的组件中。此属性仅采用名称,无验证或优先级,并且必须是非静态方法的一部分。

[ContextMenu( "ContextSomething" )]
private void ContentSomething() {
    // Execute some code
}

看起来像这样

StackOverflow 文档

你还可以将上下文菜单项添加到你自己组件中的字段。当你在上下文中单击它们所属的字段时,将显示这些菜单项,并且可以执行你在该组件中定义的方法。这样你就可以添加例如默认值或当前日期,如下所示。

[ContextMenuItem( "Reset", "ResetDate" )]
[ContextMenuItem( "Set to Now", "SetDateToNow" )]
public string Date = "";

public void ResetDate() {
    Date = "";
}

public void SetDateToNow() {
    Date = DateTime.Now.ToString();
}

看起来像这样

StackOverflow 文档