Unity编辑器拓展(一)-MenuItem的使用

一、参数介绍

MenuItem是一个特性,修饰静态方法,可以在Unity顶部菜单出现相应的按钮。

MenuItem有三个参数,分别如下: 
	1:路径: string 类型。用 ‘/’ 来分割路径
	2:是否是验证函数:bool 类型,默认为false
	3:函数优先级:影响在面板上的出现顺序,默认为1000

举例

        [MenuItem("Learn/Log1",false,1000)]
        public static void Log1()
        {
            Debug.Log("1");
        }

效果如下
在这里插入图片描述

二、验证函数

MenuItem的第2个参数是一个bool值,用于验证这个函数是否启用。究竟怎么使用呢,看下面的例子就明白了。

       [MenuItem("Learn/Log2",false,1001)]
        public static void Log2()
        {
            Debug.Log("2");
        }
        
        
        [MenuItem("Learn/Log2",true,1001)]
        public static bool ValidateLog2()
        {
            return Selection.activeTransform != null;
        }

解释:这里第2个方法是对第1个方法的验证, 如果有选中一个transform,那么返回true;否则返回false。它的返回值,决定了跟它同路径的第一个方法是否可点击。

如图:
什么都不选中(注意看右侧的Hierarchy面板),不可点击
在这里插入图片描述
有选中一个物体,可以点击
在这里插入图片描述
注意:一个方法和它的验证方法的第一个参数,也就是路径,必须是一样的,这样两个方法才会关联起来。并且验证方法的第2个参数填true,返回值为bool类型。

三、优先级

第3个参数:优先级,主要影响菜单出现的先后顺序,不填默认是1000. 值越小,出现在越上层的位置。

        [MenuItem("Learn/Log",false)]
        public static void Log()
        {
            
        }
        
        [MenuItem("Learn/Log1",false,999)]
        public static void Log1()
        {
            
        }
        
        [MenuItem("Learn/Log2",false,1001)]
        public static void Log2()
        {
            
        }

效果如预想的一样。默认的在中间,Log1在上面,Log2在下面
在这里插入图片描述
此外,当一个菜单的优先级 - 它上一个菜单的优先级 >= 11,菜单之间还能看到分界线

        [MenuItem("Learn/Log",false,1)]
        public static void Log()
        {
            
        }
        
        [MenuItem("Learn/Log2",false,12)]
        public static void Log2()
        {
            
        }
        
        
        [MenuItem("Learn/Log3",false,23)]
        public static void Log3()
        {
            
        }

效果如图
在这里插入图片描述
为了验证这个说法,我们在Log(优先级1)和Log2(优先级12)之间插入一个Log1.5(优先级2),看看分界线是否消失

        
        [MenuItem("Learn/Log",false,1)]
        public static void Log()
        {
            
        }
        
        [MenuItem("Learn/Log1.5",false,2)]
        public static void Log15()
        {
            
        }
        
        [MenuItem("Learn/Log2",false,12)]
        public static void Log2()
        {
            
        }
        
        
        [MenuItem("Learn/Log3",false,23)]
        public static void Log3()
        {
            
        }

效果图如下
可以看到1和12之间的分界线消失了,因为中间多了个2. 而下面的分界线依然存在
在这里插入图片描述

四、快捷键

可以为MenuItem可以添加快捷键。
ctrl,shift,alt 都有对应的字符,比如表示shift键的字符是#。
那么快捷键shift + q,可以写成 #q。

代码如下

        //注意:路径和快捷键之间有个空格
        [MenuItem("Learn/Log #q",false)]
        public static void Log()
        {
            Debug.Log(1);
        }

效果图如下,可以看到快捷键已经显示出来了。
在这里插入图片描述
如果你想直接按一个键就触发,不想多按ctrl/shift/alt,那么可以用 ‘_’来表示。比如你想按F1就触发
,那么可以写成 _F1
代码如下

        //注意:路径和快捷键之间有个空格
        [MenuItem("Learn/Log %q",false)]
        public static void Log()
        {
            Debug.Log(1);
        }
        
        [MenuItem("Learn/Log2 _F1",false)]
        public static void Log2()
        {
            Debug.Log(2);
        }

效果图如下
在这里插入图片描述
最后附上常用的快捷键对应表

