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 吧
[MenuItem("一级目录名/二级目录名/.../菜单名")]
static void 方法名()
{
//实现功能
}
[MenuItem("Menu/menu1/menu2")]
static void Menu()
{
Debug.Log("多级菜单");
}
在 MenuItem 的双引号菜单路径最后+空格+快捷键字符
常用快捷键
- Shift : #
- Ctrl : %
- Alt : &
- 英文字母 :_字母 (不区分大小写)
快捷键可任意组合使用
[MenuItem("Menu/menu1/menu2 %#_A")]
static void Menu()
{
Debug.Log("快捷键");
}
使用 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);
}
每次点击一级菜单时 都是先走一遍验证方法
[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;
}
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)]
Hierarchy 和 Project 右键扩展属于特殊的菜单栏扩展
Hierarchy 右键菜单是菜单栏的 GameObject 菜单栏下的菜单,并且 priority 在 1~49 范围内
[MenuItem("GameObject/菜单路径名",false,1)]
static void 方法名()
{
}
Project 右键菜单是菜单栏的 Assets 菜单栏下的菜单
[MenuItem("Assets/菜单路径名")]
static void 方法名()
{
}
组件右键菜单是使用特殊路径 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 直接加载类上,会自动将菜单加到 Component 下,并加在 Inspector 面板的 AddComponentMenu 里
AddComponentMenu(string menuName, int order)
menuName:菜单名路径
order:菜单项排序
[AddComponentMenu("自定义/UILable",1)]
public class UILable : MonoBehaviour
{
}
和 [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);
}