Unity Editor脚本使用MenuItem后Hierarchy右键不显示自定义选项
问题原因
Hierarchy面板右键GameObject弹出的菜单有固定的路径规则,只有挂载在GameObject/根路径下的MenuItem才会显示在该右键菜单中。你当前代码中MenuItem的路径是InteractableItem/Make InteractableItem,该路径的选项只会出现在Unity编辑器顶部的全局菜单栏,不会同步到GameObject相关的右键菜单。
替换ContextMenu无效属于特性用错场景:
ContextMenu特性仅用于给运行时组件的实例方法添加Inspector上下文菜单,必须写在非Editor的MonoBehaviour派生类中,仅会在选中对应组件、点击组件右上角三点菜单时显示,本身不支持Hierarchy面板的GameObject右键菜单。- 你的
ContextMenu写在Editor类中,本身就不会被正常加载识别。
修复代码
将MenuItem路径调整为GameObject/开头即可,参考代码如下:
using UnityEditor; using UnityEngine; public class InteractableItemEditor { // 路径以GameObject/开头,会自动同步到Hierarchy、Inspector的GameObject右键菜单 [MenuItem("GameObject/InteractableItem/Make InteractableItem", false, 11)] private static void MakeInteractableItem() { foreach (GameObject o in Selection.gameObjects) { if (!o.GetComponent<InteractableItem>()) { o.AddComponent<InteractableItem>(); o.tag = "Interactable Item"; } } } }
注:仅用来注册MenuItem的Editor类不需要继承
Editor基类,继承Editor是用来编写自定义Inspector面板的,多余继承不会影响功能但没必要。
排查补充
如果修改后仍不显示,按以下顺序检查:
- 查看Console面板是否有红色编译错误,存在编译错误时所有Editor特性都不会被加载
- 确认脚本存放的文件夹名确实是
Editor,注意拼写大小写,嵌套在其他目录下的Editor文件夹也可以生效 - 修改代码后菜单未刷新时,可点击顶部菜单
Assets > Refresh触发资源重编译,必要时重启编辑器 - 优先级参数如果和相邻菜单差值超过10会自动生成分隔线,注意选项是否被分到分隔线的其他区域
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

