点击组件中设置(鼠标右键),可以弹出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来延迟一帧调用。如果大家在开发编辑器代码时发现类似问题,也可以尝试延迟一帧再执行自己的代码。
原文地址:https://www.cnblogs.com/llllllvty/p/9898411.html
时间: 2024-10-29 22:39:47