开始
概览
WebUIX for Unreal Engine
WebUIX 1.2.0 是自研 HTML/CSS UI 渲染引擎,作为原生 UMG 插件运行在 Unreal Engine 中。无浏览器进程、无 JavaScript 引擎、无 CEF/Chromium;用熟悉的 HTML/CSS 构建游戏 UI,通过 Blueprint 完成交互逻辑。本版补充了 UE 5.0-5.8 包、编辑器补全、缩略图持久化和渲染稳定性改进。
UE 5.0-5.8 包
1.2.0 已更新并验证 Unreal Engine 5.0 到 5.8 的 Win64 插件包;运行时代码仍面向 UE 原生项目平台构建。
高性能原生渲染
Direct RHI 渲染,无浏览器进程开销。支持跨帧缓存、脏区增量更新、独立 RT 拖拽预览,并改进 2D/3D transform、翻页和背面处理。
HTML/CSS 开发体验
Box model、Flexbox、过渡动画、CSS 滤镜、UI 音效,以及更快的 HTML/CSS 补全、注释高亮和资源路径提示。
Blueprint 深度集成
事件桥(OnClick 调 UFUNCTION)、数据模型绑定、完整 DOM API、自定义组件系统
自定义 HTML 组件
在 Blueprint 中创建新 HTML 标签,定义自定义属性与事件。组件内 UFUNCTION 可直接在 HTML 中调用 — 类似 Web Components 开发模式
内置调试控制台
F8 打开 — 实时 DOM 树、元素选择器、样式计算面板、渲染统计、脏区可视化
手柄与控制器输入
自动输入设备检测(键鼠/触控/手柄),支持虚拟手柄光标(可为键鼠和手柄分别设置独立外观)与方向键/摇杆 UI 导航,nav-order 属性可显式控制导航顺序。
自定义 Emoji 字形
编辑器内置 Emoji Library 面板,可下载/导入/烘焙图标包,采用文件夹+SVG 格式,兼容 Twemoji/OpenMoji/Noto 目录约定;真彩色渲染,不受 CSS 文字颜色影响。
快速开始
WebUIXUserWidget,在同一个 Widget Blueprint 资产里完成 HTML、CSS、预览和蓝图逻辑。1. 创建资产
在 Content Browser 中使用 Add → WebUIX → Widget Blueprint / WebUIX User Widget。创建出的 Blueprint 父类是 UWebUIXUserWidget。
2. 内置编辑
打开资产后,直接在 WebUIX 编辑器布局里修改 HTML / CSS。普通界面的 HTML 源码随 WebUIXUserWidget 一起维护。
3. 预览与调试
预览区使用同一套 WebUIX 渲染链路,适合检查布局、样式、资源、材质和组件状态。
4. 蓝图逻辑
HTML 里的 onclick、onchange 等事件会调用同名 Blueprint 函数或事件。需要操作元素时,用 Get Element By ID 或查询节点获取元素句柄。
最小 HTML 示例
<div class="demo-shell">
<h2>{{loc:demo.title|WebUIX Demo}}</h2>
<button id="switch-image" onclick="SwitchImage">
{{loc:demo.switch_image|Switch Image}}
</button>
<webuix-option-stepper
id="demo-quality-stepper"
label="{{loc:demo.graphics_quality|Graphics Quality}}"
options="GraphicsQualityOptions"
display-key="DisplayName"
value-key="Value"
data-webuix-bind-value="GraphicsQualityIndex"
onchange="OnGraphicsQualityChanged">
</webuix-option-stepper>
</div>
使用到游戏中
- 点击 Compile 和 Save。
- 运行时像普通 UMG 一样
Create Widget后Add to Viewport,也可以放进 HUD、其他 UMG 或 3D Widget 工作流。 - 多个界面需要共享样式时,可以引用独立 WebUIX CSS Stylesheet 资产;HTML 源码放在各自的
WebUIXUserWidgetEmbedded HTML 中。
编辑器工作流
代码编辑器与补全
打开 WebUIX User Widget 或 CSS Stylesheet 资产即可编辑。1.2.0 优化了 HTML/CSS 补全速度、注释高亮、completion picker 行为、标签/属性/事件/CSS 属性和资源路径提示;仍支持 Ctrl+S 保存与 Alt+Shift+F 格式化。
预览、焦点与热重载
可将 HTML/CSS 资产链接到外部磁盘文件进行双向持久化同步:编辑外部文件后,改动会被自动检测并写回资产的 Source 属性(同时调用 MarkPackageDirty 将资产标记为脏),而不只是临时预览刷新,适合搭配习惯的外部编辑器做快速迭代。
缩略图与资源选择器
WebUIX Widget 缩略图、静态缩略图刷新和文本资产图标会在编辑器重启后保持一致。CSS 中编写 url(...) 时仍可通过资源选择器筛选图片、音频、字体等 UE 资产,音频资源支持预览播放。
诊断与 Blueprint 菜单
编辑器底部状态栏显示错误/警告摘要,可跳转上一个/下一个诊断并复制文本。1.2.0 还优化了 Blueprint action menu 响应、输入焦点恢复和编辑器滚动时的交互稳定性。
Element Extension Editor
针对 UWebUIXElementExtension 派生的自定义组件(如 BP_InputIcon)提供专用的图形化编辑器,内置实时预览面板,可以直接在编辑器里查看组件渲染效果和运行日志,无需反复编译运行整个项目即可迭代自定义组件。
Loading Config
Loading Config 是 WebUIX 的加载界面配置资产,用来统一制作 Startup UI 和 Map Loading UI。它基于 UWebUIXLoadingScreenProfile,在一个 Blueprint 资产里保存页面、HTML、CSS、生命周期事件、跳过规则和进度状态。创建资产
在 Content Browser 中使用 Add → WebUIX → Loading Config 创建资产,然后打开它编辑启动页和地图加载页。
项目设置启用
在 Project Settings → Plugins → WebUIX → Loading Screen Config Asset 选择这个 Loading Config。
同一套编辑器布局
左侧资源树管理页面和生命周期,中间预览实时渲染,下方编辑 HTML / CSS,右侧编写蓝图逻辑。
运行时控制
可以由加载管理器、GameInstance 或 Loading Config 自身蓝图更新进度、状态和跳过逻辑。
页面配置
| 页面 | 用途 |
|---|---|
Startup Page | 游戏启动阶段显示,适合品牌、初始化、资源预热和首帧前遮罩。 |
Map Loading Page | 地图加载或关卡切换阶段显示,适合地图名、加载状态和提示文本。 |
模板变量
<div class="loading-screen startup-screen">
<div class="subtitle">{{LoadingStatus}}</div>
<div class="bar-fill" style="width: {{LoadingProgressPercent}}%;"></div>
</div>编辑器界面
这些界面展示 WebUIX 的主要编辑体验:在 Unreal Editor 内同时处理 HTML/CSS、实时预览、Blueprint 逻辑、Loading Screen 配置、本地化文本和项目级设置。




