Unity拓展——菜单栏拓展

1. Unity菜单栏拓展

当我们打开Unity的时候,我们可以直接看到在整个软件视图的最上方,有一个菜单栏如下图所示:

《Unity拓展——菜单栏拓展》

实际上,除了默认给我们展示出来的,用户也可以自己根据自己的需要进行拓展。我们假设,要在现有拓展栏基础上,拓展出一个名为:MyFirstMenu的选项,下方有若干个复选项。该怎么做呢?

1.1 基础显示

首先,在Asset文件夹下(也就是整个工程文件的根节点下)创建一个Editor文件夹,在这个Editor文件夹下新建一个脚本,我们起名为:MyMenu.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

/// <summary>
/// Unity菜单栏扩展
/// </summary>
public class MyMenu : MonoBehaviour
{
    [MenuItem("MyFirstMenu/MenuTest1")]
    public static void MenuTest1()
    {
        Debug.Log("MenuTest1");
    }
}

这样我们,就在菜单栏拓展出来一个MyFirstMenu的选项,点击这个MyFirstMenu,下方就会有一个MenuTest1选项,点击这个MenuTest1,就会在Console面板输出“MenuTest1”。如下图所示:

《Unity拓展——菜单栏拓展》
《Unity拓展——菜单栏拓展》

不难看出,

当然了,我们也可以拓展出多个选项,比如说:在MyMenu.cs当中,我再写一个静态方法:

    [MenuItem("MyFirstMenu/MenuTest2")]
    public static void MenuTest2()
    {
        Debug.Log("MenuTest2");
    }

这样一来,我们拓展出来的菜单栏就会有两个选项:
《Unity拓展——菜单栏拓展》

单击这个MenuTest2,就会在Console面板输出:MenuTest2

1.2 验证函数

当然,现实情况不可能这么简单,比如说,我们单击Unity默认的GameObject菜单:

《Unity拓展——菜单栏拓展》

我们发现,除了默认开启的选项,还有许多默认关闭的选项,那么如何控制这些选项的开启和关闭呢?这个时候就需要验证函数了。当然了,Unity的MenuItem已经给我提供了接口,如下:

 public MenuItem(string itemName, bool isValidateFunction, int priority);

我们看到,他有三个参数,其中第二个参数,我们将其设置为true,就代表当前方法是一个验证函数。

下面,我们专门针对这个MenuTest2选项,写一个验证函数。

[MenuItem("MyFirstMenu/MenuTest2", true)]
private static bool MenuTestValidation1()
{
    return false;
}

这样我们就成功把MenuTest选项设置为默认关闭:

《Unity拓展——菜单栏拓展》

当然了,现实逻辑不可能这么简单,这里只是简单介绍一下原理。

1.3 设置快捷键

我们回到之前那个GameObject面板,我们看到有许多选项后面都有快捷键,比如说Create Empty的快捷键就是ctrl+shift+N。实际上,这个也可以由用户自定义。注意:如果一个函数一个选项有验证函数,那么要把快捷键设置写在验证函数当中,如果没有验证函数,那么写在设置的地方即可。

比如说,我们想给这个MenuTest2选项设置一个快捷键组合:Ctrl+9,那么我们只需在MenuItem的第一个参数后面打一个空格,然后写上相关设置即可:(当中的%9代表Ctrl+9)。这个时候,你按Ctrl+9,也会触发用户自定义的功能

[MenuItem("MyFirstMenu/MenuTest2 %9", true)]
private static bool MenuTestValidation1()
{
    return false;
}

在unity当中,快捷键大多数都是以alt,ctrl,shift这三个按键以及其他按键的相关组合构成。根据官网的说法,这些快捷按钮对应的符号如下:

% :(ctrl on Windows, cmd on macOS),

# :(shift),

& :(alt).

这就是%9代表Ctrl+9的原因。

1.4 调整菜单栏选项的顺序

那么,我们刚刚写的MenuTest1,MenuTest2能否调整顺序呢?答案是肯定的,这个时候就需要MenuItem的第三个参数了。调整这第三个参数的大小,就会调整这这些按钮显示的优先级。

如果我们写成如下这个样子:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

/// <summary>
/// Unity菜单栏扩展
/// </summary>
public class MyMenu : MonoBehaviour
{
    [MenuItem("MyFirstMenu/MenuTest1",false,2)]
    public static void MenuTest1()
    {
        Debug.Log("MenuTest1");
    }

    [MenuItem("MyFirstMenu/MenuTest2 %9",false,1)]
    public static void MenuTest2()
    {
        Debug.Log("MenuTest2");
    }

}

这个时候,MenuTest1,MenuTest2显示的顺序就会改变
《Unity拓展——菜单栏拓展》

这个时候,我们回到GameObject菜单观察一下,我们看到有的选项之间有横线相隔如下:
《Unity拓展——菜单栏拓展》

那么这个分割线又是怎么搞出来的呢?其实,只要你的优先级相差足够大,这个分割线就会显示出来。经测试,二者的优先级相差要超过10才行(正好为10都不可以)

[MenuItem("MyFirstMenu/MenuTest1",false,12)]
public static void MenuTest1()
{
    Debug.Log("MenuTest1");
}

[MenuItem("MyFirstMenu/MenuTest2 %9",false,1)]
public static void MenuTest2()
{
    Debug.Log("MenuTest2");
}

《Unity拓展——菜单栏拓展》

    原文作者:南方惆怅客
    原文地址: https://blog.csdn.net/johnny_love_1968/article/details/122146557
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