Unity的扩展编辑器支持三种形式:

  • 编辑器窗口:EditorWindow,弹出窗口
  • 属性绘制器:PropertyDrawer,改写OnGUI属性。
  • 自定义编辑器:Editor,改写一个类的Inspector界面。

自定义编辑器

主要函数OnInspectorGUI,这个函数会在每次改动的时候进行重新调用。

在InspectorGUI中,使用Time.frameCount可以发现,只有在发生UI交互的时候才会进行重绘。

使用CustomEditor(typeof(XXX))可以指定某一个对象的编辑器。当Selection.activeObjectXXX类型的对象的时候,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.