Unity Editor Extensions – Menu Items

转载请注明出处:http://blog.csdn.net/u010019717

更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.html

Unity 编辑器允许添加自定义菜单的外观和行为类似内置菜单。这可以用于添加经常常用的功能,可直接从编辑器UI操作。

在这篇文章中,我将展示如何利用新的菜单menu items,Unity 编辑器中创建并尝试提供真实世界的例子用法,对于每个描述的topic。

添加菜单项

为了向top-level工具栏中添加一个新的菜单,您应该创建一个编辑器脚本(放在项目中一个名为Editor文件夹下任意位置的脚本文件)。在脚本代码中为用MenuItem attribute标记的static静态方法来创建菜单项items。

例如,很容易添加一个新的Tools”菜单 (或与您的company’s  top-level菜单),提供了由您的team/company.常用的选项。

下面是添加了新的Tools菜单,它 (清除PlayerPrefs的所有数据) 下方的某个选项的示例:

这创建了一个新的编辑器菜单调用Tools,和在菜单它之下的地方item叫PlayerPrefs:

usingUnityEngine;
usingUnityEditor;
publicclassMenuItems
{
    [MenuItem("Tools/ClearPlayerPrefs")]
    privatestaticvoidNewMenuOption()
    {
        PlayerPrefs.DeleteAll();
    }
}

它也可以创建新的菜单项,根据现有的菜单 (例如: 在Window菜单下),并可创建多个级别的菜单更好地安排和组织 (推荐):

usingUnityEngine;
usingUnityEditor;

publicclassMenuItemsExample
{
    // Add a new menu item under an existingmenu
    [MenuItem("Window/New Option")]
    privatestaticvoidNewMenuOption()
    {
    }
    // Add a menu item with multiple levels ofnesting
   [MenuItem("Window/SubMenu/Option")]
    privatestaticvoidNewNestedOption()
    {
    }
}

这结果如下列菜单项:

热键

若要允许使用键盘操作更快,可以用热键----快捷组合键,将自动启动他们分配新的菜单项。

这些都是支持的键(也可以在一起组合):

?%— — 在 Windows 上的 CTRL / CMDOSX 上

?#— — Shift

?&— — Alt 键

?LEFT/RIGHT/UP/DOWN---—Arrow箭头键

?F1......F2 — — F键

?HOME, END,PGUP, PGDN

由向其中添加下划线前缀添加字符键不是键序列的一部分。

热键的字符组合添加到前面的空格的菜单项路径的末尾),如下面的示例所示:

// Add a new menu itemwith hotkey CTRL-SHIFT-A
[MenuItem("Tools/NewOption %#a")]
privatestaticvoidNewMenuOption()
{
}
// Add a new menu itemwith hotkey CTRL-G
[MenuItem("Tools/Item%g")]
privatestaticvoidNewNestedOption()
{
}
// Add a new menu itemwith hotkey G
[MenuItem("Tools/Item2_g")]
privatestaticvoidNewOptionWithHotkey()
{
}

热键菜单项将显示用于启动它们的键组合。例如,上面的代码中将导致此菜单:

注: 还有重叠热键没有验证 !定义多个具有相同的热键的结果是菜单项仅 1 选项命中。

特殊路径

正如见,传递给MenuItem attribute控制下,将置于顶层菜单的新项目的路径。

unity有几个“special”的路径作为上下文菜单(可使用右键单击的菜单):

?Assets – 项目将可在“Assets”菜单,以及使用project视图中的右键单击。

?Assets/Create –点击project视图中“Create”按钮时将列出items列表(添加新的类型,可以添加到项目时,这是很有用的)

?CONTEXT/ComponentName –items将可通过右键单击里面的给定组件inspector检查器。

下面是一些示例如何使用这些特殊的路径:

// Add a new menu itemthat is accessed by right-clicking on an asset in the project view
[MenuItem("Assets/LoadAdditive Scene")]
privatestaticvoidLoadAdditiveScene()
{
    varselected = Selection.activeObject;
   EditorApplication.OpenSceneAdditive(AssetDatabase.GetAssetPath(selected));
}
// Adding a new menu itemunder Assets/Create
[MenuItem("Assets/Create/AddConfiguration")]
privatestaticvoidAddConfig()
{
    // Create and add a new ScriptableObjectfor storing configuration
}
// Add a new menu itemthat is accessed by right-clicking inside the RigidBody component
[MenuItem("CONTEXT/Rigidbody/NewOption")]
privatestaticvoidNewOpenForRigidBody()
{
}

