Unity的扩展编辑器支持三种形式:
- 编辑器窗口:EditorWindow,弹出窗口
- 属性绘制器:PropertyDrawer,改写OnGUI属性。
- 自定义编辑器:Editor,改写一个类的Inspector界面。
自定义编辑器
主要函数OnInspectorGUI,这个函数会在每次改动的时候进行重新调用。
在InspectorGUI中,使用Time.frameCount可以发现,只有在发生UI交互的时候才会进行重绘。
使用CustomEditor(typeof(XXX))
可以指定某一个对象的编辑器。当Selection.activeObject
是XXX
类型的对象的时候,Unity就会调用CustomEditor所注解类的OnInspectorGUI()
绘制UI界面。
[CustomEditor(typeof(PlatformSdkConfig))]
public class PlatformSdkConfigEditor : UnityEditor.Editor
{
如果不改写OnInspectorGUI()
方法,就会显示对象PlatformSdkConfig
的成员变量编辑器。
如果改写了OnInspectorGUI()
,并且是一个空的函数。则什么都不会显示。 使用base.OnInsectorGUI()
可以实现重新显示成员变量编辑器。
Unity的GUI常用范式:IMGUI
Unity的编辑器扩展,目前主要使用IMGUI。IMGUI意思是Instant Mode GUI,立即模式GUI。
核心在于每一帧都会调用OnGUI()、OnInspectorGUI()绘制界面,在绘制界面的同时检测用户是否执行了某个操作,在这个OnGUI()、OnInspector()函数里面同时实现实现UI显示和数据绑定。
OnGUI(){
data=UI组件(data);
}
UI组件接收数据并进行渲染,然后返回数据。这跟React也有点像。
在OnGUI里面可以随意写for循环和条件语句。
IMGUI的常用类
- GUI:需要矩形布局
- GUILayout:自动布局
- EditorGUILayout:Editor中的自动布局
枚举框
- EditorGUILayout.EnumPopup:只能单选的枚举下拉框
- EditorGUILayout.EnumFlagsField:可多选的枚举下拉框
如果使用asset方式存储配置文件,则需要把对象单独定义一个文件
如果使用Unity的方式保存一个ScriptableObject,则这个Object必须放在一个单独的文件里面。原因是Unity的Asset是一个yaml文件,里面记录着一些fileId,必须做到一个文件里面只有一个东西。例如MonoBehavior这种,文件名和类名必须保持一致。
No script asset for PresetConfig. Check that the definition is in a file of the same name and that it compiles properly.