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

目录

1.MenuItem 属性

csharp 复制代码
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.创建多级菜单

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

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

3.创建带快捷键的菜单

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

csharp 复制代码
 //设置勾选状态
 //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.检查菜单是否使用

csharp 复制代码
  [MenuItem("菜单路径名")]
  static void 方法() { }

  [MenuItem("菜单路径名"),true]
  static void 验证方法()
  {
      return bool值; //返回true 改菜单启用
  }
csharp 复制代码
   [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 算
csharp 复制代码
    [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 范围内.
csharp 复制代码
    [MenuItem("GameObject/二级菜单", false, 1)]
    static void MenuA()
    {

    }


7.2 Project 右键菜单

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

  }

7.3 Inspector 组件右键菜单

  • 组件右键菜单是使用特殊路径 CONTEXT 创建的
  • MenuCommand 可以获取到该组件
csharp 复制代码
    [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 里.
csharp 复制代码
AddComponentMenu(string menuName, int order)
menuName:菜单名路径
order:菜单项排序
csharp 复制代码
[AddComponentMenu("自定义/Test", 1)]
public class Test : MonoBehaviour
{

}

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

csharp 复制代码
ContextMenu(string itemName, bool isValidateFunction, int priority)
itemName:菜单名称
isValidateFunction:不写为false,true则点击菜单前就会调用 
priority:菜单项显示排序 默认 1000000
csharp 复制代码
[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;
    }
}
相关推荐
串流游戏联盟1 小时前
steam新品节游戏推荐!手机怎么玩steam游戏!
游戏·远程工作
霜绛1 小时前
Unity:UGUI笔记(一)——三大基础控件、组合控件
笔记·学习·unity·游戏引擎
YuanlongWang2 小时前
c# 泛型的详细介绍
c#
麦麦大数据4 小时前
F029 vue游戏推荐大数据可视化系统vue+flask+mysql|steam游戏平台可视化
vue.js·游戏·信息可视化·flask·推荐算法·游戏推荐
嵌入式学习和实践4 小时前
C# WinForms 多窗口交互通信的示例-主窗口子窗口交互通信
c#·交互·主窗口-子窗口通信
专注VB编程开发20年4 小时前
C#,VB.NET数组去重复,提取键名和重复键和非重复键
c#·.net·linq·取唯一键·去重复·重复数量
YuanlongWang5 小时前
Entity Framework Core和SqlSugar的区别,详细介绍
c#
热爱生活的五柒7 小时前
vscode左边打开文件后会覆盖上一个打开的文件,有什么不覆盖的方法
ide·vscode·编辑器
嵌入式小能手7 小时前
飞凌嵌入式ElfBoard-Vim编辑器之Vim常用操作命令
linux·编辑器·vim
小趴菜82277 小时前
Android中加载unity aar包实现方案
android·unity·游戏引擎