Unity 编辑器篇|(一)MenuItem菜单栏

发布时间:2024年01月08日

1.MenuItem 属性

MenuItem(string itemName, bool isValidateFunction, int priority) 
  • itemName:菜单名称路径
    • 特殊路径:
      • CONTEXT: 为组件添加菜单项
      • Assets: 对应顶部菜单 Assets,并添加 Project 面板右键菜单
      • GameObject: 对应顶部菜单 GameObject,priority 值在1~49时,添加 Hierarchy 面板右键菜单
      • Component: 对应顶部菜单 Component,对应 Inspector 面板的 Add Component 窗口。但是不知道怎么用,用 AddComponentMenu 吧
  • isValidateFunction:不写为false,true则点击菜单前就会调用
  • priority:菜单项显示排序 默认 1000

2.创建多级菜单

    [MenuItem("一级菜单/二级菜单上/三级菜单")]
  static void MenuOne()
  {
      //功能
  }

  [MenuItem("一级菜单/二级菜单下")]
  static void MenuTwo()
  {
      //功能
  }

1

3.创建带快捷键的菜单

  • 在 MenuItem 的双引号菜单路径最后+空格+快捷键字符
  • 快捷键可任意组合使用
  • 英文字母 :_字母 (不区分大小写)
  • 常用快捷键:
符号字符
%Ctr/Command
#Shift
&Alt
LEFT/Right/UP/DOWN方向键
F1-F2F功能键
_g字母g
 [MenuItem("一级菜单/二级菜单上 #_A")]
 static void MenuA()
 {
     Debug.Log("A");
 }

 [MenuItem("一级菜单/二级菜单中 %#_B")]
 static void MenuB()
 {
     Debug.Log("B");
 }

 [MenuItem("一级菜单/二级菜单下 %&_C")]
 static void MenuC()
 {
     Debug.Log("B");
 }

2

4.创建带快捷键的菜单

 //设置勾选状态
 //Menu.SetChecked(string menuPath, bool isChecked)
 //获取勾选状态
 //Menu.GetChecked(string menuPath)

 [MenuItem("一级菜单/二级菜单上 #_A")]
 static void MenuA()
 {
     string menuPath = "一级菜单/二级菜单上 #_A";
     bool isChecked = !Menu.GetChecked(menuPath);
     Menu.SetChecked(menuPath, isChecked);
 }

 [MenuItem("一级菜单/二级菜单中 %#_B")]
 static void MenuB()
 {
     string menuPath = "一级菜单/二级菜单中 %#_B";
     bool isChecked = !Menu.GetChecked(menuPath);
     Menu.SetChecked(menuPath, isChecked);
 }

 [MenuItem("一级菜单/二级菜单下 %&_C")]
 static void MenuC()
 {
     string menuPath = "一级菜单/二级菜单下 %&_C";
     bool isChecked = !Menu.GetChecked(menuPath);
     Menu.SetChecked(menuPath, isChecked);
 }

3

5.检查菜单是否使用

  [MenuItem("菜单路径名")]
  static void 方法() { }

  [MenuItem("菜单路径名"),true]
  static void 验证方法()
  {
      return bool; //返回true 改菜单启用
  }
   [MenuItem("一级菜单/二级菜单上")]
   static void MenuA()
   {
       string menuPath = "一级菜单/二级菜单上";
       bool isChecked = !Menu.GetChecked(menuPath);
       Menu.SetChecked(menuPath, isChecked);
   }

   [MenuItem("一级菜单/二级菜单中")]
   static void MenuB()
   {
       string menuPath = "一级菜单/二级菜单中";
       bool isChecked = !Menu.GetChecked(menuPath);
       Menu.SetChecked(menuPath, isChecked);

       EditorPrefs.SetBool("MenuCValidate", isChecked);
   }

   [MenuItem("一级菜单/二级菜单下")]
   static void MenuC()
   {
       string menuPath = "一级菜单/二级菜单下";
       bool isChecked = !Menu.GetChecked(menuPath);
       Menu.SetChecked(menuPath, isChecked);
   }

   [MenuItem("一级菜单/二级菜单下", true)]
   static bool MenuCValidate()
   {
       bool flag = EditorPrefs.GetBool("MenuCValidate");
       Menu.SetChecked("一级菜单/二级菜单中", flag);
       return flag;
   }

