环境:Unity2017.2 语言:C#
总起:
菜单栏的扩展,这边主要讨论4个常用窗口的菜单栏:
1.整个Unity编辑器顶头的菜单栏;
2.Inspector挂Component的;
3.Hierarchy游戏物体节点树的;
4.Project游戏资源文件的。
这边最主要的一个类就是MenuItem。
MenuItem是在UnityEditor的namespace下,所以使用该标签的类必须放在Editor的目录下或其子目录下。因为UnityEditor这个dll不会在打包的时候放到包体中,所以如果没有放到Editor目录下,就会产生编译错误,这点要注意。
MenuItem:
简单的使用:
[MenuItem("Tools/Test", false, 23)]
public static void Test()
{
Debug.Log("Test");
}
[MenuItem("Tools/Test", true, 23)]
public static bool ValidateTest()
{
return true;
}
首先注意使用MenuItem的方法必须是静态的。
第一个函数Test现在就能在菜单栏中找到:
点击之后就能输出Log信息。
第二个函数主要用于确定当前菜单是否能使用,如果返回为false,则无法点击。
♦ 参数
MenuItem("Tools/Test", true, 23):
1.菜单路径,以/分割;
2.是否为验证函数,默认为false;
3.菜单的优先级,数字越小显示在越上方。并且俩相邻菜单间差距为11以上的优先级会被分为两组,即菜单间会多个分隔线。默认为1000。
♦ 菜单的快捷键
单独的一个按键以“空格 + 下划线 + 想要的按键”增加在路径后缀,空格千万不要忘记。
“Tools/Test _g”,即在Unity中按下g就可以直接执行该菜单。
以“Tools/Test %&g”表示按住ctrl和alt,再按下g就能触发。特殊符号:%(ctrl/cmd)、#(shift)、&(alt)。
其他支持的按键:LEFT、RIGHT、UP、DOWN、F1..F12、HOME、END、PGUP、PGDN。
当然也支持类似#LEFT是左shift之类的按键。
♦ 菜单使用注意
1.创建GameObject时,使用GameObjectUtility.SetParentAndAlign方法设置父节点,可以重置坐标;
2.使用类似于Undo.RegisterCreatedObjectUndo方法注册撤销操作(这个我们之后在讨论)。
♦ 在Hierarchy和Project窗口下添加菜单
使用过一段Unity时间的人可能已经发现了,Hierarchy窗口下的右键菜单就是GameObject菜单栏中的部分菜单,而Project中的是Assets所有的。
所以是不是只要添加到GameObject和Assets菜单下就能在两个窗口中出现呢?
这个猜测完全正确。
使用以下代码就能在窗口中添加:
[MenuItem("GameObject/Test2", false, 11)]
public static void PasteTRValue()
{
Debug.Log("Test2");
}
[MenuItem("Assets/Test3", false)]
public static void Test3()
{
Debug.Log("Test3");
}
♦ 在Inspector窗口中添加菜单
这个窗口的添加就有些特殊了。说白了,其实就是给脚本添加右键菜单。
例子:
[MenuItem("CONTEXT/Transform/Test4")]
public static void Test4()
{
Debug.Log("Test4");
}
效果:
以上代码给Transform脚本添加了一个右键菜单。想要给所有脚本都添加,可以在Object上添加菜单。
ContextMenu和ConTextMenuItem:
这两个类实际上就是给Inspector窗口中添加菜单,但与MenuItem不同的是写在本身Component脚本中,也就是隶属于UnityEngine命名空间,会被打包。
例子:
using UnityEngine;
public class Clock : MonoBehaviour
{
[ContextMenuItem("Add Hour", "AddHour", order = 1)]
public int Hour = 10;
public void AddHour()
{
Hour += 1;
}
[ContextMenu("Sub Hour", false, 10)]
public void SubHour()
{
Hour -= 1;
}
}
ContextMenu的功能和参数与MenuItem完全一致,不同的是非静态。
而ContextMenuItem这个标签就有点意思了。
他是给你在右键变量名称时添加菜单:
♦ ContextMenuItem参数
ContextMenuItem("Add Hour", "AddHour", order = 1):
1.菜单的名称;
2.菜单执行的方法,要求脚本中必须有;
3.按钮的先后顺序。
今天就把菜单的位置都过了一遍,下篇文章会介绍选中物体的获取、撤销等详细操作,期待一下咯。
个人:
学习了一年的Unity,虽然说出个知识点,大概也都知道点,但是研究的不够深入,而且因为工作需要,越来越感到自己知识的匮乏,所以准备最近仍旧以研究Unity的实用技术为主。