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 | 生成可以选择 layer 或 tag 的区域 | |
MaskField | ||
ObjectField | 生成控制 Object 变量的区域 | |
PasswordField | 生成可以输入密码的区域 | |
Popup, IntPopup | 生成一个可选择单个选项的的弹出菜单 | |
PropertyField | ||
RectField, RectIntField | 生成控制 Rect 或 RectInt 变量的区域 | |
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
更适合用于扩展新的编辑器窗口。