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

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

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

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

 
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.1 Hierarchy 右键菜单
- Hierarchy 右键菜单是菜单栏的 GameObject 菜单栏下的菜单,并且 priority 在 1~49 范围内.
 
    [MenuItem("GameObject/二级菜单", false, 1)]
    static void MenuA()
    {
    }
 

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

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

- 注意: 
  
- 菜单检查 在 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:不写为false,true则点击菜单前就会调用 
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;
    }
}
                

















