Unity编辑器开发(二)——拓展子菜单

个人学习笔记,如有错误、疑问,欢迎留言。
声明:本文不得以任何形式进行转载


文章目录

  • 一、顶部菜单栏拓展
    • 1.1 顶部菜单栏拓展子菜单项
    • 1.2 在顶部菜单栏新建一级子菜单
    • 1.3 MenuItem属性
    • 1.4 带快捷键的菜单项
    • 1.5 带选中状态的菜单项
  • 二、拓展Assets右键菜单
  • 三、拓展Inspector面板
    • 3.1 拓展Inspector面板右键组件菜单栏
  • 四、拓展Hierarchy面板
    • 4.1 拓展Hierarchy面板右键组件菜单栏


准备工作:
 在项目的Assets目录下新建Editor文件夹,在其中创建C#脚本。
 在新建的脚本中引用命名空间UnityEditor

using UnityEditor; //拓展脚本需引用UnityEditor

  注:Editor文件夹可以创建在任何目录下,也可以创建多个Editor文件夹,只需文件夹名为Editor即可。


一、顶部菜单栏拓展

1.1 顶部菜单栏拓展子菜单项

[MenuItem("Tools/Test1")] //在顶部菜单栏中的Tools菜单中添加了一个Test1子菜单项
static void Test1() //Test1的点击事件方法(点击事件方法必须为静态方法)
{
    Debug.Log("点击Test1");
}

在这里插入图片描述
 上方代码的功能:在顶部菜单栏的Tools菜单中添加了一个名为Test1的子菜单项,并设置Test1的点击事件方法为下方的Test1方法。
  注意事项:点击事件方法必须是静态方法。


1.2 在顶部菜单栏新建一级子菜单

//新建一级菜单
[MenuItem("MyTools/Test2")] //在菜单栏新建一级菜单MyTools,里面有一个菜单项Test2
static void Test2()
{
 
}

在这里插入图片描述
注意事项:不能新建一个空的一级菜单,新建的一级菜单里面必须有子菜单项,也就是说,下面的代码是错误的。

[MenuItem("MyTools")]
//此代码是错误的,在菜单栏新建一级菜单必须包含一个子菜单项,不能只建一个一级菜单

1.3 MenuItem属性

 在上面的例子中,使用到了MenuItem属性给顶部菜单栏添加菜单项,那么这个属性的含义是什么呢?
 下面是MenuItem的三个构造方法:

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

参数:
ItemName :菜单项的名称
isValidateFunctionbool类型,默认值为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;
    }
}

 在上面的这段代码中,有两个函数function1function2,它们都是对应MyTools/Tool这个菜单项的,但是它们的作用却不同。
function1isValidateFunction参数是false,那么代表function1不是MyTools/Tool的验证函数,它是MyTools/Tool的点击事件函数,当菜单被点击时,输出click。
 但function2isValidateFunction参数是true,那么代表function2MyTools/Tool的一个验证函数,用于验证当前MyTools/Tool能否被点击。当它返回true时,MyTools/Tool可以被点击;当它返回false时,MyTools/Tool为灰色不能被点击。
 演示如下:
Unity编辑器开发(二)——拓展子菜单_第1张图片
Unity编辑器开发(二)——拓展子菜单_第2张图片
priority排序的规则:如果两个菜单项本身在同一级下(路径在同一母菜单下),根据priority大小排序(priority越大越在下面,priority越小越在上面),如果相邻的两个菜单项的priority相差大于10,它们之间会有一个横线分隔开。


1.4 带快捷键的菜单项

[MenuItem("Tools/Test3 %#PGUP")] //在菜单项后设置快捷键(用空格将菜单项名称和快捷键隔开)
static void Test3()
{
    Debug.Log("点击Test3");
}

注意事项:菜单项的名称快捷键中需用一个空格隔开
快捷键对应关系如下:
键盘上的键 | 代码对应的键

  • | -
    单个字符(比如a) | _a(加一个_前缀)
    Windows的Ctrl
    macOS的Command键 | %
    Shift | #
    Alt | &
    F1~F12键 | F1~F12
    方向键 | LEFT/RIGHT/UP/DOWN(需全部大写)
    Home/End/PageUp/PageDown键 | HOME/END/PGUP/PGDN(需全部大写)

示例:
_a对应a
%a对应Ctrl+a
%#a对应Ctrl+Alt+a
%PGUP对应Ctrl+PageUp


1.5 带选中状态的菜单项

[MenuItem("MyTools/Test4")]
static void Test4()
{
    string path = "MyTools/Test4"; //菜单路径
    bool beChosen =  Menu.GetChecked(path); //获取菜单的选中状态
    Menu.SetChecked(path, !beChosen); //设置新的选中状态
}

Unity编辑器开发(二)——拓展子菜单_第3张图片


二、拓展Assets右键菜单

 与拓展顶部菜单栏基本一致,只是路径不同(在Assets路径下),MenuItem参数、MenuItem构造方法与顶部菜单栏拓展一样,也同样可以实现选中状态和快捷键。

[MenuItem("Assets/Test5", false, 1)]
static void Test5()
{
        
}

Unity编辑器开发(二)——拓展子菜单_第4张图片


三、拓展Inspector面板

3.1 拓展Inspector面板右键组件菜单栏

 与拓展顶部菜单栏基本一致,只是路径不同(在CONTEXT路径下),MenuItem参数、MenuItem构造方法与顶部菜单栏拓展一样,也同样可以实现选中状态和快捷键。

[MenuItem("CONTEXT/Light/Light组件拓展")] //在Light组件的菜单栏中添加一个子菜单项拓展
static void LightPlugin()
{
    Debug.Log("Light Plugin");
}

Unity编辑器开发(二)——拓展子菜单_第5张图片


四、拓展Hierarchy面板

4.1 拓展Hierarchy面板右键组件菜单栏

 与拓展顶部菜单栏基本一致,只是路径不同(在GameObject路径下),MenuItem参数、MenuItem构造方法与顶部菜单栏拓展一样,但不可以实现快捷键和选中状态

[MenuItem("GameObject/Test", false, 1)] //在Hierarchy界面右键菜单拓展一个Test菜单项
static void Test()
{
    Debug.Log("Test");
}

Unity编辑器开发(二)——拓展子菜单_第6张图片

你可能感兴趣的:(Unity编辑器开发,c#,unity,编辑器,游戏引擎)