快捷键对应字符
ctrl%
shift#
alt&
单一字符_
ctrl + shift%#

五、在Hierarchy层级窗口增加右键菜单

MenuItem还可以增加到右键菜单里面。其实用法和上面差不多,但有两个要求。

  • MenuItem(“GameObject/xxxx”,false,0)命名时,名字必须以GameObject/开头
  • 优先级必须在 负无穷 ~ 49 之间。
    哈,一开始没有指定优先级,然后一直没有出现在右键菜单里。以为不起作用,后来发现是对优先级有点讲究。于是测试了一下下面的优先级。得出结论优先级需要 <= 49
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class LearnMenuItem
{
    [MenuItem("GameObject/自定义菜单 空",false)]
    public static void CustomMenu_Empty()
    {
           
    }
    [MenuItem("GameObject/自定义菜单 -1000",false,-1000)]
    public static void CustomMenu_f1000()
    {
           
    }
    
    [MenuItem("GameObject/自定义菜单 -101",false,-101)]
    public static void CustomMenu_f101()
    {
           
    }
    
    [MenuItem("GameObject/自定义菜单 -100",false,-100)]
    public static void CustomMenu_f100()
    {
           
    }
        
    [MenuItem("GameObject/自定义菜单 -10",false,-10)]
    public static void CustomMenu_f10()
    {
           
    }
        
    [MenuItem("GameObject/自定义菜单 0",false,0)]
    public static void CustomMenu_0()
    {
           
    }
        
    [MenuItem("GameObject/自定义菜单 10",false,10)]
    public static void CustomMenu_10()
    {
           
    }

    [MenuItem("GameObject/自定义菜单 49",false,49)]
    public static void CustomMenu_49()
    {
           
    }
    
    [MenuItem("GameObject/自定义菜单 50",false,50)]
    public static void CustomMenu_50()
    {
           
    }
    
    [MenuItem("GameObject/自定义菜单 100",false,100)]
    public static void CustomMenu_100()
    {
           
    }
 
}

测试结果
优先级测试
发现优先级在 负数~49 之间可以显示出来。不指定,或指定了其他的优先级不会显示出来。

六、在Assets资源窗口增加右键菜单

Hierarchy下是一些物体的实例。Assets管理的是静态资源。在Assets下增加右键菜单和Hierarchy差不多,但没有优先级要求,默认不填也可以。只需要满足下面这个条件

  • [MenuItem(“Assets/自定义菜单_Assets”)] 命名时,以Assets/开头
    [MenuItem("Assets/自定义菜单_Assets")]
    public static void CustomMenu_Assets()
    {
           
    }

效果图
在Assets下增加菜单

  • 34
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity编辑器拓展(Editor Extension)可以通过自定义的脚本来扩展Unity编辑器的功能和界面,以满足特定项目的需求。通过编辑器拓展,开发者可以创建自定义的编辑器窗口、工具栏按钮、菜单项、检视面板等,来增强Unity编辑器的功能和流程。 要创建一个Unity编辑器拓展,你可以使用C#编写一个继承自Editor类的脚本。这个脚本可以通过Unity的Inspector面板来设置相关的属性和行为。以下是一个简单的示例: ```csharp using UnityEngine; using UnityEditor; public class MyEditorExtension : EditorWindow { [MenuItem("Custom Tools/My Editor Window")] public static void OpenWindow() { // 创建并打开一个自定义的编辑器窗口 MyEditorExtension window = (MyEditorExtension)EditorWindow.GetWindow(typeof(MyEditorExtension)); window.Show(); } private void OnGUI() { // 在编辑器窗口中绘制UI元素 GUILayout.Label("Hello, I am a custom editor window!"); if (GUILayout.Button("Click Me")) { Debug.Log("Button clicked!"); } } } ``` 上述代码创建了一个自定义的编辑器窗口,并在窗口中绘制了一个标签和一个按钮。通过在Unity编辑器中点击"Custom Tools"菜单下的"My Editor Window",可以打开这个自定义的编辑器窗口。 除了编辑器窗口,你还可以通过继承Editor类来创建自定义的检视面板、菜单项等。Unity官方文档中有更详细的教程和示例,可以帮助你更深入地了解和使用Unity编辑器拓展

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值