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. 而下面的分界线依然存在
在这里插入图片描述

扫描二维码关注公众号,回复: 16145239 查看本文章

四、快捷键

可以为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下增加菜单

猜你喜欢

转载自blog.csdn.net/aaa27987/article/details/119755938