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);
|
点击颜色块打开拾色器窗口,可调整 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); 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 类型用于记录滚动位置。