mypro334 发表于 2022-5-19 17:37

Unity编辑器扩展小百科

一、前言

之前实现的编辑器扩展效果,过段时间就忘了,重新找实现方法,很浪费时间,还是写一个小总结,方便日后快速定位吧。
本文主要介绍unity编辑器扩展中常用到的一些特性,编辑器类,以及一些小技巧。
由于是全局总结性的,内容会涉及的比较多,所以仅介绍大概功能,可以做为一个快速检索相关知识的小知识库。具体实现还可以继续搜关键字(相关的文章挺多了,没必要反复写)。
对老手而言本文可能相当于一个备忘录,对新手而言本文可以作为编辑器扩展的知识目录,搜索本文的关键词,可以继续深入研究。
二、扩展小知识

2.1.如何魔改unity项目视图和层级视图

EditorApplication.hierarchyWindowItemOnGUI
EditorApplication.projectWindowItemOnGUI
2.2 如何添加右击组件显示菜单

方法一:
static void Func(MenuCommand cmd){}
MenuCommand用来传递点击的组件对象
方法二:方法用
属性用
2.3 如何编写可撤销的编辑器功能

用undo类来实现操作即可
2.4 MenuItem相关知识

1)添加unity下拉菜单:

static void Func(MenuCommand cmd){}
2)快捷键设置:%代表Ctrl,#代表shift&代表alt如果只有单个字母,假如单击A,则为_a;
3)MenuItem验证功能:首先MenuItem中菜单路径保持一致,其次第二个参数valid 为true。
2.5 属性展示相关

默认展示public属性的变量,展示private、或protect变量需添加属性,
如果展示的变量是类(例子中的TestSubClass),类需要添加属性或也继承自ScriptableObject
2.6 更改检视版(inspector)展示

需要一个继承自Editor的类,同时给此类添加属性,这时候检视版的效果就可以在OnInspectorGUI中重写了。
2.7 弹窗实现

方法一:EditorUtility提供了很多已有的弹窗功能,可以直接使用
方法二: 创建ScriptableWizard窗口
1)继承ScriptableWizard;
2)errorString error信息、helpString:帮助信息;
3)展示窗口 ScriptableWizard.Displayward()即可,按钮等可查看文档获得,简单实用。
2.8 高亮选中一个资源

EditorGUIUtility.PingObject()。EditorGUIUtility还有其他还用的方法,可以自行查看。
2.9 自定义下拉菜单

核心类GenericMenu,addItem()添加子菜单,ShowAsContext()显示子菜单。
2.10 获得上一次绘制的gui的矩形区域

GUILayoutUtility.GetLastRect()
2.11 拦截编辑器事件

Event.current.Use() 将事件拦下,不再传播
2.12 unity开发者模式

开启开发者模式:
UnityEditor.EditorPrefs.SetBool("DeveloperMode", true);
关闭开发者模式:
UnityEditor.EditorPrefs.SetBool("DeveloperMode", false);
2.13 更改检视版脚本标题栏图标

在Assets下直接建立Gizmos文件夹,文件夹下放上图标,图标名为脚本名+空格+Icon
2.14 ToolTips提示功能

首先有tooltips属性可以支持editor面板下的提示
其次有 Guicontent中tooltips也可以支持
2.15 CustomPropertyDrawer 自定义属性显示效果

简介:只要加上自定义的特性,就可以重新绘制unity editor中ScriptProperty中的指定属性,常用于更改monobehaviour中的属性的样式,不用改对应的inspector类,只用加特性就好了
步骤:
1. 实现新特性,需继承PropertyAttribute;
2. 实现新加特性对应的drawer,需继承PropertyDrawer,并重载其ongui方法;
3. 之后就可以将特性加到对应的属性上,属性在inspector的绘制效果就会变为新加的;
4. 此模式下需使用EditorGuilayout.PropertyField展示。
2.16 资源导入首次导入更新设置

资源导入器 AssetPostProcessor,继承此类,在实现其下处理对应资源的方法即可,图1为处理模型数据的例子。



图1 Model导入案例

2.17 asset后缀文件相关工具

