1. 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”。如下图所示:
不难看出,
当然了,我们也可以拓展出多个选项,比如说:在MyMenu.cs当中,我再写一个静态方法:
[MenuItem("MyFirstMenu/MenuTest2")]
public static void MenuTest2()
{
Debug.Log("MenuTest2");
}
这样一来,我们拓展出来的菜单栏就会有两个选项:
单击这个MenuTest2,就会在Console面板输出:MenuTest2
1.2 验证函数
当然,现实情况不可能这么简单,比如说,我们单击Unity默认的GameObject菜单:
我们发现,除了默认开启的选项,还有许多默认关闭的选项,那么如何控制这些选项的开启和关闭呢?这个时候就需要验证函数了。当然了,Unity的MenuItem已经给我提供了接口,如下:
public MenuItem(string itemName, bool isValidateFunction, int priority);
我们看到,他有三个参数,其中第二个参数,我们将其设置为true,就代表当前方法是一个验证函数。
下面,我们专门针对这个MenuTest2选项,写一个验证函数。
[MenuItem("MyFirstMenu/MenuTest2", true)]
private static bool MenuTestValidation1()
{
return false;
}
这样我们就成功把MenuTest选项设置为默认关闭:
当然了,现实逻辑不可能这么简单,这里只是简单介绍一下原理。
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显示的顺序就会改变
这个时候,我们回到GameObject菜单观察一下,我们看到有的选项之间有横线相隔如下:
那么这个分割线又是怎么搞出来的呢?其实,只要你的优先级相差足够大,这个分割线就会显示出来。经测试,二者的优先级相差要超过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");
}