Unity编辑器拓展基础总结
前言
从事Unity编辑器拓展也有一段时间了,该记录一下常见的知识点了,也方便自己日后查阅
结构
Unity编辑器拓展主要分为3大类
- UnityEngine.GUI:可用于编辑器和运行时,需要自行计算Rect
- UnityEditor.EditorGUI:只可用于编辑器,需要自行计算Rect
- UnityEditor.EditorGUILayout:只可用于编辑器,自动计算Rect
其中UnityEditor.EditorGUILayout基于UnityEditor.EditorGUI实现
常见类
Rect
这个类型在编辑器拓展中十分常见,官方解释为
A 2D Rectangle defined by X and Y position, width and height.
一个由X,Y坐标,width,height宽高定义的2D矩形
其以左上角为坐标原点,X往右递增,Y往下递增
更加详细介绍可参照:Unity Rect官方文档
GUIContent
GUIContent定义了一个GUI Item内容,最完整的构造函数如下
1 | //构建同时包含文本,图片和定义的tooltip的GUIContent。 当用户将鼠标悬停在其上方时,全局GUI.tooltip会被设置为这个tooltip |
GUIStyle
一个GUIStyle定义了一个GUI Item的样式,最完整的构造函数如下
1 | public GUIStyle(GUIStyle other) |
但是我们最常用的还是string的隐式转换
1 | public static implicit operator GUIStyle(string str) |
常用GUIStyle样式可以从Unity常用GUIStyle收集查看
GUISkin
Border:图片渲染的时候的边界,也就是九宫格效果,在图片边界往里指定像素距离不会被缩放,比如一个64x64的边框图片,边框宽为2像素,就需要将Border四个方向的值设置为2,才能达到理想效果,参见:https://forum.unity.com/threads/creating-custom-gui-skins-part-one.113055/
Padding:文本内容四个方向的边距
Event.current
Event.current事件包含了当前帧我们输入的信息,比如鼠标位置,事件类型等,调用event.Use()后会重置一部分输入信息,比如事件类型会被重置为Used,也就是说如果不调用event.Use会将事件穿透下去。
常用编辑器拓展知识
菜单栏拓展
1 | [ ] |
Inspector拓展
1 | [ ] |
双击资源回调
1 | [ ] |
UnityEditor生命周期
1 | UnityEditor.EditorApplication |
Undo/Redo
1 | UnityEditor.Undo |
ScriptableObject序列化相关
- 如果一个ScriptableObject(下面简称为SO)的HideFlag设置为HideInHierarchy,那么LoadAllAssetRepresentationsAtPath会将其忽略
- 如果不将SO保存为Asset,运行游戏后将会被GC,从而丢失引用
资源管理相关
1 | //添加子Asset |
保存资源时,保险起见应当进行
- EditorUtility.SetDirty
- AssetDatabase.SaveAssets
- AssetDatabase.Refresh
TreeView
Unity 折叠树
https://blog.csdn.net/e295166319/article/details/52370575
这个特性其实EditorGUILayout.BeginFoldoutHeaderGroup也可与之对位
AdvancedDropdown
其他资源
Unity Editor中所有图标,包含所有Unity Editor中图标,方便使用
Unity开源的CSharp部分,可在其中找到自己想要实现的Editor样式源码
Unity编辑器拓展手册,超全,日文版,但是内容十分详尽
总结
Unity编辑器拓展知识点十分琐碎,是一个不断积累的过程,共勉。