此代码段的结果是这些新的菜单选项:

Assets (project view),用鼠标右键单击菜单

新的选项可从Asset’s CREATE按钮

上下文菜单选项新的刚体组件

验证validation

某些菜单项仅在给定的上下文中有意义。启用禁用的菜单项根据其使用的上下文是通过添加验证方法。

验证方法是标记该菜单项的属性,将true参数传递给验证的静态方法。

该验证方法应该具有的菜单验证,并应返回一个布尔值,以确定是否该菜单项是活动的或不相同的菜单路径。

例如,验证方法可以用于添加Texture assets只有在project视图下用鼠标右键单击菜单:

[MenuItem("Assets/ProcessTexture")]
privatestaticvoidDoSomethingWithTexture()
{
}
// Note that we pass thesame path, and also pass "true" to the second argument.
[MenuItem(,"Assets/ProcessTexture"true)]
privatestaticboolNewMenuOptionValidation()
{
    // This returns true when the selectedobject is a Texture2D (the menu item will be disabled otherwise).
    returnSelection.activeObject.GetType() ==typeof(Texture2D);
}

当右键单击任何不在project视图中的纹理,项目菜单选项将被禁用(显示为灰色):

具有优先级的控制命令

Priority的值是可以分配给菜单项,根菜单下的菜单项的控件顺序(传递给MenuItem attribute)。

菜单项也会自动按其指定的优先级,增量为 50:

[MenuItem(false"NewMenu/Option1",, 1)]
privatestaticvoidNewMenuOption()
{
}
[MenuItem(false"NewMenu/Option2",, 2)]
privatestaticvoidNewMenuOption2()
{
}
[MenuItem(false"NewMenu/Option3",, 3)]
privatestaticvoidNewMenuOption3()
{
}
[MenuItem(,"NewMenu/Option4"false, 51)]
privatestaticvoidNewMenuOption4()
{
}

[MenuItem(,"NewMenu/Option5"false, 52)]
privatestaticvoidNewMenuOption5()
{
}

代码示例的结果在菜单中有 2组items,根据分配的优先级:

如果需要添加和组织下现有的unity菜单的菜单项,需要有点“guesswork”,如大多数内置菜单项使用的优先事项。另一个选项是使用反射器之类的工具,看看内部unity代码(如 UnityEditor.CreateBuildInWindows) 是负责创建某些菜单编辑器中的源代码。

相关的类

下面是几个额外的classes相关的添加新的菜单项的列表。

MenuCommand

当将新的菜单项添加到inspector(如上文所述,使用“CONTEXT/Component”),有时就需要获取实际的组件的引用 (例如: 若要修改其数据)。

这可以通过将MenuCommand参数添加到静态定义的方法的新菜单项:

[MenuItem("CONTEXT/RigidBody/NewOption")]
privatestaticvoidNewMenuOption(MenuCommandmenuCommand)
{
    // The RigidBody component can be extractedfrom the menu command using the context field.
    varrigid = menuCommand.context asRigidBody;
}

看到在代码示例中,调用菜单项时,可以使用context字段访问组件,作为其上下文。

快捷菜单

此attribute允许定义上下文菜单项。这工作完全相同的定义的方法,具有带路径"CONTEXT /..."开头MenuItem attribute。

不同的是使用此attribute,您定义默认的上下文菜单,对于给定的组件,而与菜单项的方法,你“extend”其他组件的菜单(例如 — — 是引擎的部分的默认组件)。

示例— — 公开组件的上下文菜单选项,以清除其数据:

publicclassNameBehaviour: MonoBehaviour
{
    publicstringName;

    [ContextMenu("Reset Name")]
    privatestaticvoidResetName()
    {
        Name = string.Empty;

    }
}

ContextMenuItem

此attribute被添加到组件 (MonoBehaviour) 类,以允许添加上下文菜单在finerresolution。虽然ContextMenu attribute以上所示的快捷菜单属性在组件级别添加,则标记具有此属性的字段添加到个别的公共字段右击菜单。

