📨

EditorGUILayout 和 EditorGUI

EditorGUILayout 是对应 EditorGUI 的自动排列(auto-layouted)的版本,默认情况下由 Unity 预先规定的布局方式从上到下依次排列。二者都主要用于扩展编辑器中的 GUI,下边列表详细列出了 EditorGUILayout 可以生成的多种区域:

EditorGUILayout 可以生成的控制区域

Name示例程序说明
BoundsField生成控制 Bounds 变量的区域
BoundsIntField生成控制 BoundsField 变量的区域
ColorField生成控制颜色类 Color 的区域
CurveField生成控制和编辑 AnimationCurve 动画曲线类的区域
DelayedDoubleField, DelayedFloatField, DelayedIntField, DelayedTextField生成可以键入浮点数、整数、文本且延迟影响变量值的区域
DoubleField, FloatField, IntField, LongField, TextField生成可以键入浮点数、整数、文本且立即影响变量的值的区域
DropdownButton
EnumFlagsField生成一个下拉菜单,为枚举类型中每个值显示一个选项,可以单选、多选或不选
EnumPopup生成一个弹出菜单,为枚举类型中每个值显示一个选项,只可以单选
Foldout生成一个左侧有展开箭头的标签,用于建立树形或文件夹类的组织结构
HelpBox生成一个包含帮助消息的区域
InspectorTitlebar生成一个 Inspector 面板中的标题栏
LabelField, PrefixLabel, SelectableLabel生成标签区域
LayerField, TagField生成可以选择 layertag 的区域
MaskField
ObjectField生成控制 Object 变量的区域
PasswordField生成可以输入密码的区域
Popup, IntPopup生成一个可选择单个选项的的弹出菜单
PropertyField
RectField, RectIntField生成控制 RectRectInt 变量的区域
Slider, IntSlider, MinMaxSlider生成用户可拖动的滑动条
Space在两个区域之间添加空白
TextArea生成一块显示可编辑文本的区域
Toggle, ToggleLeft生成一个开关
Vector2Field, Vector2IntField, Vector3Field, Vector3IntField, Vector4Field生成控制向量 Vec2 Vec2int Vec3 Vec3Int Vec4 的区域

此外,EditorGUILayout 还可以产生一些特殊的布局样式、动画特效,一般由两个名称相对应的静态函数组合使用:

EditorGUILayout 其他静态方法

Name示例程序说明
BeginFadeGroup, EndFadeGroup绘制一个区域组,隐藏和显示之间以动画过渡
BeginHorizontal, EndHorizontal, BeginVertical, EndVertical开启/关闭水平或垂直绘制模式
BeginScrollView, EndScrollView绘制可以滑动的视图
BeginToggleGroup, EndToggleGroup竖直绘制一个开关组,可以同时禁用或启用所有开关

EditorGUI 中包含的绝大多数静态函数和 EditorGUILayout 类似。由于 EditorGUI 需要由用户指定具体的布局格式,所以其静态函数需要多指定一个 Rect 变量,表示绘制的该 GUI 部件的矩形区域。例如 TextArea 的用法:

public static string TextArea(Rect position, string text, GUIStyle style = EditorStyles.textField); 

其中参数 position 确定了文本区域的绘制位置,例如:

public override void OnInspectorGUI () {
		_target.Text = EditorGUI.TextArea (new Rect (30, 50, 100, 100), _target.Text);
}

编译结果如下:

可以看出 EditorGUI 绘制区域参考的坐标系是以窗口的左上顶点为原点,水平向右为横轴正方向,竖直向下为纵轴正方向。

基于此, EditorGUI 实际上不适合用于扩展 Inspector 面板。因为 Inspector 面板已经包含顶部可以修改物体名称、标签和层的区域和 Transform 属性的区域,所以通过 EditorGUI 绘制区域需要先计算这两个部分的宽高,然后再绘制。相比之下, EditorGUI 更适合用于扩展新的编辑器窗口。