参考链接:
https://blog.csdn.net/qq_33337811/article/details/72852342
https://blog.csdn.net/zxl321365712/article/details/80080586
0.定义
itemName表示菜单路径
isValidateFunction表示该方法是否为验证方法
priority表示菜单优先级
使用方法:
1 using UnityEditor; 2 using UnityEngine; 3 4 public class TestMenuItem 5 { 6 [MenuItem("GameObject/Test41", false)] 7 private static void Test41() 8 { 9 Debug.Log("Test41"); 10 } 11 }
1.参数itemName
a.与视图的对应关系
Assets->Project视图
GameObject->Hierarchy视图
Componemt->Inspector视图的AddComponent窗口
b.快捷键设置
_w表示字母w
#w表示shift+w
%w表示ctrl+w
&w表示alt+w
直接按快捷键就能调用,支持混合,注意前面要加空格,使用如下:
[MenuItem("GameObject/Test41 %#w", false, 41)]
2.参数isValidateFunction
true表示该方法是该菜单项的检测方法,false表示该方法是该菜单项的执行方法,默认为false
在检测方法中,返回true表示该菜单项可以点击,否则不可以点击。如下表示选中一个东西才可以点击
1 using UnityEditor; 2 using UnityEngine; 3 4 public class TestMenuItem 5 { 6 [MenuItem("GameObject/Test41 %#w", true, 41)] 7 private static bool Test41ValidateFunc() 8 { 9 return Selection.activeObject != null; 10 } 11 12 [MenuItem("GameObject/Test41 %#w", false, 41)] 13 private static void Test41() 14 { 15 Debug.Log("Test41"); 16 } 17 }
3.参数priority
表示优先级,越大越后,默认为1000即放最后
a.分割线
当相邻的两个菜单项优先级相差>10时,表示不同组,这时会有分割线
1 using UnityEditor; 2 using UnityEngine; 3 4 public class TestMenuItem 5 { 6 [MenuItem("GameObject/Test30", false, 30)] 7 private static void Test30() 8 { 9 Debug.Log("Test30"); 10 } 11 12 [MenuItem("GameObject/Test41", false, 41)] 13 private static void Test41() 14 { 15 Debug.Log("Test41"); 16 } 17 }
b.相同优先级的情况下,先定义的在前面,不会出现覆盖的情况
c.相同菜单路径的情况下,后定义的会覆盖先定义的。unity内置的菜单项同样也可以被覆盖
d.GameObject/下的菜单项优先级<50的才会显示在Hierarchy视图中
4.为组件添加菜单项
使用方法:[MenuItem("CONTEXT/组件名/显示方法名")]
1 using UnityEditor; 2 using UnityEngine; 3 using System.Collections.Generic; 4 using System.Text; 5 6 public class TestMenuItem 7 { 8 [MenuItem("CONTEXT/TestEditorComponent/TestTest")] 9 private static void TestTest(MenuCommand cmd) 10 { 11 TestEditorComponent comp = cmd.context as TestEditorComponent; 12 List<Transform> traList = comp.traList; 13 StringBuilder stringBuilder = new StringBuilder(); 14 for (int i = 0; i < traList.Count; i++) 15 { 16 string temp = string.Format("{0}_{1}", traList[i].gameObject.name, i); 17 stringBuilder.AppendLine(temp); 18 } 19 TextEditor textEditor = new TextEditor(); 20 textEditor.text = stringBuilder.ToString(); 21 textEditor.OnFocus(); 22 textEditor.Copy(); 23 } 24 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?