本系列文章用于个人复习总结,比较简短,不会穷尽细节。
如果你准备学习相关内容,建议粗略浏览本系列文章,用作预习材料。

前言

Unity的编辑器拓展有两个UI框架,分别是传统的IMGUI和较新的UIToolkit。
IMGUI即即时模式GUI,其所有组件绘制和处理逻辑都塞在一个C#函数里,每次调用这个函数都会重新绘制整个UI。对于简单的编辑器拓展,IMGUI非常简洁,组件功能上的代码也非常直观,但是及其不适合处理较复杂的布局。
UIToolkit模仿网页开发,使用uxml和uss绘制UI,且内置有UIBuilder工具来帮助创作,即便是不具有编程能力的策划或UI设计也能参与UI的直接搭建。
初学Unity编辑器拓展时我最先接触的是UIToolkit。当时我还没接触过Unity的IMGUI,只知道布局和组件绘制都靠编码,听上去就很令人发怵;后来实际学习后发现由于Unity内置了不少辅助布局的函数,使用IMGUI做简单拓展的时候还是很轻松的,比UIToolkit强。
有大佬说过IMGUI和UIToolkit都是答辩,可我确实也没用过什么好的(。总之,根据我目前的经验,越简单的拓展用IMGUI越方便,越复杂的拓展用UIToolkit越合适。本系列文章只关注我近期学习的IMGUI。


目录

基本的Unity编辑器拓展根据拓展对象大致可以分为以下四类

其中前三类从下到上存在包含关系,可以用来展示一些数据和实现各种功能;最后一类一般只用作可视化。后面的文章将依次介绍四类拓展并提供示例。

基础:UI控件

不过在学习这几个维度的拓展之前,我们需要先简单看一下编辑的最小维度:UI控件。
IMGUI编辑器拓展使用的UI控件和方法主要来自EditorGUI、EditorGUILayout、GUI、GUILayout四个类。他们有哪些方法官方文档里写的很清楚,详细讲解的优秀博文也很多,我就不再赘述,只是简单讲一下它们的应用场景。

EditorGUI

  • 包含多种静态方法来创建UI控件,这些方法都直接以控件名命名,且都需要传入一个Rect类型的参数来确定布局

    EditorGUILayout

  • 自动布局版的EditorGUI,其中有很多便利的布局方法,如BeginHorizontal和EndHorizontal两个方法之间的UI控件都会水平排列。
  • EditorGUI中的大部分创建UI控件的方法在EditorGUILayout都有不需要Rect类型参数的同名方法,可以将布局交给Unity来自行处理,做简单拓展时非常方便。但EditorGUILayout并不包含EditorGUI中的所有UI控件,如进度条(ProgressBar),若有需求还是要用到EditorGUI
  • 在有些场景,如编写PropertyDrawer的子类时,只能使用EditorGUI而不可以使用EditorGUILayout。如果使用则会发生报错。
    Screenshot 2023-08-14 102147.png
  • EditorGUI和EditorGUILayout可以在一个函数中混用

    GUI和GUILayout

    这两者的关系和EditorGUI与EditorGUILayout的关系是一样的。一般我们拓展编辑器使用的UI控件都在EditorGUI和EditorGUILayout中,但也有一些要在GUI和GUILayout中,如按钮控件(Button)。
    以前GUI和GUILayout也主要用在游戏内的UI,但现在游戏内早就全改用UGUI了(甚至更新的UIElement)。所以这两个类不带“Editor”这个前缀却也基本只用于编辑器拓展。

辅助类(Utility)

除了这些用于创建UI控件的,还有几个辅助类:EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility。这些类的使用频率相对来说没有那么高,但也有必要了解一下。

延伸

关于UI控件
关于辅助类(标红为常用方法)