MenuItem 红太狼 2022-06-16 22:47 100阅读 0赞 ## `MenuItem菜单基本操作unity 4.6.2` ## `` ## `http://www.ceeger.com/Script/ScriptableObject/ScriptableObject.html` ## `这些菜单分别是:` * 编辑器顶部的内置菜单(A、B、C、D) * 层级视图右键弹出菜单(B) * 项目视图右键弹出菜单(A) * 检视面板中点击Add Component按钮弹出的菜单(C) * 编辑器顶部的新菜单项(E) (C) Component菜单下的所有菜单项都是用于为选中的游戏对象添加组件,为了加强该功能,Unity并不允许通过MenuItem向该菜单增加菜单项,而是使用\[AddComponentMenu\]属性,该属性直接用于自定义的MonoBehaviour类。点击菜单项会自动添加该脚本。 (E) 如果已有菜单项均不适合自定义工具的功能,也可以自己新建一个菜单项。但Unity并不推荐在多人合作或共享资源的项目中新建菜单项,这可能会导致工具栏异常混乱。 `` `MenuItem`是编辑器类,所以技能导入 `using UnityEditor;` 命名空间,且一般我们的类也不是集成自`MonoBehaviour`的,而是集成`ScriptableObject`的 [MenuItem("MenuItem/普通的顶部菜单")] private static void MenuItemNormal() { Debug.Log("普通的顶部菜单"); } ## MenuItem菜单的先后顺序 ## 需要注意的就是 unity 的顶部菜单的父一级,是不支持中文的,就是 `MenuItem` 那一级,它的子级就没关系了 [MenuItem("MenuItem/MenuItem2", false, 2)] private static void MenuItemFunc2() { Debug.Log("MenuItemFunc2"); } [MenuItem("MenuItem/MenuItem1", false, 1)] private static void MenuItemFunc1() { Debug.Log("MenuItemFunc1"); } 如图中所示,虽然我们在写代码的时候是 item2 在前,但是我们在设置顺序时给它设的是2,所以最后显示的时候,则是1在前,2在后 貌似间隔10个,自动分割线 ## MenuItem与快捷键 ## [MenuItem("MenuItem/快捷键1 _%#&_HOME")] private static void MenuItemFunc3() { Debug.Log("MenuItemFunc3"); } [MenuItem("MenuItem/快捷键2 _%#&_LEFT")] private static void MenuItemFunc4() { Debug.Log("MenuItemFunc4"); } 入图所示,这2个item选项跟快捷键关联起来了,可以直接使用快捷键来调用。 规则是: `% = ctrl` `# = Shift` `& = Alt` `LEFT/RIGHT/UP/DOWN = 上下左右` `F1…F2 = F...` `HOME, END, PGUP, PGDN = 键盘上的特殊功能键` 特别注意的是,如果是键盘上的普通按键,比如 `a~z` ,则要写成 `_a ~ _z` 这种带\_前缀的 ## 选中的不是指定类型的对象,菜单项被禁掉 ## [MenuItem("MenuItem/Selected GameObject")] private static void SelectedGameObject() { Debug.Log("SelectedGameObject"); } [MenuItem("MenuItem/Selected GameObject", true)] private static bool CheckObjectType() { Object selectedObject = Selection.activeObject; if(selectedObject != null && selectedObject.GetType() == typeof(GameObject)) { return true; } return false; 这段的意思就是,如果你没有选中任何游戏对象,或者你选中的不是 `GameObject` 类型的对象时, `MenuItem/Selected GameObject` 选项会是被禁用的(灰色)状态,只有选的是指定类型的选项时,才是正常的可点击状态。 ## 在Inspector窗口中指定控件身上右键选项 ## [MenuItem("CONTEXT/Rigidbody/在Rigidbody上右键")] private static void CONTEXT_Rigidbody_right_btn() { Debug.Log("在Rigidbody上右键"); } ![Image 1][] 有时候,我们想在某个控件上增加一些功能菜单,做一些比如自动给控件赋值等这种功能。 思路跟上面的其实是一样的,只不过我们这次的父换成了`CONTEXT`而已。 ## 通过在 GameObject/UI 选项夹里增加选项,使菜单在Hierarchy窗口中被右键到 ## [MenuItem("GameObject/UI/在GameObject目录里右键")] private static void GameObject_right_btn() { Debug.Log("在GameObject目录里右键"); } 思路跟前面一样,我们在 `GameObject/UI/` 目录下增加了一个选项,我们发现不止在 Hierarchy 窗口中看到了它,在顶部菜单栏相同的层次下也看到了它。 但是这里有个问题就是,我们并不能够像 `GameObject/XXX` 这样,把选项放在 `UI` 的外面,这样做的话,我们只会在顶部栏的 `GameObject` 目录下发现那个 `XXX` 的选项,在 Hierarchy 什么也不会有,这点需要大家注意。 ## 菜单创建窗口 ## public class MenuTest : EditorWindow { [MenuItem("Release/hello")] static void Execute() { EditorWindow.GetWindow(typeof(MenuTest), false, "hello").Show(); } } 显示空窗口 ## SceneView ## 如果你想让你的GUI的东西总是显示在场景窗口你可以做如下: public class MyClass{ static MyStaticConstructor() { SceneView.onSceneGUIDelegate += OnScene; } static void OnScene(SceneView sceneView) { // Draw GUI stuff here for Scene window display } } 此代码将运行,只要你按活动,将吸引任何你希望在你的场景的窗口。 如何做到scene view中事件响应,映射到创建的窗体,ctrl + 鼠标左键单击 [MenuItem("Release/hello")] static void Execute() { MenuTest test = EditorWindow.GetWindow (typeof(MenuTest), false, "hello") as MenuTest; SceneView.onSceneGUIDelegate += test.OnSceneGUI; test.Show(); } private void OnSceneGUI(SceneView sv) { switch (Event.current.type) { case EventType.mouseDown: { if (Event.current.control && Event.current.button == 0) { Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, Mathf.Infinity)) { Event.current.Use(); Repaint(); } } } break; } } 0 means left mouse button, 1 means right mouse button, 2 means middle mouse button. Used in [EventType.MouseDown][], [EventType.MouseUp][] events. 0表示鼠标左键,1表示鼠标右键,2表示鼠标中键。在[EventType.MouseDown][],[EventType.MouseUp][]事件中使用。 [Image 1]: [EventType.MouseDown]: http://www.ceeger.com/Script/Enumerations/EventType/EventType.MouseDown.html [EventType.MouseUp]: http://www.ceeger.com/Script/Enumerations/EventType/EventType.MouseUp.html
相关 Unity Editor自定义菜单排序(MenuItem Order) 扩展Unity的菜单MenuItem MenuItem 属性用于向主菜单和检视面板上下文菜单添加菜单项。 该 MenuItem 属性能够将任何静态函数转变为菜单命令,仅静 爱被打了一巴掌/ 2022年10月17日 04:18/ 0 赞/ 262 阅读
相关 微信js-sdk:关于menuItem:delete按钮无法显示的问题 看微信的朋友圈,可以点击缩略图,预览图片,并对图片进行删除操作,于是客户提出这个需求,当时感觉应该也比较简单。 大体思路如下: wx.previewImage( 超、凢脫俗/ 2022年09月23日 10:54/ 0 赞/ 142 阅读
相关 利用HTML 5中的Menu和Menuitem元素快速创建菜单 ![Center][] 原文:[Introducing the HTML5 “Menu” and “Menuitem” Elements][Introducing the H 待我称王封你为后i/ 2022年08月05日 17:58/ 0 赞/ 195 阅读
相关 MenuItem遇到类 [EditorWindow][]编辑器窗口 Derive from this class to create an editor window. 从这个类来创建编辑器窗 梦里梦外;/ 2022年06月18日 12:59/ 0 赞/ 137 阅读
相关 MenuItem `MenuItem菜单基本操作unity 4.6.2` `` `http://www.ceeger.com/Script/ScriptableObject/Scrip 红太狼/ 2022年06月16日 22:47/ 0 赞/ 101 阅读
相关 7.自定义快捷键([MenuItem("QFramework/7.自定义快捷键 %e")]) %e 即为快捷键的符号,意思是Ctrl+E if UNITY_EDITOR using System.IO; using UnityEditor; 今天药忘吃喽~/ 2021年09月17日 11:26/ 0 赞/ 383 阅读
相关 6.复用 MenuItem( EditorApplication.ExecuteMenuItem("QFramework/4.导出 UnityPackage");) 既打开文件夹,还导出包 if UNITY_EDITOR using System.IO; using UnityEditor; endif Bertha 。/ 2021年09月17日 11:26/ 0 赞/ 168 阅读
相关 nw.js node-webkit系列(8)Native UI API MenuItem的使用 菜单项MenuItem在菜单里代表其中一个选项。它可以作为分割线也可以作为一个普通的选项,但它必须具备标题和图标,菜单项通常情况下会跟菜单Menu一起使用。 (一)例子 Bertha 。/ 2021年09月10日 20:02/ 0 赞/ 201 阅读
还没有评论,来说两句吧...