拓展编辑器_Context菜单

Posted llllllvty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓展编辑器_Context菜单相关的知识,希望对你有一定的参考价值。

  点击组件中设置(鼠标右键),可以弹出Context菜单,我们可以在原有菜单中拓展出新的菜单栏,代码如下所示:

using UnityEngine;
using UnityEditor;

public class Context菜单 
{
    [MenuItem("CONTEXT/Transform/New Context 1")]
    public static void NewContext1(MenuCommand command)
    {
        //获取对象名
        Debug.Log(command.context.name);
    }
    [MenuItem("CONTEXT/Transform/New Context 2")]
    public static void NewContext2(MenuCommand command)
    {
        Debug.Log(command.context.name);
    }
}

  其中,[MenuItem("CONTEXT/Transform/New Context 1")]表示将新菜单扩展在Transform组件上。如果想拓展在别的组件上,例如摄像机组件,直接修改字符串中的Transform为Camera即可。如果想给所有组件都添加菜单栏,这里改成Compoment即可。代码效果如下:

  技术分享图片

  除此以外,以上的设置也可以应用在自己的写的脚本中。代码如下:

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class Context菜单2 :MonoBehaviour
{
    public string contextName;
#if UNITY_EDITOR
    [MenuItem("CONTEXT/Context菜单2/New Context 1")]
    public static void NewContext2(MenuCommand command)
    {
        Context菜单2 script = (command.context as Context菜单2);
        script.contextName = "hello world!";
    }
#endif
}

  这段代码通过MenuCommand来获取脚本对象,从而访问脚本中的变量。同时使用了宏定义标签,其中UNITY_EDITOR标识这段代码只会在Editor模式下执行,发布后将会被剔除掉。效果如下:

  技术分享图片 技术分享图片

技术分享图片

  当然,我们也可以在自己的脚本中这样写。如果和系统中的菜单名称一样,还可以覆盖它。比如,这里重写了删除组件的按钮,这样就可以执行自己的一些操作了:

[ContextMenu("Remove Comconent")]
    void RemoveComponent()
    {
        Debug.Log("RemoveComponent");
        //等一帧再删除自己
        UnityEditor.EditorApplication.delayCall = delegate ()
          {
              DestroyImmediate(this);
          };
    }

  编辑模式下的代码同步时可能会有问题,比如上述DestroyImmediate(this)删除自己的代码时,会触发引擎底层的一个错误。不过我们可以使用UnityEditor.EditorApplication.delayCall来延迟一帧调用。如果大家在开发编辑器代码时发现类似问题,也可以尝试延迟一帧再执行自己的代码。

 


以上是关于拓展编辑器_Context菜单的主要内容,如果未能解决你的问题,请参考以下文章

编辑器拓展九——用代码实现unity菜单命令

拓展编辑器

拓展编辑器

拓展编辑器_组件不可编辑

Unity编辑器拓展(MenuItem)

Unity编辑器拓展最全实现