UEDL1——自定义菜单栏拓展

本章代码关键字

1
2
[MenuItem()]            //为菜单栏、Hierarchy窗口(GameObject页签内)、Project窗口(Assets页签内)、以及某个脚本的右键菜单添加页签
[AddComponentMenu()] //添加代码添加页签,使脚本可以通过Component菜单中的选项添加脚本

特殊文件夹Editor

我们之前在学习Unity相关知识点时学习过,Editor文件夹是Unity中的特殊文件夹,
所有Unity中编辑器相关的脚本都需要放置在其中

我们在本套课程学习中,会频繁的使用到UnityEditor等命名空间,
这些使用了Unity编辑器相关命名空间的脚本最终是不能被打包出去的
我们需要把这些脚本放置到Editor文件夹中,避免打包时报错

Unity添加自定义页签

以前记录过该知识点:[MenuItem()]​,这里重新记录并扩充,无需再看旧记录

该特性可以为菜单栏、Hierarchy窗口(GameObject页签内)、Project窗口(Assets页签内)、以及某个脚本的右键菜单添加选项

在Unity菜单栏中添加自定义页签

命名空间:UnityEditor
特性:[MenuItem()]

用法:在静态函数前加上[MenuItem("页签/一级选项/二级选项/....")]
特性参数的格式:"菜单栏入口名/选项名/二级选项名/..."​,至少要有一个斜杠,否则报错!

作用:当在菜单栏点击该页签时,将执行静态函数中的逻辑

注意!该特性使用规则:

  • 规则一:一定是静态方法
  • 规则二:这个菜单栏按钮,必须有至少一个斜杠,不然会报错,斜杠必须是/​,它不支持只有一个菜单栏入口
  • 规则三:这个特性可以用在任意的类当中,不用在意继承对象
1
2
3
4
5
[MenuItem("菜单栏入口/选项/二级选项/三级选项/...")]
private static void Test()
{
Debug.Log("执行方法");
}

效果如下:image

点击后输出:image


[MenuItem()]​共有三个参数,分别如下:

  1. 路径:string​类型。用 '/'​来分割路径
  2. 是否是验证函数:bool​类型,默认为false​,如果是验证函数,则本函数需要返回bool值,返回结果将决定该选项是否可用
  3. 函数优先级:影响在面板上的出现顺序,默认为1000

关于参数二的验证函数:

第二个函数就是验证函数,其返回的bool​值将决定第一个方法出现的选项是否可以点击,如果不能选择,那么第一个函数也将无法执行

1
2
3
4
5
6
7
8
9
10
11
12
[MenuItem("菜单栏入口/选项", false, 1001)]
public static void Test()
{
Debug.Log("执行方法");
}

[MenuItem("菜单栏入口/选项", true, 1001)]
public static bool ValidateTest()
{
//如果有选中一个transform,那么返回true,否则返回false。它的返回值,决定了跟它同路径的第一个方法是否可点击。
return Selection.activeTransform != null;
}

在Hierarchy窗口中添加自定义页签

命名空间:UnityEditor
特性:[MenuItem("GameObject/...")]

用法:在静态函数前加上,并且页签命名放入GameObject路径,即:[MenuItem("GameObject/页签/一级选项/二级选项/....")]

注意:

  1. 不用在意继承对象
  2. 斜杠必须是'/'
  3. 在菜单栏的GameObject中也会出现对应选项
1
2
3
4
5
[MenuItem("GameObject/Lesson1/TestFun2")]
private static void TestFun2()
{
Debug.Log("TestFun2");
}

效果如下:image

点击后输出:image


在Project窗口中添加自定义页签

命名空间:UnityEditor
特性:[MenuItem("Assets/...")]

用法:在静态函数前加上,并且页签命名放入Assets路径,即[MenuItem("Assets/页签/一级选项/二级选项/....")]

注意:

  1. 不用在意继承对象
  2. 斜杠必须是'/'
  3. 在菜单栏的Assets中也会出现对应选项
1
2
3
4
5
[MenuItem("Assets/Lesson1/TestFun3")]
private static void TestFun3()
{
Debug.Log("TestFun3");
}

效果如下:image

点击后输出:image


在Inspector为脚本右键添加菜单

命名空间:UnityEditor
特性:[MenuItem("CONTEXT/...")]

它可以为某个继承MonoBehaviour​的脚本的右键菜单里添加功能

用法:在静态函数前加上:[MenuItem("CONTEXT/脚本名/页签/一级选项/二级选项/....")]

注意:

  1. 不用在意继承对象
  2. 斜杠必须是'/'
1
2
3
4
5
[MenuItem("CONTEXT/Lesson1_Test/Lesson1/自定义功能")]
private static void TestFun4()
{
Debug.Log("TestFun4");
}

效果如下:image

点击后输出:image


加入快捷键

对于[MenuItem()]​添加的页签,我们可以通过在页签参数后添加特定字符来添加快捷键,[AddComponentMenu()]​不可使用

单键:路径后 + 空格 + 下划线 + 想要的按键​,
例如,要添加F4快捷键,就需要添加 _F4​,因此:[MenuItem("Unity编辑器拓展/Lesson1/TestFun _F4")]

效果如下:image
按下F4就会直接执行这里的选项

组合键:下划线_​替换为

  • %​表示ctrl
  • #​表示shift
  • &​表示alt

以上三个按键可以单独配合其他键使用,也可以一起使用

例如,要添加Ctrl+Shift+Alt+A快捷键,就需要添加 %#&A​,因此:[MenuItem("Unity编辑器拓展/Lesson1/TestFun %#&A")]

效果如下:image

按下Ctrl+Shift+Alt+A就会直接执行这里的选项

其他支持的按键:
LEFT​、RIGHT​:类似于 #LEFT​是左shift之类的按键
UP​、DOWN​、F1..F12​、HOME​、END​、PGUP​、PGDN


在菜单栏的Component菜单添加脚本

命名空间:UnityEngine
特性:[AddComponentMenu()]

用法:在想要通过Component菜单添加的脚本前加上[AddComponentMenu("一级选项/二级选项/....")]

注意:

  1. 脚本需要继承MonoBehaviour​对象
  2. 斜杠必须是'/'
  3. 最后一级选项的名字可以和脚本名不一样,但是建议一致
  4. 该脚本属于UnityEngine​命名空间,因此添加该特性的类是可以被打包出去的
1
2
3
4
using UnityEngine;

[AddComponentMenu("Unity编辑器扩展/添加脚本/Lesson1_Test")]
public class Lesson1_Test : MonoBehaviour { }

效果如下:image

点击后对选中的游戏对象添加对应脚本:image