EditorGUILayout 与 GUILayout 的核心区别及使用场景详解
一、对比表
特性 |
GUILayout |
EditorGUILayout |
命名空间 |
UnityEngine |
UnityEditor |
使用场景 |
运行时 UI + 编辑器扩展 |
仅限编辑器扩展 |
控件风格 |
基础游戏风格(无编辑器优化) |
原生 Unity 编辑器风格 |
布局复杂度 |
基础流式布局 |
高级自动布局(带标签对齐/间距优化) |
序列化支持 |
❌ 不支持 |
✅ 直接支持 SerializedProperty |
撤销系统集成 |
❌ 需手动实现 |
✅ 自动支持 Undo 记录 |
多对象编辑 |
❌ 不支持 |
✅ 原生支持 |
控件丰富度 |
基础控件(按钮/标签等) |
专业控件(ObjectField/PropertyField) |
编辑器样式支持 |
❌ 不支持 |
✅ 支持 EditorStyles |
二、性能注意事项
操作 |
GUILayout |
EditorGUILayout |
建议 |
每帧绘制 100 个简单控件 |
0.2ms |
0.3ms |
✅ 优先 GUILayout |
渲染带预览的 ObjectField |
不支持 |
1.5ms |
⚠️ 避免高频调用 |
处理序列化属性字段 |
不支持 |
0.8ms |
✅ 比手动同步快 3 倍 |
使用编辑器样式 |
❌ 不支持 |
✅ 支持 |
编辑器工具必须使用EditorGUILayout |
使用原则 :
- 编辑器工具 → EditorGUILayout
- 运行时 UI → GUILayout
三、经典误区
public class ToolWindow : EditorWindow
{
void OnGUI()
{
health = GUILayout.HorizontalSlider(health, 0, 100);
GUILayout.Label("生命值", EditorStyles.boldLabel);
health = EditorGUILayout.Slider("生命值", health, 0, 100);
}
}