个人学习笔记,如有错误、疑问,欢迎留言。
声明:本文不得以任何形式进行转载
准备工作:
在项目的Assets
目录下新建Editor
文件夹,在其中创建C#
脚本。
在新建的脚本中引用命名空间UnityEditor
。
using UnityEditor; //拓展脚本需引用UnityEditor
注:Editor
文件夹可以创建在任何目录下,也可以创建多个Editor
文件夹,只需文件夹名为Editor
即可。
[MenuItem("Tools/Test1")] //在顶部菜单栏中的Tools菜单中添加了一个Test1子菜单项
static void Test1() //Test1的点击事件方法(点击事件方法必须为静态方法)
{
Debug.Log("点击Test1");
}
上方代码的功能:在顶部菜单栏的Tools
菜单中添加了一个名为Test1
的子菜单项,并设置Test1的点击事件方法
为下方的Test1
方法。
注意事项:点击事件方法必须是静态方法。
//新建一级菜单
[MenuItem("MyTools/Test2")] //在菜单栏新建一级菜单MyTools,里面有一个菜单项Test2
static void Test2()
{
}
注意事项:不能新建一个空的一级菜单
,新建的一级菜单里面必须有子菜单项
,也就是说,下面的代码是错误的。
[MenuItem("MyTools")]
//此代码是错误的,在菜单栏新建一级菜单必须包含一个子菜单项,不能只建一个一级菜单
在上面的例子中,使用到了MenuItem
属性给顶部菜单栏添加菜单项,那么这个属性的含义是什么呢?
下面是MenuItem
的三个构造方法:
public MenuItem(string itemName);
public MenuItem(string itemName, bool isValidateFunction);
public MenuItem(string itemName, bool isValidateFunction, int priority);
参数:
ItemName :菜单项的名称
isValidateFunction :bool
类型,默认值为false
,用于验证下面的函数是否是验证函数(作用见后文)
priority :菜单项的排序权重,默认值是1000
isValidateFunction
的作用:用于标记下面的函数是否是验证函数
public class EditorPlugin
{
[MenuItem("MyTools/Tool", false, 1)]
static void function1(){
Debug.Log("click");
}
[MenuItem("MyTools/Tool", true, 1)]
static bool function2(){
return true;
}
}
在上面的这段代码中,有两个函数function1
和function2
,它们都是对应MyTools/Tool
这个菜单项的,但是它们的作用却不同。
function1
的isValidateFunction
参数是false
,那么代表function1
不是MyTools/Tool
的验证函数,它是MyTools/Tool
的点击事件函数,当菜单被点击时,输出click。
但function2
的isValidateFunction
参数是true
,那么代表function2
是MyTools/Tool
的一个验证函数,用于验证当前MyTools/Tool
能否被点击。当它返回true
时,MyTools/Tool
可以被点击;当它返回false
时,MyTools/Tool
为灰色不能被点击。
演示如下:
priority排序的规则:如果两个菜单项本身在同一级下(路径在同一母菜单下),根据priority
大小排序(priority
越大越在下面,priority
越小越在上面),如果相邻的两个菜单项的priority
相差大于10
,它们之间会有一个横线分隔开。
[MenuItem("Tools/Test3 %#PGUP")] //在菜单项后设置快捷键(用空格将菜单项名称和快捷键隔开)
static void Test3()
{
Debug.Log("点击Test3");
}
注意事项:菜单项的名称
和快捷键
中需用一个空格
隔开
快捷键对应关系如下:
键盘上的键 | 代码对应的键
_
前缀) 示例:
_a
对应a
%a
对应Ctrl
+a
%#a
对应Ctrl
+Alt
+a
%PGUP
对应Ctrl
+PageUp
[MenuItem("MyTools/Test4")]
static void Test4()
{
string path = "MyTools/Test4"; //菜单路径
bool beChosen = Menu.GetChecked(path); //获取菜单的选中状态
Menu.SetChecked(path, !beChosen); //设置新的选中状态
}
与拓展顶部菜单栏基本一致,只是路径不同(在Assets
路径下),MenuItem
参数、MenuItem
构造方法与顶部菜单栏拓展一样,也同样可以实现选中状态和快捷键。
[MenuItem("Assets/Test5", false, 1)]
static void Test5()
{
}
与拓展顶部菜单栏基本一致,只是路径不同(在CONTEXT
路径下),MenuItem
参数、MenuItem
构造方法与顶部菜单栏拓展一样,也同样可以实现选中状态和快捷键。
[MenuItem("CONTEXT/Light/Light组件拓展")] //在Light组件的菜单栏中添加一个子菜单项拓展
static void LightPlugin()
{
Debug.Log("Light Plugin");
}
与拓展顶部菜单栏基本一致,只是路径不同(在GameObject
路径下),MenuItem
参数、MenuItem
构造方法与顶部菜单栏拓展一样,但不可以实现快捷键和选中状态。
[MenuItem("GameObject/Test", false, 1)] //在Hierarchy界面右键菜单拓展一个Test菜单项
static void Test()
{
Debug.Log("Test");
}