目录
- 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.创建带快捷键的菜单
[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值;
}
[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)
{
}
[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;
}
}