4
5

6.菜单排序

  • 在priority 小的位置在上方 不配置默认为1000
  • 当相邻两个菜单的 priority 值差距超过10时 就会分组 中间出现一条横线
  • 多级菜单的 priority 按照子级里面最小的 priority 算
    [MenuItem("一级菜单/二级菜单上", false, 3)]
    static void MenuA()
    {
        string menuPath = "一级菜单/二级菜单上";
        bool isChecked = !Menu.GetChecked(menuPath);
        Menu.SetChecked(menuPath, isChecked);
    }

    [MenuItem("一级菜单/二级菜单中", false, 2)]
    static void MenuB()
    {
        string menuPath = "一级菜单/二级菜单中";
        bool isChecked = !Menu.GetChecked(menuPath);
        Menu.SetChecked(menuPath, isChecked);
    }

    [MenuItem("一级菜单/二级菜单下", false, 1)]
    static void MenuC()
    {
        string menuPath = "一级菜单/二级菜单下";
        bool isChecked = !Menu.GetChecked(menuPath);
        Menu.SetChecked(menuPath, isChecked);
    }

7

7.扩展右键菜单

7.1 Hierarchy 右键菜单

  • Hierarchy 右键菜单是菜单栏的 GameObject 菜单栏下的菜单,并且 priority 在 1~49 范围内.
    [MenuItem("GameObject/二级菜单", false, 1)]
    static void MenuA()
    {

    }

8
9

7.2 Project 右键菜单

  • Project 右键菜单是菜单栏的 Assets 菜单栏下的菜单
  [MenuItem("Assets/二级菜单", false, 1)]
  static void MenuA()
  {

  }

9

7.3 Inspector 组件右键菜单

  • 组件右键菜单是使用特殊路径 CONTEXT 创建的
  • MenuCommand 可以获取到该组件
    [MenuItem("CONTEXT/组件名/菜单名")]
    static void 方法名(MenuCommand cmd)
    {
        //组件名 t = cmd.context as 组件名;
        //对该组件进行操作
    }

    [MenuItem("CONTEXT/Transform/Reset功能")]
    static void ClearTransformMenu(MenuCommand cmd)
    {
        Transform t = cmd.context as Transform;
        t.position = Vector3.zero;
        t.rotation = Quaternion.identity;
        t.localScale = Vector3.zero;
        GameObject obj = new GameObject();
        obj.transform.parent = t.gameObject.transform;
    }

10

  • 注意:
    • 菜单检查 在 Hierarchy 右键菜单里面,检查没有效果,但是在顶上菜单和 Project 右侧里面可以用。

8. AddComponentMenu 特性

  • AddComponentMenu 直接加载类上,会自动将菜单加到 Component 下,并加在 Inspector 面板的 AddComponentMenu 里.
AddComponentMenu(string menuName, int order)
menuName:菜单名路径
order:菜单项排序
[AddComponentMenu("自定义/Test", 1)]
public class Test : MonoBehaviour
{

}

9. ContextMenu 特性 添加组件右键菜单

ContextMenu(string itemName, bool isValidateFunction, int priority)
itemName:菜单名称
isValidateFunction:不写为falsetrue则点击菜单前就会调用 
priority:菜单项显示排序 默认 1000000
[AddComponentMenu("自定义/Test", 1)]
public class Test : MonoBehaviour
{
    [ContextMenu("添加空物体")]
    public void AddGameObject()
    {
        transform.position = Vector3.zero;
        transform.rotation = Quaternion.identity;
        transform.localScale = Vector3.zero;
        GameObject obj = new GameObject();
        obj.transform.parent = transform;
    }
}
文章来源:https://blog.csdn.net/backlighting2015/article/details/135442995
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。