Unity 编辑器扩展总结 一:编辑器开发入门 您所在的位置:网站首页 unity3d安装编辑器模块要选什么 Unity 编辑器扩展总结 一:编辑器开发入门

Unity 编辑器扩展总结 一:编辑器开发入门

#Unity 编辑器扩展总结 一:编辑器开发入门| 来源: 网络整理| 查看: 265

编辑器扩展总结

工欲善其事必先利其器

引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。如若博客中存在错误,还请不吝赐教。所有参考的博客或者视频来源将在文末展示。 扩展: 在Unity2019.1版本后,官方推出全新的保留模式UI框架-UIElements,是一款可以轻松扩展unity编辑器的工具,未来版本可能会支持游戏运行模式。 开发版本: Unity 2018.1.3f1

相关博客传送门 一、编辑器开发入门

二、编辑器的相关特性

三、自定义Inspector面板

四、创建编辑器窗体

五、Gizmos辅助调试工具

六、扩展Scene视图

七、数组或list集合的显示方式

八、EditorPrefs、ScriptableObject、Undo

九、GUIStyle、GUISkin

十、AssetPostprocessor资源导入管线

文章目录 编辑器扩展总结编辑器开发入门编辑器相关文件夹介绍[MenuItem]CONTEXTMenuCommandContextMenu、ContextMenuItemSelection参考资料

编辑器开发入门 编辑器相关文件夹介绍 Editor 该文件夹可以放在项目的任何文件夹下,可以有多个"Editor"文件夹。编辑器扩展相关的脚本都要放在该文件夹内,该文件夹中的脚本只会对Unity编辑器起作用。项目打包的时候,不会被打包到项目中。如果编辑器相关脚本不放在该文件夹中,打包项目可能会出错。如果非要有些编辑器相关脚本不放在该文件夹中,需要在该类的前后加上UNITY_EDITOR的宏定义 Editor Default Resources 该文件夹需要放在Assets根目录下,用来存储编辑器所需要的图片等资源,书写的时候需要注意中间有空格隔开。此文件夹也不会被打包,访问方法为:EditorGUIUtility.Load()当然,也可以在Editor文件夹内创建一个Resources文件夹,将相关资源放在该文件夹内,通过Resources.Load()获取资源,也是可以的 Gizmos 该文件夹也需要放在Assets根目录下,可以用来存放Gizmos.DrawIcon()的图片资源

编辑器扩展的命名空间: Using UnityEditor

[MenuItem]

添加菜单栏按钮 [MenuItem(“MyTools/test1”,false,priority)]

第一个参数用来表示菜单的路径;第二个参数用来判断是否是有效函数,是否需要显示;第三个参数priority是优先级,用来表示菜单按钮的先后顺序,默认值为1000。一般菜单中的分栏,数值相差大于10。注意需要是静态方法 例如:[MenuItem(“MyTools/test1”)] 也可以添加在Unity默认的菜单栏中,例如添加到Window菜单中,[MenuItem(“Window/test2”)],添加到Assets下,[MenuItem(“Assets/Project中的按钮”)]

实现点击菜单按钮,删除场景或者Project中选中的多个对象

[MenuItem("MyTool/DeleteAllObj", true)] private static bool DeleteValidate() { if (Selection.objects.Length > 0) return true; else return false; } [MenuItem("MyTool/DeleteAllObj",false)] private static void MyToolDelete() { //Selection.objects 返回场景或者Project中选择的多个对象 foreach (Object item in Selection.objects) { //记录删除操作,允许撤销 Undo.DestroyObjectImmediate(item); } }

DeleteValidate方法是MyToolDelete方法的有效函数,所以第二个参数为true。该有效函数用来判断当前是否选择了对象,如果选择了,返回true,才可以执行MyToolDelete方法。

添加快捷键

符号字符%Ctr/Command#Shift&AltLEFT/Right/UP/DOWN方向键F1-F2F功能键_g字母g

例如:[MenuItem(“MyTools/test1 %_q”)] 快捷键 Ctrl+Q

CONTEXT

给某组件添加右键菜单选项 [MenuItem(“CONTEXT/组件名/按钮名”)] 注意CONTEXT大写

[MenuItem("CONTEXT/Rigidbody/Init")] private static void RigidbodyInit() { //TODO } MenuCommand

用于获取当前操作的组件 如下,给自定义的组件PlayerHealth添加右键Init按钮

[MenuItem("CONTEXT/PlayerHealth/Init")] static void Init(MenuCommand cmd) { PlayerHealth health = cmd.contex as PlayerHealth; } ContextMenu、ContextMenuItem

给某组件添加右边小齿轮菜单选项

[ContextMenu("FunctionName")] public void FunctionName() { //ToDo }

给某属性添加右键菜单选项

[ContextMenuItem("Handle", "HandleHealth")] public float health; private void HandleHealth() { //ToDo }

P.S. 这两个特性是在UnityEngine命名空间下的,而不像其他[MenuItem]、Selection是在UnityEditor下的。

Selection

用于获取选择的游戏物体

Selection.activeGameObject 返回第一个选择的场景中的对象Selection.gameObjects 返回场景中选择的多个对象,包含预制体等Selection.objects 返回选择的多个对象 //遍历选择的对象,并立刻销毁 foreach(object obj in Selection.objects) { DestroyImmediate(obj); }

P.S. Destroy方法会将删除的对象放在缓存中,缓存满了,才完全删除,而在编辑器未运行的时候,是没有这片缓存的,所以需要用DestroyImmediate(),立刻销毁。当然,可以直接使用Undo.DestroyObjectImmediate()来销毁对象并记录销毁操作

参考资料

编辑器特殊文件夹及内置资源读取

Unity编辑器小教程

MenuItem和ContextMenu的使用方法



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有