关于unity中MenuItem特性的使用
[MenuItem]
特性的参数解析
Unity 的 [MenuItem]
特性(Attribute)用于在 Unity 编辑器菜单中添加自定义命令,它的参数可以控制菜单项的位置、顺序、快捷键等。
1. MenuItem("菜单路径")
最基础的用法,只包含菜单路径:
[MenuItem("Tools/打印日志")]
public static void PrintLog()
{
Debug.Log("Hello from Unity Menu!");
}
🔹 效果:
- 在 Unity 顶部菜单
Tools
下,创建打印日志
选项。 - 点击后,会在
Console
输出"Hello from Unity Menu!"
。
2. MenuItem("菜单路径", 优先级)
order
参数用于控制菜单项的顺序:
[MenuItem("Tools/选项1", false, 1)]
public static void Option1() { }
[MenuItem("Tools/选项2", false, 2)]
public static void Option2() { }
[MenuItem("Tools/选项3", false, 3)]
public static void Option3() { }
🔹 效果:
选项1
、选项2
、选项3
会按照order
排序。
3. MenuItem("菜单路径", false, 分隔线优先级)
如果 order
相差 10 以上,Unity 会在菜单项之间自动添加分隔线:
[MenuItem("Tools/选项 A", false, 10)]
public static void OptionA() { }
[MenuItem("Tools/选项 B", false, 20)]
public static void OptionB() { }
[MenuItem("Tools/选项 C", false, 30)]
public static void OptionC() { }
🔹 效果:
选项 A
和选项 B
之间会有一条 分隔线。选项 B
和选项 C
之间也会有一条 分隔线。
4. MenuItem("菜单路径", true)
当 true
作为第二个参数时,该方法用于验证菜单项是否可用:
[MenuItem("Tools/删除选中物体", false, 1)]
public static void DeleteSelectedObject()
{
Object.DestroyImmediate(Selection.activeGameObject);
}
// 只有选中了 GameObject 时才可用
[MenuItem("Tools/删除选中物体", true)]
public static bool ValidateDeleteSelectedObject()
{
return Selection.activeGameObject != null;
}
🔹 效果:
- 有选中物体时,
Tools/删除选中物体
可用。 - 未选中物体时,
Tools/删除选中物体
变灰不可用。
5. MenuItem("菜单路径/子菜单", false, 优先级)
可以创建多层级菜单:
[MenuItem("Tools/子菜单/选项 1", false, 1)]
public static void SubOption1() { }
[MenuItem("Tools/子菜单/选项 2", false, 2)]
public static void SubOption2() { }
🔹 效果:
Tools
└── 子菜单
├── 选项 1
├── 选项 2
6. MenuItem("GameObject/菜单项")
可以在 GameObject 右键菜单中添加选项:
[MenuItem("GameObject/自定义选项/打印对象名称", false, 10)]
public static void PrintObjectName()
{
if (Selection.activeGameObject != null)
{
Debug.Log("选中的对象: " + Selection.activeGameObject.name);
}
}
🔹 效果:
- 右键
GameObject
,会看到自定义选项 > 打印对象名称
。 - 选中 GameObject 后,点击此选项,会在
Console
里打印该对象的名字。
7. MenuItem("Assets/菜单项")
可以在 Project 视图的 Assets 右键菜单中添加选项:
[MenuItem("Assets/创建文本文件")]
public static void CreateTextFile()
{
string path = "Assets/NewFile.txt";
System.IO.File.WriteAllText(path, "Hello Unity!");
AssetDatabase.Refresh(); // 刷新资源窗口
Debug.Log("创建了新文件: " + path);
}
🔹 效果:
- 右键
Assets
目录,选择创建文本文件
,会生成NewFile.txt
。
8. MenuItem
支持 快捷键
你可以在 MenuItem
路径字符串的末尾添加快捷键:
[MenuItem("Tools/打印日志 %g")] // Ctrl + G
public static void PrintLog()
{
Debug.Log("Hello from Unity Menu!");
}
🔹 快捷键规则:
符号 | 含义 |
---|---|
% | Ctrl (Windows) / Cmd (Mac) |
# | Shift |
& | Alt |
_ | 直接绑定键,无需 Ctrl |
更多快捷键示例
[MenuItem("Tools/重置选中对象 &_r")] // Alt + Shift + R
public static void ResetTransform()
{
if (Selection.activeGameObject != null)
{
Selection.activeGameObject.transform.position = Vector3.zero;
Debug.Log("重置: " + Selection.activeGameObject.name);
}
}
🔹 快捷键效果:
Alt + Shift + R
触发 ResetTransform()。
总结
形式 | 示例 | 说明 |
---|---|---|
普通菜单项 | [MenuItem("Tools/打印日志")] | 在 Tools 菜单下创建 打印日志 选项 |
带优先级菜单项 | [MenuItem("Tools/选项", false, 10)] | 用 order 控制菜单项排序,order 相差 ≥10 会加分隔线 |
可用性控制 | [MenuItem("Tools/删除", true)] | 只有满足 ValidateDeleteSelectedObject() 条件时,菜单项才可用 |
子菜单 | [MenuItem("Tools/子菜单/选项 1")] | 在 Tools 里创建 子菜单 及 选项 1 |
GameObject 右键菜单 | [MenuItem("GameObject/自定义选项/打印名称")] | 右键 GameObject ,弹出 打印名称 选项 |
Assets 右键菜单 | [MenuItem("Assets/创建文本文件")] | 右键 Assets ,弹出 创建文本文件 选项 |
快捷键 | [MenuItem("Tools/打印日志 %g")] | Ctrl + G 触发 PrintLog() |
🚀 MenuItem
适用场景
✅ 自动化工具(批量修改 GameObject)
✅ 调试工具(打印日志、重置对象)
✅ 自定义编辑器(批量资源管理、创建文件)
✅ 快捷操作(提供便捷的 Debug
菜单)