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()
{
}
效果图
今天的文章unity编辑工具软件介绍_unitymodmanager怎么用[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/82358.html