asset文件用来存储对象实例化后的数据,它可以方便的把类对象序列化并以文件的形式存储在本地,同时可以在unity提供的面板方便的进行编辑修改。
1)什么样的类可以生成asset文件?
继承自ScriptableObject的类。
2)如何创建asset文件
方法一:在继承类ScriptableObject的类上添加属性,这样就可以在Assets/Create/菜单路径快速创建序列化的脚本资源;
方法二:通过ScriptableObject.CreateInstance<类>()方法创建实例,在用AssetDatabase.CreateAsset(asset, "路径")保存在本地;
三、常用扩展特性

3.1 AddComponentMenuAttribute

导航栏菜单。
3.2 ContextMenuAttribute

右键菜单
3.3 HeaderAttribute

添加个标题头。
3.4 HideInInspector

可以让public变量在Inspector上隐藏,无法在Editor中进行编辑。
3.5 MultilineAttribute

支持输入多行文本。
3.6 RangeAttribute

限定输入值的范围。
3.7 RequireComponent

组件依赖,使用该组件后自动添加依赖组件
3.8 RuntimeInitializeOnLoadMethodAttribute

系统运行时自动调用,方法调用的时间 awake前或者onenable后。
3.9 SerializeField

强制对变量进行序列化,即使变量是private。
3.10 SpaceAttribute

增加空位。
3.11 TooltipAttribute

提示信息,当鼠标移到Inspector上时显示相应的提示。
3.12 InitializeOnLoadAttribute

unity在刚打开使,或重新编译后会调用带有该特性的静态方法
3.13 InitializeOnLoadMethodAttribute

使方法在初始化时被调用。
3.14 MenuItemAttribute

导航栏的菜单项。
3.15 OnOpenAssetAttribute

在unity中双击某个资源会调用代用这个特性的方法,可以用来自定义打开文件的效果。
四、常用扩展类

unity自带了很多编辑器扩展常用的类,提供的操作非常丰富,简介如下:
4.1 EditorApplication

主应用程序类,其中包含了很多记录unity状态的数据,以及扩展的回调,非常使用。
4.2 EditorUtility

封装了编辑器常用的小弹窗,使用简单方便。
4.3 EditorGUILayout

IMGUI绘制编辑器效果的核心布局类,扩展过编辑器的同学对他应该很熟悉。
4.4 EditorGUI

通用用于IMGUI绘制编辑器,只不过没有布局,参数全是绝对位置。
4.5 GUI

同EditorGUI类似,方法略有不同,而且可以在运行时使用。
4.6 GUILayout

同EditorGUILayout类似,方法略有不同,而且可以在运行时使用。
4.7 EditorGUIUtility

提供编辑器扩展常用的方法,如copy至缓存buffer等。
4.8 GUILayoutUtility

提供编辑器扩展常用的方法,而且可以在运行时使用。
4.9 Undo

开发可使用Ctrl+Z回退的操作时需要。
4.10 EditorSceneManager

提供编辑器模式下操作场景的方法。
4.11 AssetDatabase

编辑器下资源相关操作。
4.12 DragAndDrop

为编辑器工具提供拖拽支持。
4.13 FileUtil

unity封装的文件操作。
4.14 Help

在你的编辑器中,如果你觉得你的文字不足以表达,或者需要用户查询相关文档,那你可以使用HELP,它提供了打开网页地址的功能。
4.15 ObjectPreview

创建自定义预览效果。
4.16 Tools

操作unity scene视图中的一些工具。
4.17 BaseHierarchySort

可以重写层级视图的排序规则。
4.18 SceneView

可以控制编辑器中的场景视图。
4.19 ReorderableList

优化List类型在编辑器的显示效果。
4.20 GenericMenu

自定义下拉菜单。
五、结语

随着游戏工业化的推进。编辑器工具需求日益增多。除了unity编辑器扩展,还有其他像maya,3dMax等工具的扩展需求也日益增多。除此之外也可以用python来实现外部的一些工具,库非常强大,实现方便。
本文的内容可能不够全面,如果有没有提到的相关内容,欢迎大家在评论区告诉我。
本文仍在持续完善优化中...
页: [1]
查看完整版本: Unity编辑器扩展小百科