1.4 Slate vs UMG:编辑器 UI 的两条路线
两个框架的定位
| Slate | UMG | |
|---|---|---|
| 语言 | C++ 声明式语法 | 蓝图(.umg)/ C++ 也可组合 |
| 运行效率 | 高(C++ 原生,Tick 开销低) | 中(蓝图虚拟机开销) |
| 开发速度 | 慢(编译一轮) | 快(拖拽) |
| 适合 | 编辑器原生 UI、高性能界面 | 游戏内 UI、快速原型 |
| 数据绑定 | 手写或 PROPERTY_BINDING | 蓝图属性绑定直观 |
官方定位:「Slate UI 框架」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/slate-user-interface-programmi-2fb7)是引擎 UI 的底层;UMG 是建立在 Slate 之上的可视化封装(「UMG UI 设计器快速入门」https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/umg-ui-designer-quick-start-gu-a5a6)。编辑器 UI 历史上都是 Slate,UE5 之后 EditorUtilityWidget(蓝图 + UMG 容器跑在编辑器里)成了快速工具的官方推荐。
编辑器里的实际选型
- EditorUtilityWidget:UMG 控件 + 编辑器环境,蓝图拖拽做工具界面(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/editor-utility-widgets-in-unre-8b61)——大多数批量工具用这个
- Slate 窗口/控件:需要深度定制、性能敏感、或要嵌入编辑器原生面板(Detail、工具栏、通知)时用
- 混合:EUW 里可以嵌入 Slate 控件(通过 Wrapper),Slate 也可以嵌 UMG
一个常见的误区是「工具必须用 Slate 才专业」。实际上 EUW 有一个独特优势:策划能改。工具 UI 做成蓝图,需求微调时策划自己就改了,不用等程序员编译。我们团队的工具策略是「EUW 打底,只有极少数深度集成的工具用 Slate」。
Slate 的学习成本
Slate 是声明式 C++ 语法,初看很劝退:
ChildSlot
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
SNew(SButton)
.Text(NSLOCTEXT("MyTool", "Run", "执行"))
.OnClicked(this, &FMyTool::OnRunClicked)
]
];
但套路固定:SNew(SXxx) 建控件、+ Sxxx::Slot() 加槽位、.属性(...) 设参数、OnXxx 绑事件。建议路径:先读「Slate 概述」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/slate-overview-for-unreal-engi-915b)和「Slate 架构」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/understanding-the-slate-ui-arc-ac4c),再照「Slate 控件示例」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/slate-ui-widget-examples-for-u-43ef)抄几遍,最后用「控件反射器」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/using-the-slate-widget-reflect-d7e2)去「抄」编辑器里现有控件的属性与结构。
什么时候必须 Slate
这些场景蓝图 EUW 搞不定(或者很难):
- 嵌入编辑器原生面板:Detail 面板的定制(FDetailCustomization)、资产编辑器标签页扩展
- 自定义视口渲染(EdMode 里的 HUD)
- 通知/交互深整合:低级别通知(FNotificationInfo)、进度条与后台任务
- 工具栏/菜单的图标与命令绑定(FUIAction)
共用的思考模型
无论 Slate 还是 UMG,编辑器 UI 的核心考量是相同的:
- 频率低、操作短:工具 UI 一次操作 < 10 秒为目标,别做成「向导」
- 即时反馈:点了按钮立刻有 toast/进度,别让用户盯着没反应的窗口
- 可撤销优先于确认:编辑器里能用 Transaction 系统的操作都做成可撤销(深层次的体验差异)
- 性能边界:列表显示上万资产时,UMG/Slate 的刷新都要分页/虚拟化("SListView" 不开虚拟化会卡死)
心得:UI 框架之争是次要的,工具成败的关键是「交互流程设计」。出工具前先画出操作步骤草图(哪怕纸上),找策划走查一遍流程再写代码——工具难用的 90% 问题是流程设计问题,不是 UI 框架问题。
