Lesson3-11 - EditorGUI 控件系列总览

GUILayout vs EditorGUILayout

GUILayout:基础 GUI 自动布局类,所有控件位置自动排列,无需手动设置 Rect。

EditorGUILayout:编辑器专用 GUI 自动布局类,提供更多编辑器相关的控件。

EditorGUI:编辑器 GUI 类,需要手动指定控件位置和大小。

在编辑器拓展开发中,通常使用 EditorGUILayout,因为它提供了更多编辑器功能且自动布局。

Lesson3 - EditorGUI 总览

EditorGUI 包含各种编辑器专用的 UI 控件。实际使用时通常在 EditorWindow 的 OnGUI 方法中调用,使用 EditorGUILayout 版本。

Lesson4 - 文本、层级、标签、颜色

文本标签

1
2
EditorGUILayout.LabelField("标题", "内容");
EditorGUILayout.LabelField("仅显示标题");

层级(Layer)选择

1
int layer = EditorGUILayout.LayerField("选择层级", layer);

点击后显示项目中所有 Layer 的列表。

标签(Tag)选择

1
string tag = EditorGUILayout.TagField("选择标签", tag);

点击后显示项目中所有 Tag 的列表。

颜色选择器

1
2
3
color = EditorGUILayout.ColorField(new GUIContent("选择颜色"), color, 
showAlpha: true, // 显示透明度
hdr: true); // 支持 HDR

点击颜色块打开拾色器窗口,可调整 RGB、透明度等参数。

Lesson5 - 枚举、整数、按钮

枚举单选

1
2
3
public enum MyEnum { Option1, Option2, Option3 }

MyEnum selected = (MyEnum)EditorGUILayout.EnumPopup("选择枚举", selected);

枚举多选(Flags)

1
2
3
4
5
6
7
8
9
[System.Flags]
public enum MyFlags {
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4
}

MyFlags flags = (MyFlags)EditorGUILayout.EnumFlagsField("多选", flags);

多选枚举进行位运算,声明时需要设置正确的值:1、2、4、8 等 2 的幂次。

整数单选框

1
2
3
4
string[] options = { "选项1", "选项2", "选项3" };
int[] values = { 1, 2, 3 };

int selected = EditorGUILayout.IntPopup("选择", selected, options, values);

按下即触发的按钮

1
2
3
if (EditorGUILayout.DropdownButton(new GUIContent("按钮"), FocusType.Passive)) {
Debug.Log("按钮被点击");
}

FocusType.Passive 表示不接收键盘焦点,Keyboard 表示可接收焦点。

Lesson6 - 对象关联、各类型输入

对象关联

1
2
3
GameObject obj = EditorGUILayout.ObjectField("关联对象", obj, 
typeof(GameObject),
allowSceneObjects: true) as GameObject;

参数说明:

  • 标签
  • 当前对象
  • 对象类型
  • 是否允许关联场景中的对象(false 则只能关联资源文件夹中的预制体)

数值输入

整数输入:

1
int intValue = EditorGUILayout.IntField("输入整数", intValue);

浮点数输入:

1
float floatValue = EditorGUILayout.FloatField("输入浮点数", floatValue);

双精度数输入:

1
double doubleValue = EditorGUILayout.DoubleField("输入双精度数", doubleValue);

字符串输入

1
string text = EditorGUILayout.TextField("输入文本", text);

向量输入

1
2
3
Vector2 vec2 = EditorGUILayout.Vector2Field("Vector2", vec2);
Vector3 vec3 = EditorGUILayout.Vector3Field("Vector3", vec3);
Vector4 vec4 = EditorGUILayout.Vector4Field("Vector4", vec4);

其他输入

1
2
Rect rect = EditorGUILayout.RectField("矩形", rect);
Bounds bounds = EditorGUILayout.BoundsField("包围盒", bounds);

Delayed 输入控件

Delayed 版本的输入控件只在用户按 Enter 键或失去焦点时才返回新值,避免频繁更新。

1
2
int delayedInt = EditorGUILayout.DelayedIntField("延迟输入", delayedInt);
float delayedFloat = EditorGUILayout.DelayedFloatField("延迟输入", delayedFloat);

Lesson7 - 折叠控件

简单折叠

1
2
3
4
5
bool isFoldout = EditorGUILayout.Foldout(isFoldout, "展开/收起");
if (isFoldout) {
EditorGUILayout.LabelField("这是折叠内容");
EditorGUILayout.LabelField("可以放多个控件");
}

折叠组(带样式)

1
2
3
4
5
bool foldout = EditorGUILayout.BeginFoldoutHeaderGroup(foldout, "标题");
if (foldout) {
EditorGUILayout.LabelField("折叠组内容");
}
EditorGUILayout.EndFoldoutHeaderGroup();

EndFoldoutHeaderGroup 是配对的结束方法。

Lesson8 - 开关控件

普通开关

1
bool toggle = EditorGUILayout.Toggle("开启", toggle);

开关在左侧

1
bool toggleLeft = EditorGUILayout.ToggleLeft("标签在右", toggleLeft);

开关组

1
2
3
4
5
6
bool groupEnabled = EditorGUILayout.BeginToggleGroup("启用组", groupEnabled);
if (groupEnabled) {
EditorGUILayout.Toggle("选项1", option1);
EditorGUILayout.Toggle("选项2", option2);
}
EditorGUILayout.EndToggleGroup();

当组的主开关关闭时,组内所有控件自动禁用。

Lesson9 - 滑动条

浮点数滑动条

1
float value = EditorGUILayout.Slider("滑动条", value, 0f, 1f);

整数滑动条

1
int intValue = EditorGUILayout.IntSlider("整数滑动条", intValue, 0, 100);

双块滑动条(范围选择)

1
2
float minValue = 0, maxValue = 20;
EditorGUILayout.MinMaxSlider("范围选择", ref minValue, ref maxValue, 0f, 100f);

用于选择范围,常用于设置最小-最大值。

Lesson10 - 帮助框和间隔

帮助框

1
2
3
4
EditorGUILayout.HelpBox("这是一条消息", MessageType.Info);
EditorGUILayout.HelpBox("这是一条警告", MessageType.Warning);
EditorGUILayout.HelpBox("这是一个错误", MessageType.Error);
EditorGUILayout.HelpBox("这是普通提示", MessageType.None);

MessageType 决定了框的颜色和图标。

间隔

1
2
EditorGUILayout.Space(10); // 10 个单位的空白间隔
EditorGUILayout.Separator(); // 分隔线

Lesson11 - 动画曲线和布局容器

动画曲线

1
AnimationCurve curve = EditorGUILayout.CurveField("曲线编辑", curve);

点击后打开曲线编辑窗口。

水平布局

1
2
3
4
5
6
EditorGUILayout.BeginHorizontal();
{
EditorGUILayout.LabelField("左边", GUILayout.Width(100));
EditorGUILayout.LabelField("右边");
}
EditorGUILayout.EndHorizontal();

垂直布局

1
2
3
4
5
6
EditorGUILayout.BeginVertical();
{
EditorGUILayout.LabelField("上");
EditorGUILayout.LabelField("下");
}
EditorGUILayout.EndVertical();

滚动视图

1
2
3
4
5
6
7
8
scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
{
// 大量控件放这里
for (int i = 0; i < 50; i++) {
EditorGUILayout.LabelField("项目 " + i);
}
}
EditorGUILayout.EndScrollView();

滚动视图用于处理内容过多的情况,scrollPos 是 Vector2 类型用于记录滚动位置。