Unity 编辑器扩展菜单
目录
Unity 编辑器扩展菜单一、MenuItem 特性 菜单栏扩展1.创建多级菜单2.创建可使用快捷键的菜单项3.创建可被勾选的菜单项4.检查菜单是否使用5.菜单排序6.右键菜单扩展Hierarchy 右键菜单Project 右键菜单Inspector 组件右键菜单问题:二、AddComponentMenu 特性三、ContextMenu 特性 添加组件右键菜单四、其他一、MenuItem 特性 菜单栏扩展
MenuItem(string itemName, bool isValidateFunction, int priority) itemName:菜单名称路径 isValidateFunction:不写为false,true则点击菜单前就会调用 priority:菜单项显示排序 默认 1000
每个方法可以使用多个 MenuItem 来创建多个菜单
特殊路径:
CONTEXT: 为组件添加菜单项
Assets: 对应顶部菜单 Assets,并添加 Project 面板右键菜单
GameObject: 对应顶部菜单 GameObject,priority 值在1~49时,添加 Hierarchy 面板右键菜单
Component: 对应顶部菜单 Component,对应 Inspector 面板的 Add Component 窗口。但是不知道怎么用,用 AddComponentMenu 吧
1.创建多级菜单
[MenuItem("一级目录名/二级目录名/.../菜单名")]static void 方法名(){//实现功能}[MenuItem("Menu/menu1/menu2")]static void Menu(){Debug.Log("多级菜单");}
2.创建可使用快捷键的菜单项
在 MenuItem 的双引号菜单路径最后+空格+快捷键字符
常用快捷键
Shift : #Ctrl : %Alt : &英文字母 :_字母 (不区分大小写)
快捷键可任意组合使用
[MenuItem("Menu/menu1/menu2 %#_A")]static void Menu(){Debug.Log("快捷键");}
3.创建可被勾选的菜单项
使用 Menu 类的方法
//设置勾选状态Menu.SetChecked(string menuPath,bool isChecked)//获取勾选状态Menu.GetChecked(string menuPath)[MenuItem("Menu/menu2")]static void Menu2(){string menuPath = "Menu/menu2";bool isChecked = !Menu.GetChecked(menuPath);Menu.SetChecked(menuPath, isChecked);Debug.Log("可勾选" + isChecked);}
4.检查菜单是否使用
每次点击一级菜单时 都是先走一遍验证方法
[MenuItem("菜单路径名")]static void 方法1(){}[MenuItem("菜单路径名"),true]static void 验证方法(){return bool值; //返回true 改菜单启用}[MenuItem("Menu/menu2")]static void Menu2(){string menuPath = "Menu/menu2";bool isChecked = !Menu.GetChecked(menuPath);Menu.SetChecked(menuPath, isChecked);EditorPrefs.SetBool("Menu3Validate", isChecked);Debug.Log("可勾选" + isChecked);}[MenuItem("Menu/menu3")]static void Menu3(){}[MenuItem("Menu/menu3", true)]static bool Menu3Validate(){bool flag = EditorPrefs.GetBool("Menu3Validate");Menu.SetChecked("Menu/menu2", flag);return flag;}
5.菜单排序
priority 小的位置在上方 不配置默认为1000
当相邻两个菜单的 priority 值差距超过10时 就会分组 中间出现一条横线
多级菜单的 priority 按照子级里面最小的 priority 算
MenuItem(string itemName, bool isValidateFunction, int priority) [MenuItem("Menu/menu1/menu2", false, 16)][MenuItem("Menu/menu1/menu3 %#_D", false, 5)]
6.右键菜单扩展
Hierarchy 和 Project 右键扩展属于特殊的菜单栏扩展
Hierarchy 右键菜单
Hierarchy 右键菜单是菜单栏的 GameObject 菜单栏下的菜单,并且 priority 在 1~49 范围内
[MenuItem("GameObject/菜单路径名",false,1)]static void 方法名(){}
Project 右键菜单
Project 右键菜单是菜单栏的 Assets 菜单栏下的菜单
[MenuItem("Assets/菜单路径名")]static void 方法名(){}
Inspector 组件右键菜单
组件右键菜单是使用特殊路径 CONTEXT 创建的
MenuCommand 可以获取到该组件
[MenuItem("CONTEXT/组件名/菜单名")]static void 方法名(MenuCommand cmd){//组件名 t = cmd.context as 组件名;//对该组件进行操作}[MenuItem("CONTEXT/Transform/全部归0")]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 右侧里面可以用。
二、AddComponentMenu 特性
AddComponentMenu 直接加载类上,会自动将菜单加到 Component 下,并加在 Inspector 面板的 AddComponentMenu 里
AddComponentMenu(string menuName, int order)menuName:菜单名路径order:菜单项排序
[AddComponentMenu("自定义/UILable",1)]public class UILable : MonoBehaviour{}
三、ContextMenu 特性 添加组件右键菜单
和 [MenuItem(“CONTEXT/组件名/菜单名”)] 功能几乎一样
ContextMenu(string itemName, bool isValidateFunction, int priority)itemName:菜单名称isValidateFunction:不写为false,true则点击菜单前就会调用 priority:菜单项显示排序 默认 1000000
class 组件类名:MonoBehaviour{[ContextMenu("菜单名称")]public void 方法名(){//执行内容}}public class UILable : MonoBehaviour{[ContextMenu("菜单名称")]public void SetAddObj(){transform.position = Vector3.zero;transform.rotation = Quaternion.identity;transform.localScale = Vector3.zero;GameObject obj = new GameObject();obj.transform.parent = transform;}}
四、其他
1.清空 Unity Dubeg
static void ClearDebug(){Assembly assembly = Assembly.GetAssembly(typeof(SceneView));Type logEntries = assembly.GetType("UnityEditor.LogEntries");MethodInfo clearConsoleMethod = logEntries.GetMethod("Clear");clearConsoleMethod.Invoke(new object(), null);}