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);}
}