Unity编辑器使用的拓展菜单是MenuItem。当然,开发者也可以自由拓展,直接使用"/"符号区分开它的路径即可。系统上方自带的一排菜单也在大量使用这个功能。
覆盖系统菜单
Unity编辑器中自带了很多菜单,大多数情况下可以按照它的原有菜单路径拼合集合,例如,如果需要重写创建Text按钮的功能,可以按照下面的代码执行。
using UnityEngine; using UnityEditor; public class 覆盖系统菜单 { [MenuItem("GameObject/UI/Text")] static void CreatNextText() { Debug.Log("CreatNewText"); } }
此时点击Unity上方菜单GameObject/UI/Text 会在输出面板上输出CreatNewText.
自定义菜单
自定义菜单可以设置路径,排序,勾选框和禁止选中状态。代码如下:
using UnityEngine; using UnityEditor; public class 自定义菜单 { [MenuItem("Root/Test1", false, 1)] static void Test1() { } //菜单排序 [MenuItem("Root/Test0", false, 0)] static void Test0() { } [MenuItem("Root/Test/2")] static void Test2() { } [MenuItem("Root/Test/2", true, 20)] static bool Test2Validation() { //false表示Root/Test/2 菜单将置灰,即不可点击 return false; } [MenuItem("Root/Test3", false, 3)] static void Test3() { //勾选框中的菜单 var menuPath = "Root/Test3"; bool mchecked = Menu.GetChecked(menuPath); Menu.SetChecked(menuPath, !mchecked); } }
效果如下:
其中菜单下方有一个下划线。在代码中设置上一个菜单的priority(优先级),一共预留了10个元素的位置,只需要peioeity+11即可,就会自动增加这个下划线效果。Menu.SetChecked()方法可以更改菜单为选中状态。