lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  201 随笔 :: 0 文章 :: 12 评论 :: 21万 阅读

参考链接:

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 }
复制代码

posted on   艰苦奋斗中  阅读(1600)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示