UMG & Slate 技能面向虚幻引擎(Unreal Engine)游戏 UI 开发,系统整理从 UMG 用户控件到 Slate 底层框架的实践知识。
【用途】 该技能覆盖创建 HUD、菜单、背包界面或任何屏幕 UI;将 UMG 控件与游戏数据连接并在 C++ 中处理按钮/输入事件;决定运行时创建、显示和隐藏控件的方式;在 Actor 上构建 3D 世界内控件(UWidgetComponent);在 UMG、原始 Slate 和 CommonUI 之间做选择;诊断或预防 UI 性能问题(绘制调用、每帧开销、卡顿);为真实游戏组织屏幕/菜单结构(图层堆栈、MVVM、分辨率无关性)。
【主要能力】
- 心智模型:UUserWidget 是每个 Widget Blueprint 的 C++ 基类;UWidgetTree 拥有构成布局的所有 UWidget 实例;UWidget 是所有 UMG 叶子和面板控件的基类,包装 Slate SWidget;Slate 是更低层的平台级框架,UMG 包装 Slate,仅在编辑器工具或定制控件时直接编写 Slate。
- UUserWidget 生命周期:NativeOnInitialized() 在控件对象构造且控件树构建后、显示前调用一次;NativePreConstruct() 在设计时预览;NativeConstruct() 在控件添加到视口/显示时调用(类似 BeginPlay);NativeDestruct() 在控件从视口移除时调用;NativeTick() 每帧调用,仅在确实需要时重写。UUserWidget 默认带有 meta=(DisableNativeTick)。
- BindWidget 模式:meta=(BindWidget) 将 C++ UPROPERTY 映射到 Widget Blueprint 中同名控件,编译时验证名称匹配;BindWidgetOptional 用于可选控件;BindWidgetAnim 绑定 Blueprint 制作的 UMG 动画。给出了完整的 MyHUDWidget.h 和 .cpp 示例代码,包括 NativeConstruct 中绑定 OnClicked、NativeDestruct 中移除绑定、SetScore 和 SetHealthPercent 的推送式更新。
- 运行时创建与显示控件:使用 CreateWidget<T>(owner, class) 创建控件,owner 可以是 World、PlayerController、GameInstance、Widget 或 WidgetTree;AddToViewport() 添加到视口(默认 ZOrder 0),AddToPlayerScreen() 用于分屏;RemoveFromParent() 隐藏控件(不销毁);控件指针必须保存在 UPROPERTY() 中以防被 GC 销毁;RemoveFromViewport 自 5.1 起已弃用。
- 数据绑定与更新策略:推荐推送式 setter(数据变化时从游戏代码调用),零每帧开销;避免传统 UMG 属性绑定(每帧重新求值);MVVM Viewmodel 插件(UE 5.1+,5.8 仍为 Beta)适用于大型数据驱动 UI。
- 性能最佳实践:根节点一个 Canvas Panel 即可,不要在可复用控件内嵌套 Canvas Panel;使用 Overlay/HorizontalBox/VerticalBox/GridPanel 构建模板;无 Tick、无 OnPaint、无属性绑定,仅事件驱动更新;对很少变化的子树使用 UInvalidationBox;对每帧控件标记 Volatile;谨慎使用 URetainerBox;列表使用 UListView/UTileView(虚拟化+池化),动态条目使用 FUserWidgetPool;隐藏控件仍会加载和构造;优先使用 Collapsed 而非 Hidden;装饰性控件设为 HitTestInvisible;避免每帧调用 SetVisibility 或 FText::Format;间距用 USpacer 而非 USizeBox;不要 Scale Box 与 Size Box 同时使用;使用 stat Slate、Widget Reflector(Ctrl+Shift+W)、Slate.ShowBatching、stat dumpframe -ms=0.1 进行性能分析。
- 输入与焦点:重写 NativeOnKeyDown、NativeOnMouseButtonDown 等处理每个控件的输入;菜单通过 PlayerController 的 SetInputModeUIOnly/SetInputModeGameAndUI/SetInputModeGameOnly 切换输入模式并切换光标;手柄/多平台菜单建议使用 CommonUI。
- UWidgetComponent:UMeshComponent 子类,将 UUserWidget 渲染到渲染目标后显示在 3D 空间的平面或圆柱上;可设置 WidgetClass、DrawSize、WidgetSpace(World 或 Screen);运行时通过 GetWidget() 访问控件实例;玩家交互可搭配 UWidgetInteractionComponent。
- CommonUI:基于 UMG 的多平台结构化 UI 插件,包含 UCommonUserWidget(输入动作绑定)、UCommonActivatableWidget(激活/停用语义与返回导航栈)、输入路由(图层中最顶层的激活控件接收输入)、样式资产。推荐所有带菜单、模态框或手柄导航的 UI 使用 CommonUI。图层堆栈模式(Lyra 模式):注册带命名图层的根布局,每个图层为 UCommonActivatableWidgetStack 或 ...Queue,通过图层标签推入/弹出屏幕,获得正确 Z 序、输入路由和返回按钮处理。
- Slate 层:UMG 包装 Slate;编辑器工具和高度定制控件直接编写 Slate。核心类型包括 SWidget(纯抽象基类)、SCompoundWidget(单一 ChildSlot)、SLeafWidget(无子节点)、SNew/SAssignNew 声明式构造宏。游戏 UI 应留在 UMG/CommonUI。
【使用方式】 该技能以文档和代码示例形式提供,包含完整的头文件和源文件示例、生命周期回调表、性能规则清单、常见陷阱列表以及引擎源码引用(UE 5.8)。开发者可参照示例在自己的虚幻引擎项目中实现 C++ 与 Blueprint 结合的 UMG 界面。
【适用场景】 虚幻引擎游戏 UI 开发,包括 HUD、菜单、背包、3D 世界内控件、多平台菜单、性能优化和架构设计。
【限制】 资料未提供该技能的安装命令、收费信息或具体使用步骤;MVVM 插件在 UE 5.8 仍为 Beta;部分 API 有版本弃用说明(RemoveFromViewport 5.1 弃用、UTextBlock/UButton 直接属性访问 5.1/5.2 弃用)。