HTML/CSS 基础
支持的 HTML 标签
扩展元素:drag-area drag-cell
drag-item handle radio-group radio-option
checkbox-group checkbox-option dropdown
dropdown-option password modal modal-title
modal-footer tooltips tooltips-content animation-watch
CSS 属性速查
布局与尺寸
盒模型
文字
Flexbox
背景与渲染
单位与值
Pseudo-class 状态
扩展状态::selected :open
:dragging :valid :invalid :hot
:occupied。部分 pseudo-state 会同步为 CSS class(.selected .open
.disabled)。
资源引用
图片和音频通过 UE 资产路径引用:
<img src="/Game/UI/Icons/Sword.Sword" />
.icon { background-image: url("/Game/UI/Icons/Sword.Sword"); }
.banner { background: url(banner.png) center / cover no-repeat; }
散列图片文件(PNG、JPG)会通过 WebUIX 资源解析与 cook 流程进入运行时资源缓存。
CSS 滤镜
WebUIX 支持多种 CSS 滤镜效果,可用于 UI 动效、背景模糊和视觉氛围增强。
filter
filter 属性对元素及其子元素的渲染结果应用图形效果。
| 函数 | 说明 | 示例 |
|---|---|---|
blur() | 高斯模糊 | filter: blur(4dp); |
brightness() | 亮度调节(0=黑,1=原始,>1=更亮) | filter: brightness(1.2); |
contrast() | 对比度调节(0=灰,1=原始,>1=更强) | filter: contrast(1.15); |
saturate() | 饱和度调节(0=去色,1=原始,>1=更鲜艳) | filter: saturate(1.5); |
drop-shadow() | 投影(类似 box-shadow 但跟随轮廓) | filter: drop-shadow(0 4dp 8dp #00000066); |
.card {
filter: drop-shadow(0 10dp 24dp #00000066);
}
.card:hover {
filter: brightness(1.1) drop-shadow(0 14dp 32dp #00000088);
}backdrop-filter
backdrop-filter 对元素背后区域的内容应用滤镜(常用于毛玻璃效果)。
.glass-panel {
background: rgba(255,255,255,.12);
backdrop-filter: blur(16dp);
}backdrop-filter 会引入额外的 RHI 渲染通道(BackdropFilterPass)。大量使用可能增加 GPU 开销,建议在调试控制台的 Paint 面板中查看 BackdropFilterPassCount 统计。
filter 与动画
filter 属性支持 CSS transition 和 animation 平滑过渡:
UI 音效
WebUIX 支持通过 CSS 属性 background-sound 在元素交互(hover、active、focus)时自动播放 UE
音频资产(USoundBase)。无需编写 Blueprint 逻辑。
CSS 属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
background-sound | URI | — | 指向 USoundBase 资产路径 |
background-sound-volume | float | 1.0 | 音量乘数(>=0) |
background-sound-pitch | float | 1.0 | 音高乘数(>=0.01) |
background-sound-cooldown | time | 0 | 播放冷却时间,支持 s/ms 后缀 |
触发时机
音效在以下 pseudo-class 激活时自动播放:
:hover— 鼠标悬停时:active— 按下时(鼠标/触摸):focus— 获得焦点时(Tab 导航等)
使用示例
资产路径使用 asset:/// 前缀(编辑器资源选择器自动补全):
.ui-hover-sound:hover {
background-sound: url("asset:///WebUIX/WebUIX/Sound/glass_001.glass_001");
background-sound-volume: 0.35;
background-sound-cooldown: 0.05s;
}提示:音效资产通过软引用(TWeakObjectPtr)管理,随文档自动 Cook 到包中。在 CSS 编辑器中使用资源选择器筛选 Audio 类型即可快速插入资产路径。
动画与过渡
CSS Transitions
支持对所有可动画属性的平滑过渡。常用可动画属性:color background-color
opacity transform filter width height
margin padding。
.card {
transform: scale(1);
filter: brightness(1);
transition: transform 180ms ease, filter 150ms;
}
.card:hover { transform: scale(1.04); filter: brightness(1.1); }@keyframes
@keyframes slide-in {
0% { transform: translateY(-24dp); opacity: 0; }
100% { transform: translateY(0); opacity: 1; }
}支持:timing-function、iteration-count、direction、fill-mode、delay、play-state。
animation-watch 元素
animation-watch 观察 CSS 动画状态并通过事件桥发送 JSON payload 给 Blueprint。详见扩展元素章节。
自定义组件
自定义组件由 Blueprint 派生的 WebUIXComponent 提供。先在组件类里定义 TagName、默认 HTML/CSS、属性、事件和函数;注册后即可在 HTML 中直接使用对应标签,例如 <my-card title="Quest"></my-card>。
项目级注册
- 创建 Blueprint 组件类,父类选择
WebUIXComponent。 - 设置组件
TagName。HTML 中写同名标签时,运行时会按归一化标签名匹配并展开该组件。 - 在组件 Blueprint 中暴露属性、事件或函数;编辑器补全会读取这些描述,HTML 中可通过属性和事件回调使用。
- 需要全项目可用时,把组件类添加到 Project Settings → Plugins → WebUIX Settings → Components。只给某个页面使用时,把组件类添加到对应
WebUIXUserWidget的 Embedded Document Components 列表。
单个 Widget 配置
运行时会把 Project Settings 中的组件和当前 Widget Embedded Document 的组件合并为 active components,并按 HTML 标签名展开匹配项;不需要单独创建 HTML uasset 才能使用组件。
<my-card title="Sword" OnCardClicked="OnSwordPicked(id)"></my-card>
<span>{{UE::CallText(GetCardStatus)}}</span>组件默认 HTML 可以继续嵌套 WebUIX 标签、模板变量和事件属性。把组件写进 HTML 后,它会像普通标签一样参与解析、样式计算、布局和事件桥。
直接写入 HTML
如果组件需要复用样式,CSS 仍可放在共享 UWebUIXCssStyleSheet 或当前 Embedded CSS 中;HTML 源码优先维护在 WebUIXUserWidget 的 Embedded Document 里。
DOM API
Dom->GetElementById("my-id");
Dom->QuerySelector(".my-class");
Dom->SetAttribute("badge", "5");
Dom->SetTextContent("Updated!");示例:BP_InputIcon
BP_InputIcon 就是这套自定义组件系统的一个实际示例:一个 UWebUIXElementExtension 派生组件,根据当前输入设备渲染对应的键鼠或手柄按键图标。可以在 Element Extension Editor(见编辑器工作流)里打开并实时预览它的渲染效果。



数据绑定与模板
上下文变量 {{变量}}
从 Widget Blueprint 或 Bridge Target 的同名属性读取值。调用 NotifyContextChanged("VariableName") 刷新。
<span>{{PlayerName}}</span>
<div style="width: {{Percent}}%;">{{Score}}</div>数据模型 {{Model.Key}}
通过 SetModelString/SetModelNumber/SetModelBool 写入,HTML 中用 {{Model.Key}} 读取。
Widget->SetModelString("PlayerName", "Alice");
Widget->SetModelNumber("Health", 85.0f);
Widget->SetModelBool("IsAlive", true);
Widget->NotifyContextChanged();本地化 {{loc:key|fallback}}
<span>{{loc:ui.start_button|Start Game}}</span>
<span>{{loc:hud.health|Health}}: {{Model.Health}}</span>运行时切换语言:Widget->SetCulture("zh-Hans"); Widget->RefreshLocalization();
UE::CallText / UE::CallHtml
调用 UFUNCTION 并将返回值插入 HTML 中。CallText 插为纯文本,CallHtml 插为 HTML 片段。
<h2>{{UE::CallText(GetPanelTitle)}}</h2>
<span>{{UE::CallText(FormatScore, Value=Model.Score)}}</span>
<div html="UE::CallHtml(BuildInventoryRows)"></div>模板指令
当前模板指令写在普通元素属性上。循环使用 for="(item, index) in Items",条件分支使用 if / else-if / else,可见性切换使用 show;key 用于循环项稳定复用。
<!-- repeat an element -->
<div class="item-row" for="(item, index) in Items" key="item.Id">
{{index}}. {{item.Name}} × {{item.Count}}
</div>
<!-- conditional rendering -->
<div class="welcome" if="{{IsLoggedIn}}">Welcome, {{PlayerName}}!</div>
<div class="guest" else-if="{{IsGuest}}">Welcome, guest.</div>
<div class="login-prompt" else>Please log in.</div>
<!-- visibility toggle: keeps the element and toggles display -->
<div class="bonus" show="{{HasBonus}}">Bonus Active!</div>多语言与本地化
HTML 语法
所有可见文本都可以使用 {{loc:key|fallback}}。key 是稳定的翻译 ID;fallback 是翻译还不存在时使用的源文本。
<h2>{{loc:menu.title|Main Menu}}</h2>
<button OnClick="StartGame">{{loc:menu.start|Start Game}}</button>属性与组件标签
本地化也可以写在属性值里,包括 label、placeholder、title 以及 WebUIX 组件属性。
<input placeholder="{{loc:login.name_placeholder|Player name}}" />
<my-card title="{{loc:item.sword|Sword}}"></my-card>本地化面板流程
- 在 WebUIX HTML / Embedded Document 中新增或修改 {{loc:key|fallback}}。
- 在 Unreal Editor 的 Localization 面板中打开项目本地化目标,执行 Gather 收集文本。
- 在同一个本地化面板中填写或导入目标语言翻译,然后执行 Compile 生成运行时资源。
- 保存本地化面板生成/更新的资源即可;正常流程不需要手动编辑底层本地化文件。
运行时切换语言
在 WebUIX widget 上调用 Set Culture 可以切换 UE culture 并重新加载本地化文本。如果 culture 已经由外部系统切换,只需要刷新当前文档文本时使用 Refresh Localization。
Set Culture: zh-Hans
Set Culture: en
Refresh Localization打包检查清单
- 打包项目包含目标 culture,例如 en 或 zh-Hans。
- Localization 面板 Compile 生成的运行时本地化资源已保存并进入项目/插件内容。
- HTML fallback 可作为兜底文本,但正式文本应来自本地化资源。
事件桥
通过 HTML 事件属性调用 Blueprint UFUNCTION,按函数名查找 Widget 或 Bridge Target。
支持的事件
| 事件 | 触发时机 |
|---|---|
OnClick | 鼠标/触摸点击释放 |
OnChange | 值提交(blur/Enter/松开) |
OnFocus | 获得焦点 |
OnDragstart / OnDragdrop | 拖拽开始/移动/结束 |
OnAnimationStart / OnAnimationEnd | 动画生命周期 |
使用示例
<button OnClick="StartGame">Start</button>
<input value="{{Model.SearchText}}" OnChange="OnSearchChanged(value)" />Bridge Object
创建 UWebUIXBridgeObject,设置 TargetObject,赋给 Widget 的 BridgeObject 属性。事件按名称路由到目标对象。
动画监听
<animation-watch> 观察指定范围内的 CSS transition / animation
状态变化,并通过事件桥将包含动画名、进度、当前值等信息的 JSON payload 发送给 Blueprint。适合做连击动效、过场动画完成的回调等。
基本用法
<animation-watch id="hud-watch"
scope="subtree"
visible-only="true"
emit-update="true"
update-rate="8"
OnAnimationStart="OnHudAnimationStart"
OnAnimationUpdate="OnHudAnimationUpdate"
OnAnimationEnd="OnHudAnimationEnd"
OnAnimationCancel="OnHudAnimationCancel">
<div class="animated-card">Reward</div>
</animation-watch>
范围控制
scope 支持
self(仅自身)、children(直接子元素)、subtree(所有后代)。大量节点同时动效时优先缩小范围。
可见性过滤
visible-only="true"(默认)跳过 display:none / visibility:hidden 的 watcher 和目标。设为
false 可监听隐藏元素。
更新频率控制
emit-update="false" 只保留 start/end/cancel 事件;update-rate 限制
update 频率(Hz),0 表示不连续派发。
事件 Payload
JSON 包含
type、watchId、targetId、name、property、elapsed、duration、progress、currentValue
等字段。
拖拽系统
网格拖拽
<drag-area id="bag" columns="5" rows="4" count="13" gap="8dp">
<drag-cell class="slot">#{{dragCell::DisplayIndex}}</drag-cell>
<drag-item id="sword" col="0" row="0" cols="2" rows="2">2x2</drag-item>
</drag-area>模板变量:{{dragCell::DisplayIndex}} {{dragArea::UsableCount}}
{{dragItem::PreviewValid}}。可通过 var-scope="Inventory" 重命名作用域。
自由拖拽(浮动面板)
<div id="panel" class="floating-panel">
<handle class="title-bar" move_target="panel">Drag Panel</handle>
</div>handle 元素通过 move_target 指定被拖拽的目标,edge_margin
限制边界。拖拽预览渲染在独立透明 RT 上,主页面纹理不会被修改。
拖拽状态 CSS
drag-cell.slot:hot { background: #38bdf833; }
drag-item.item:dragging { opacity: .72; transform: scale(1.04); }

表单控件
radio-group / radio-option
<radio-group value="comfortable" name="Density" OnChange="OnRadioChanged(value)">
<radio-option value="compact">Compact</radio-option>
<radio-option value="comfortable" selected>Comfortable</radio-option>
<radio-option value="debug">Debug</radio-option>
</radio-group>
checkbox-group / checkbox-option
<checkbox-group value="svg,animation" OnInput="OnFeaturesInput(value)">
<checkbox-option value="svg" selected>SVG</checkbox-option>
<checkbox-option value="animation" selected>Animation</checkbox-option>
<checkbox-option value="ime">IME</checkbox-option>
</checkbox-group>
多选值按 DOM 顺序保存为逗号分隔字符串。
dropdown / dropdown-option
支持单选和多选(multiple="true")。打开时菜单在内部 Popup Layer 绘制,DOM 和事件冒泡保持在 dropdown 内。
<dropdown value="rhi" placeholder="Select mode"
OnChange="OnDropdownChanged(value)">
<dropdown-option value="rhi" selected>RHI</dropdown-option>
<dropdown-option value="slate">Slate fallback</dropdown-option>
</dropdown>
Modal / Tooltips
modal
通过 value="true|false" 控制。modal-title 和 modal-footer
自定义标签;不写 footer 则自动生成按钮。
<button modal-action="open" modal-target="settings-modal">Open</button>
<modal id="settings-modal" value="{{SettingsModalOpen}}"
width="420dp" mask="true" close-on-click-modal="true"
close-on-press-escape="true" lock-scroll="true"
OnChange="OnSettingsModalChanged(value)">
<modal-title>Settings</modal-title>
<modal-footer>
<button modal-action="cancel">Cancel</button>
<button modal-action="confirm">Confirm</button>
</modal-footer>
</modal>
tooltips
<tooltips placement="top" effect="dark">
<button>Hover me</button>
<tooltips-content>
<b>Tip title</b>
<p>Explain this setting.</p>
</tooltips-content>
</tooltips>
Password
password
内部管理原生 password/text 输入和眼睛切换按钮。支持 visible="true|false"
show-toggle="true|false" disabled。
<password value="" placeholder="Access code"
name="AccessCode" OnInput="OnAccessCodeInput(value)" />
手柄与控制器输入
Project Settings 与自动检测
手柄输入系统受 Project Settings 中的 bEnableWebUIXGamepadInputSystem 总开关控制(默认开启);bAutoSwitchInputModeByDevice(默认开启)让插件根据最近一次输入事件的设备类型(键鼠/触控/手柄)自动切换当前输入模式,无需手动调用 Enter Gamepad Input Mode / Enter Mouse & Keyboard Input Mode。方向导航按键(上下左右)默认映射到手柄 D-Pad,二维导航摇杆默认使用左摇杆。
[/Script/WebUIX.WebUIXSettings]
bEnableWebUIXGamepadInputSystem=True
bAutoSwitchInputModeByDevice=True
; GamepadInput defaults (mirrors stock UE gamepad feel):
; ConfirmKey=Gamepad_FaceButton_Bottom, CancelKey=Gamepad_FaceButton_Right
; DirectionalNavStick=Gamepad_Left2D
; NavUpKey=Gamepad_DPad_Up, NavDownKey=Gamepad_DPad_Down
; NavLeftKey=Gamepad_DPad_Left, NavRightKey=Gamepad_DPad_Right
虚拟光标与 UWebUIXGamepadCursorLibrary
手柄模式下会显示一个由摇杆驱动的虚拟光标,行为与鼠标光标一致(可以点击、拖拽、悬停触发 CSS :hover)。UWebUIXGamepadCursorLibrary 蓝图函数库提供获取/覆盖当前输入设备、获取/覆盖导航配置,以及分别为键鼠光标和手柄光标设置独立外观(内置样式或自定义贴图+热点)的静态函数,具体函数签名见下方 Blueprint API 参考。
全局按键监听事件
OnAnyKeyDown / OnAnyKeyUp 是声明在 UWebUIXElementExtension(进而被 WebUIX User Widget / Widget 继承)上的被动监听委托,键盘、鼠标和手柄输入都会触发,且不会消费事件(不影响 HTML 元素自身的正常事件处理),常用来做全局按键提示/重映射 UI。OnInputDeviceChanged 会在自动检测到输入设备切换时触发,附带新的设备类型和(如果是手柄)具体型号名称。
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FWebUIXKeyEventDelegate, FKeyEvent, KeyEvent);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FWebUIXInputDeviceChangedDelegate, EWebUIXInputDeviceType, DeviceType, FName, GamepadModel);
// UWebUIXElementExtension / UWebUIXUserWidget / UWebUIXWidget:
UPROPERTY(BlueprintAssignable) FWebUIXKeyEventDelegate OnAnyKeyDown;
UPROPERTY(BlueprintAssignable) FWebUIXKeyEventDelegate OnAnyKeyUp;
UPROPERTY(BlueprintAssignable) FWebUIXInputDeviceChangedDelegate OnInputDeviceChanged;
nav-order 属性
在 HTML 元素上添加 nav-order 属性可以显式声明该元素在方向键/摇杆 UI 导航中的顺序,插件会按 nav-order 数值升序在可聚焦元素之间移动焦点。
<div class="menu">
<button nav-order="0" OnClick="OnResume">Resume</button>
<button nav-order="1" OnClick="OnSettings">Settings</button>
<button nav-order="2" OnClick="OnQuit">Quit</button>
</div>
UWebUIXNavigationStack
一个可选的页面栈管理工具(纯 UObject,非 Widget),提供 PushWidget / PopWidget / ClearWidgets / GetActiveWidget / NumWidgets,用于管理多层全屏页面(如主菜单→设置→图形选项)的入栈/出栈与激活/挂起状态,只有栈顶页面会参与手柄回退焦点(Activate)。因为是普通 UObject,需要用 UPROPERTY 持有它以防止被垃圾回收。
自定义 Emoji 字形
图标包格式
每个 emoji 图标包是一个文件夹,内含按十六进制 Unicode codepoint 命名的 SVG 文件(如 1f600.svg),多 codepoint 组合用短横线连接。这个目录结构与 Twemoji、OpenMoji、Noto Emoji 等主流开源图标集完全一致,可以零转换直接导入使用。
twemoji-common/
1f600.svg
1f602.svg
1f44d.svg
1f680.svg
Emoji Library 编辑器面板
编辑器工具栏内置 Emoji Library 面板,可以直接输入 URL 下载单个图标包(Download)、从磁盘导入已有的文件夹(Import Folder...)、导出一份示例包(Save Example Pack...)、管理已导入的图标包列表并移除(Remove),以及将当前图标包烘焙成运行时可用的图集资源(Bake For Shipping)。插件本身不内置任何 emoji 美术资源,需要自行下载或导入图标包。
真彩色渲染
自定义 emoji 字形在图集阶段直接光栅化写入真彩色 BGRA 像素,渲染时不会被当作“仅透明度”的普通文字字形处理,因此不受 CSS 文字颜色(color 属性)影响,能保留图标本身的原始配色。
渲染管线
WebUIX 使用保留渲染架构,每帧仅重绘发生变化的区域。1.2.0 继续强化 2D/3D transform 一致性、翻页渲染、背面处理、SVG 绘制、图片回退、纹理处理和模板刷新稳定性。
HTML + CSS -> DOM -> Style Cascade -> Layout -> Display List -> RHI Render Target -> Slate Present
瓦片绘制缓存
页面分为瓦片,稳定区域不重绘。只有脏瓦片会被标记并重新光栅化,配合 SVG/图片资源回退减少异常资源导致的空白或错误状态。
Last-Frame-Wins
高频交互采用 latest-frame-wins 策略:旧视觉帧可以跳过,最终状态保持准确;1.2.0 对模板刷新和滚动/焦点相关路径做了额外加固。
独立拖拽预览
拖拽预览渲染在独立透明 RT 上,主页面纹理在拖拽过程中不会被修改;1.2.0 同步改进页面翻转、背面和条纹类渲染问题。
避免不必要的 DOM 变更
优先使用 StyleSetProperty、ClassListAdd/Remove/Toggle、SetModelNumber + NotifyContextChanged 等轻量更新路径;结构性 DOM 变更适合真正需要重建节点时使用。
Widget 组件池
UWebUIXWidgetPoolComponent 管理 Widget 实例池,实现即时的页面切换。池中的 Widget 在隐藏/显示周期中保留 DOM 状态、滚动位置和输入焦点。
使用方式
// C++
PoolComponent->ShowWebUIXWidget(MyWidgetClass, ViewportZOrder);
PoolComponent->HideWebUIXWidget(MyWidgetClass);
// Calling Show again reuses the same instance — no recreation
Blueprint 中对应节点:Show WebUIX Widget → Hide WebUIX Widget →
Show WebUIX Widget(复用实例)。
启动预热
UWebUIXStartupWarmupSubsystem 在游戏启动时自动扫描已 Cook 的 Widget Blueprint,预加载文档和资源。首次打开 UI 零延迟。
配置条件
- Widget Blueprint 父类必须是 UWebUIXUserWidget。
- 设置
bWarmupOnGameStart = true。 - 必须设置
DocumentAsset。
预热模式
| 模式 | 说明 |
|---|---|
DocumentCacheOnly |
异步后台预加载文档和 Cooked 资源(推荐) |
PrecreateHiddenWidget |
创建 Widget、以 Collapsed 状态加入视口、调用 PrewarmDocument()。之后用 ShowPrewarmedWidget() 立即显示。 |
Cook 预处理
Embedded HTML/CSS、共享 CSS Stylesheet 和引用资源会通过 WebUIX 的保存/Cook 流程准备,运行时尽量复用已解析数据。
预计算内容
| 数据 | 说明 |
|---|---|
ResolvedHtmlBundle |
合并后的 HTML + 链接的 CSS |
CookedDomNodes |
预解析的 DOM 树 |
CookedStyleSheet |
已解析的样式表 |
CookedImageResources |
压缩后的图片字节(PNG/JPG) |
ReferencedAssets |
文档引用的所有 UE 资产(图片、音频等软引用) |
修改 Embedded HTML 或 CSS 源码后,保存 Widget / CSS Stylesheet 资产并重新构建相关派生数据。
调试控制台
内置调试工具,Editor/PIE 下可用。焦点落在 WebUIX 画面后按 F8 打开或关闭。
元素选择器
使用 Pick 图标从渲染画面选择元素。Pick 模式只做 hit-test,不触发真实交互。
DOM 树
左侧显示实际渲染树(包括 WebUIX 生成的 non-DOM 节点如 selectvalue、selectarrow 等)。VSCode 风格语法配色,Ctrl+C 复制节点文本。
右侧 Tabs
Styles、Computed、Layout、Attributes、Events、Bindings — 支持右键横向拖动。
Paint 调试
Layout tab 显示 display item、paint chunk、dirty pixel 统计。选中元素可查看 paint order、bounds、cache 状态。
事件模拟
Events tab 提供 Hover/Unhover/Focus/Blur/Click 按钮。Pick 模式不触发控件行为,需用这些按钮模拟。
绑定检查
Bindings tab 列出事件属性和已实现 Blueprint 函数,支持 Jump 跳转和 Copy 复制。

性能统计与调试
GetLastRenderStats()
查看 RhiDrawCallCount、RhiBatchCount、RhiTextureUploadCount、BackdropFilterPassCount、FilterCompositePassCount 等约 90 个统计字段。
GetLastEventDebugInfo()
查看最近一次事件桥调用,排查 HTML 事件名、参数、目标对象或 missing function warning。
编辑器诊断
HTML/CSS 编辑器底部状态栏显示诊断摘要,可跳转上一个/下一个诊断并复制诊断文本。
性能建议
高频输入/hover/scroll 尽量 trigger render-only 刷新。列表批量更新优先 class、attribute 或 DataModel 批处理。
Blueprint API
Blueprint API
蓝图 API
每个条目都按实际 Blueprint 节点展示 C++ 名称、返回值、参数、用途和典型场景。点击“复制节点”可把可粘贴的 Blueprint 节点文本写入剪贴板。
预热文档
设置语言
刷新本地化
按 ID 获取元素
查询选择器
验证元素句柄
设置文本内容
设置属性
读取属性
设置样式属性
切换 Class
设置模型字符串
获取当前输入设备
获取当前手柄型号
设置输入设备覆盖
清除输入设备覆盖
设置手柄导航配置覆盖
清除手柄导航配置覆盖
获取当前手柄导航配置
进入手柄输入模式
进入键鼠输入模式
获取按键名称
设置键鼠光标外观覆盖
清除键鼠光标外观覆盖
设置手柄光标外观覆盖
清除手柄光标外观覆盖
参考速查
集中列出 WebUIX 常用标签、事件属性、CSS 属性和状态选择器,方便快速查找。
事件属性
CSS 属性速查
布局
Flexbox / Grid
文字
效果
音效
Native Tags
输入与 IME
Windows IME 通过 UE 文本输入接口接入。OnInput 实时同步、OnChange
提交语义、OnTextInput 底层字符流(中文输入不要只依赖它)。
项目设置
通过 Project Settings → Plugins → WebUIX 访问(UWebUIXSettings)。
| Setting | 默认 | 说明 |
|---|---|---|
TargetFrameRate | 60 | WebUIX 控件最大渲染帧率 |
bEnableExperimentalNativeIme | true | 启用原生 Windows IME(实验性) |
bPackageWebUIXInspectorInRuntime | false | 打包时包含调试控制台(Editor/PIE 无需开启,直接按 F8) |
bAutoPrewarmDocument | true | 首次加载时自动预热文档 |
TextContrast | 0.16 | 文字渲染对比度乘数 |
TextGamma | 0.92 | 文字渲染伽马 |
ResourcePickerImageExtensions | png, jpg, jpeg, bmp, tga, webp, svg | 子像素字体渲染 |
ResourcePickerAudioExtensions | wav, ogg, mp3, flac | 视口裁剪额外像素 |
DocumentRoot | — | Editor-only 外置 HTML 文件根目录 |
Components | — | Project Settings 中全局注册的 WebUIXComponent Blueprint 类列表;注册后可在 HTML 中直接使用对应 TagName。 |
bEnableWebUIXGamepadInputSystem | true | 是否启用手柄输入系统(自动输入设备检测、虚拟手柄光标、方向键/摇杆 UI 导航)。 |
bAutoSwitchInputModeByDevice | true | 是否根据最近一次输入事件的设备类型自动切换当前输入模式(键鼠/手柄)。 |
已知限制
- 1.2.0 已更新并验证 UE 5.0-5.8 的 Win64 插件包;运行时代码可随项目按目标平台构建。
- WebUIX 是自研 HTML/CSS 渲染器,不是 Chromium 浏览器;不执行 JavaScript,不加载任意网页。
- 不支持
<video>、浏览器媒体播放 API、<iframe>。 - SVG 已支持内联、内置、外部和 cooked 资源路径,但不是完整浏览器 SVG 兼容层;复杂 SVG 仍建议在目标 UI 中验证。
- CSS Grid 已支持常用布局路径,但复杂网页级布局仍需按目标 UI 验证。
- 不支持浏览器 API(
window、document、fetch、localStorage等)。 - 外置 .html/.css 文件只用于 Editor 开发期同步与热重载;打包后不要依赖这些 loose files。正式项目使用 WebUIXUserWidget 的 Embedded HTML,共享样式可使用 UWebUIXCssStyleSheet 资源。
- IME 原生输入法(Windows)为实验性功能,其他平台使用回退模式。
- 无远程 URL 支持 — 所有资产必须来自 UE 资产系统或项目本地文件路径。