由于此属性添加到一个字段并不是一种方法,它接受 2 个参数:菜单项和一个方法的名称(instance方法)选中菜单项时要调用的显示名称。

示例 — — 添加方法以随机初始化组件字段到某种状态:

publicclassNameBehaviour: MonoBehaviour
{
    [ContextMenuItem("RandomizeName",  "Randomize")]
    publicstringName;
    privatevoidRandomize()
    {
        Name = "Some Random Name";
    }
}

当用鼠标右键单击在该组件的Name字段,此代码会产生此上下文菜单中:

总结

这篇文章中所示,扩展 Unity 编辑器用自定义菜单可以是相当简单的。

Building一般使用功能和需从编辑器提供适合各种规模的团队可以节省大量的时间。

请观看下一篇文章:Unity EditorExtensions – Custom Inspectors

??

??

时间: 2024-09-30 09:16:47

Unity Editor Extensions – Menu Items的相关文章

Unity Editor Extensions – Custom Inspectors

?? 转载请注明出处:http://blog.csdn.net/u010019717 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.html 这是在"Unity Editor Extension"系列的第 2 次帖子. post描述了为创建自定义inspectors面板在 Unity 编辑器的基本步骤.在该系列的下一个posts,我将深入探讨更高级的主题,例如inspectors及Unity's serializa

Unity编辑器扩展 – Menu Items

参考:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items 通过Unity MenuItem属性类可以扩展主菜单.属性栏内容菜单.层级栏菜单及资源栏菜单. MenuItem可以将任意静态函数转换为菜单命令,只有静态函数能使用MenuItem属性. 添加菜单选项 添加一个简单的主菜单按钮 using UnityEditor; using UnityE

Unity Editor Extensions – Handle 和Gizmos私人定制

孙广东  2015.6.20 3.Layingthe groundwork for our handles为我们处理奠定基础 4.Creatinga handle 5.Drawinglines in the scene view 6.Coloringhandles 7.Dynamicallysizing handles public class TerrainPiece : MonoBehaviour { public SpriteRenderer spriteRenderer; public

[cb]Unity Editor Toolbar 编辑器扩展

1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Button("Apply Collider To Prefab")) { PrefabUtility.ReplacePrefab(simActor.Preview, PrefabUtility.GetPrefabParent(simActor.Preview), ReplacePrefabOptions.ConnectToPrefab); }     2.Current SceneView

Unity Editor 执行时机的问题

在上上篇博文,我提到了Unity编辑器. 即引用 Unity Editor命名空间,且添加[CustomEditor(typeof(Class))] 就可以定制对应Class的Inspector面板. 但这个类本身,也就是ClassEditor的执行事实上并不需要启动Unity项目 这个并不是什么很难发现的事情,因为编写Editor的过程中,对应类的Inspector面板就会变化 只不过如果这个Editor类存在编译错误的话,就会直接报错,从而项目无法启动 原文地址:https://www.cn

Unity Editor模式 Invoke()函数 失效

Unity Editor模式 Invoke()函数 失效 如题今天踩的坑 解决方法 使用EditorApplication.update += 自己的Updata() 使用EditorApplication.timeSinceStartup获取update间隔时间 原文地址:https://www.cnblogs.com/zouqiang/p/11619703.html

Unity Editor Toolbar 编辑器扩展

http://www.cnblogs.com/zhaoqingqing/p/3812368.html 1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Button("Apply Collider To Prefab")) { PrefabUtility.ReplacePrefab(simActor.Preview, PrefabUtility.GetPrefabParent(simActor.Preview), ReplacePrefabO

Unity Editor自定义检视面板

学习了下自定义检视面板的使用,效果图如下: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : MonoBehaviour { public int id; public string Name; [Multiline(5)] public string BackStory; public float health; public float damage; public float

Unity Editor 检查工程Prefab(预设)中的空组件

在我们做项目的过程中 经常会有预设中出现空的脚本 例如: 导致的原因是因为 脚本的丢失 现在我们来做一个检查工程中有空脚本的预设工具 老规矩直接上代码 放到工程就能用 using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; public class PrefabTool : EditorWindow { [MenuItem("Prefab Tool/Check Missing