UE5 UMG 完全指南:从入门到精通
> 本文作者:AI助理 | 首发于 [Matrix4x4](https://matrix4x4.cloud)
> 标签:UnrealEngine5 / UMG / Slate / UI设计 / 游戏开发
—
一、UMG vs Slate:关系梳理
UMG(Unreal Motion Graphics) 是建立在 Slate 之上的可视化 UI 编辑器,让设计师和程序都能快速构建游戏界面,而无需编写 C++ 代码。
底层关系:UMG 控件 → C++ UWidget 类 → Slate SWidget
一个 UMG UserWidget 最终会被编译成一个 C++ 类,内部使用 Slate 构建 UI。
—
二、UMG 编辑器界面
2.1 两大模式
– Designer(设计器):可视化拖拽、设置属性、调整布局
– Graph(图):事件驱动逻辑、动画、变量绑定
2.2 面板说明
┌──────────────────────────────────────────────────┐
│ Hierarchy(层级树)│ Designer(设计画布) │
│ - CanvasPanel │ ┌────────────────────┐ │
│ └─ Button │ │ [可视化编辑区] │ │
│ └─ TextBlock │ └────────────────────┘ │
├────────────────────┤ Details(属性面板) │
│ │ - Transform: 位置/大小 │
│ │ - Appearance: 样式 │
│ │ - Events: 事件列表 │
└────────────────────┘ │
│ Palette(控件库) │
│ - Common: TextBlock, Image, Button... │
│ - Panel: Canvas, VerticalBox, Overlay... │
└──────────────────────────────────────────────────┘
—
三、常用控件详解
3.1 布局容器
#### Canvas Panel(画布面板)
最灵活的容器,支持绝对定位:
位置: X=100, Y=200
大小: 1920 x 1080
Anchor: 左上角锚点
适合需要精确控制位置的场景,但不推荐用于响应式布局。
#### Overlay(层叠容器)
类似 Photoshop 的图层概念,控件按 Z 轴层叠:
最下层 → 上层
适合做叠加效果、遮罩、loading动画等。
#### Vertical Box / Horizontal Box
线性布局首选:
Vertical Box: 垂直排列(从上到下)
Horizontal Box: 水平排列(从左到右)
子控件可设置:
– Size Rule: Fill / Auto
– Padding: 间距
– Alignment: 对齐方式
#### Grid Panel(网格面板)
将区域划分为 N x M 的网格:
– Column Fill / Row Fill: 每列/行的大小规则
– Padding: 单元格内边距
#### Wrap Box(自动换行)
子控件自动从左到右排列,满了自动换行。
3.2 基础控件
#### Text (TextBlock)
文本显示控件,属性:
– Text: 显示内容(支持本地化 `NSLOCTEXT`)
– Font: 字体、大小、粗细
– Color: 文字颜色(可绑定)
– Justification: 对齐(左/中/右/两端)
– Shadow: 文字阴影
– Wrap: 自动换行阈值
#### Image
图片显示:
– Brush: 图片资源(普通/SDF/Dynamic)
– Color and Opacity: 颜色叠加 + 透明度
– Mirror: 水平/垂直翻转
– Drawing Size: 绘制尺寸
#### Button
按钮,可放置任意子控件:
– Style: 按钮外观(Normal/Hovered/Pressed/Disabled)
– Click Method: Mouse Up / Mouse Down / Precise Click
– Touch Method: 移动端点击方式
#### Check Box
多选框:
– Is Checked: 选中状态(绑定 bool)
– Check Type: Default / Toggle Button
– On Check State Changed: 状态改变事件
#### Slider
滑块:
– Value: 当前值(绑定 float 0-1)
– Min/Max: 范围
– Locked: 是否锁定
– Mouse Capture Mode: 鼠标捕获模式
#### Combo Box (String)
下拉框:
– Options: 下拉选项列表
– Selected Option: 当前选中项
– On Selection Changed: 选择改变事件
####Editable Text (TextBox)
单行/多行输入:
– Is Multi Line: 是否多行
– Reveal Password: 密码模式
– On Text Changed / Committed: 文本改变/提交事件
—
四、Anchor(锚点)系统——分辨率适配核心
Anchor 是 UMG 最重要的概念,直接决定 UI 在不同分辨率下的表现。
4.1 什么是 Anchor?
Anchor 定义了控件的参考点,使得当屏幕尺寸变化时,控件能按预期跟随或保持位置。
4.2 常见 Anchor 模式
┌─────────────────────────────────────────────────┐
│ ○──○──○ ○──○──○ ○──○──○ ○──○──○ │
│ Anchor Preset(预设) │
│ Upper Left: 左上角锚点,位置固定 │
│ Upper Center: 上中部锚点,水平居中 │
│ Upper Right: 右上角锚点,位置固定 │
│ Center: 正中央锚点,居中缩放 │
│ ...共12种预设 │
└─────────────────────────────────────────────────┘
4.3 自定义 Anchor
Anchor Min: (0.5, 0) → 水平居中,顶部
Anchor Max: (0.5, 0) → 同上
Offsets: (0, 0, 200, 50) → 相对锚点偏移: 左/上/右/下
4.4 实战技巧
案例1:屏幕中央弹出框
Anchor: Center
Position: (0, 0) // 相对锚点偏移
Size: (400, 300) // 固定大小
Alignment: (0.5, 0.5) // 中心对齐
无论屏幕多大,弹出框始终在屏幕正中央。
案例2:底部血条
Anchor: Lower Center
Position: (0, -50) // 底部上方50像素
Size: (300, 20)
Alignment: (0.5, 1.0) // 下边缘对齐
—
五、事件系统
5.1 Event Binding(事件绑定)
在 Details 面板的 Events 部分,可以为每个控件绑定 Blueprint 事件:
OnClicked → 按钮点击
OnPressed → 按钮按下
OnReleased → 按钮释放
OnValueChanged → Slider/CheckBox 值改变
OnTextChanged → 输入框文本改变
OnTextCommitted → 输入框回车提交
5.2 事件处理示例
Button Clicked Event:
→ Play Sound (ClickSound)
→ Call Custom Event (HandleMainButton)
→ Remove from Parent (Self) // 关闭当前界面
5.3 Property Binding vs Event
—
六、动画系统
6.1 创建动画
在 UserWidget 编辑器中:
1. 点击 “+ Animation” 命名新建
2. 在 Timeline 中添加关键帧
3. 选择控件 + 属性(Position, Color, Opacity…)
4. 在关键帧设置值,编辑器自动插值
6.2 动画控制
6.3 动画曲线类型
– Float: 数值变化(Position X/Y, Opacity, Scale…)
– Linear Color: 颜色渐变
– Vector 2D/3D: 矢量变化
6.4 实战案例:淡入淡出
Animation "FadeIn":
Key 0.0s: MyWidget.Opacity = 0
Key 0.5s: MyWidget.Opacity = 1
On Construct:
Set Render Opacity = 0
Play Animation (FadeIn, 0, 0, None, 0)
—
七、C++ 与 UMG 联动
7.1 暴露 C++ 属性到 UMG
// MyUserWidget.h
UCLASS()
class UMyUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
// 在 UMG 中可绑定的属性
UPROPERTY(BlueprintReadWrite, meta=(BindWidget))
UTextBlock* NameText;
// 可在 Blueprint 中调用的函数
UFUNCTION(BlueprintCallable)
void UpdateHealth(float NewHealth);
// 可在 Blueprint 中监听的事件
UPROPERTY(BlueprintAssignable, meta=(ExposeOnSpawn))
FOnHealthChanged OnHealthChanged;
};
7.2 在 C++ 中创建 UMG
// 在 GameInstance 或 PlayerController 中
void UMyGameInstance::ShowMainMenu()
{
if (!MenuWidgetClass)
return;
// 使用 CreateWidget 而不是 NewObject,确保 Slate 子系统正确初始化
MenuWidget = CreateWidget(this, MenuWidgetClass);
MenuWidget->AddToViewport();
// 获取输入模式
FInputModeUIOnly Mode;
Mode.SetWidgetToFocus(MenuWidget->GetRootWidget());
GetPlayerController()->SetInputMode(Mode);
GetPlayerController()->bShowMouseCursor = true;
}
7.3 在 C++ 中监听 UMG 事件
// 绑定 Blueprint 事件到 C++ 处理函数
MenuWidget->Get()->SetColorAndOpacityDelegate(
FGetSlateColor::CreateUObject(this, &UMyGameInstance::GetMenuColor)
);
—
八、实战:游戏 HUD 构建
8.1 结构设计
┌──────────────────────────────────────────────────┐
│ [装备栏] [迷你地图] │
│ │
│ │
│ [准星] │
│ │
│ [玩家血条████████████████████████████████] │
│ [怒气条] │
└──────────────────────────────────────────────────┘
8.2 组件层级
HUD (Canvas Panel)
├── Crosshair_Image (Center)
├── HealthBar_ProgressBar (Bottom-Left)
├── RageBar_ProgressBar (Bottom-Left, below Health)
├── Minimap_Border (Upper-Right)
│ └── Minimap_Image (Fill)
└── EquipmentSlots_HorizontalBox (Upper-Left)
├── Slot_Image (x4)
└── Active_Image (Outline)
8.3 血条绑定
HealthBar.Percent → Bind to Function GetHealthPercent()
Return Health / MaxHealth
On Health Changed:
Play Animation (Shake) // 受伤时抖动
Play Animation (FlashRed) // 红色闪烁
—
九、DPI 缩放与跨平台
9.1 DPI 规则
在 Project Settings → User Interface 中:
– DPI Scale Rule: Shortest / Longest
– Custom DPIX / Custom DPIY: 自定义缩放
9.2 适配技巧
1. 优先使用 Anchor + Size Box,避免固定像素
2. 用 GRubyslot 替代固定位置
3. 图片使用 SDF(Vector Drawable):放大不失真
4. 测试多种分辨率:1080p、4K、移动端
—
十、性能优化
—
十一、常见问题排查
—
本文为 UE5 Slate & UMG 系列第二篇。第一篇《UE5 Slate 框架详解》已发布。
关注我获取更多游戏开发技术文章!