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

目录

  • 1.MenuItem 属性
  • 2.创建多级菜单
  • 3.创建带快捷键的菜单
  • 4.创建带快捷键的菜单
  • 5.检查菜单是否使用
  • 6.菜单排序
  • 7.扩展右键菜单
    • 7.1 Hierarchy 右键菜单
    • 7.2 Project 右键菜单
    • 7.3 Inspector 组件右键菜单
  • 8. AddComponentMenu 特性
  • 9. ContextMenu 特性 添加组件右键菜单

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()
  {
      //功能
  }

Unity 编辑器篇|(一)MenuItem菜单栏_第1张图片

3.创建带快捷键的菜单

  • 在 MenuItem 的双引号菜单路径最后+空格+快捷键字符
  • 快捷键可任意组合使用
  • 英文字母 :_字母 (不区分大小写)
  • 常用快捷键:
符号 字符
% Ctr/Command
# Shift
& Alt
LEFT/Right/UP/DOWN 方向键
F1-F2 F功能键
_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()
    {

    }

Unity 编辑器篇|(一)MenuItem菜单栏_第2张图片
Unity 编辑器篇|(一)MenuItem菜单栏_第3张图片

7.2 Project 右键菜单

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

  }

Unity 编辑器篇|(一)MenuItem菜单栏_第4张图片

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;
    }

Unity 编辑器篇|(一)MenuItem菜单栏_第5张图片

  • 注意:
    • 菜单检查 在 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;
    }
}

你可能感兴趣的:(#,Unity编辑器篇,unity,编辑器,游戏,c#)