Unity3D Editor 编辑器扩展 MenuItem标签 菜单的扩展

环境: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的实用技术为主。


猜你喜欢

转载自blog.csdn.net/u012632851/article/details/79383215