1.MenuItem 属性
MenuItem(string itemName, bool isValidateFunction, int priority)
- itemName:菜单名称路径
- 特殊路径:
- CONTEXT: 为组件添加菜单项
- Assets: 对应顶部菜单 Assets,并添加 Project 面板右键菜单
- GameObject: 对应顶部菜单 GameObject,priority 值在149时,添加 Hierarchy 面板右键菜单
- Component: 对应顶部菜单 Component,对应 Inspector 面板的 Add Component 窗口。但是不知道怎么用,用 AddComponentMenu 吧
- isValidateFunction:不写为false,true则点击菜单前就会调用
- priority:菜单项显示排序 默认 1000
2.创建多级菜单
[MenuItem("一级菜单/二级菜单上/三级菜单")]
static void MenuOne()
{
//功能
}
[MenuItem("一级菜单/二级菜单下")]
static void MenuTwo()
{
//功能
}
3.创建带快捷键的菜单
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 右键菜单
7.2 Project 右键菜单
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("自定义/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;
}
}