unity中的MenuItem特性

关于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 菜单)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值