概览
WebUIX 是自研的 HTML/CSS UI 渲染引擎,作为原生 UMG 插件运行在 Unreal Engine 中。无浏览器进程、无 JavaScript 引擎、无 CEF/Chromium — 用熟悉的 HTML/CSS 语法构建游戏 UI,通过 Blueprint 完成所有交互逻辑。
全平台支持
Win64、macOS、Linux、Android、iOS — 一套 HTML/CSS 在所有平台上渲染一致
高性能原生渲染
Direct RHI 渲染,无浏览器进程开销。支持跨帧缓存、脏区增量更新、独立 RT 拖拽预览
HTML/CSS 开发体验
Box model、Flexbox、过渡动画、CSS 滤镜、UI 音效 — 用 Web 前端技能构建游戏 UI
Blueprint 深度集成
事件桥(OnClick 调 UFUNCTION)、数据模型绑定、完整 DOM API、自定义组件系统
自定义 HTML 组件
在 Blueprint 中创建新 HTML 标签,定义自定义属性与事件。组件内 UFUNCTION 可直接在 HTML 中调用 — 类似 Web Components 开发模式
内置调试控制台
F8 打开 — 实时 DOM 树、元素选择器、样式计算面板、渲染统计、脏区可视化
快速开始
WebUIXUserWidget,在同一个 Widget Blueprint 资产里完成 HTML、CSS、预览和蓝图逻辑。1. 创建资产
在 Content Browser 中使用 Add → WebUIX → Widget Blueprint / WebUIX User Widget。创建出的 Blueprint 父类是 UWebUIXUserWidget。
2. 内置编辑
打开资产后,直接在 WebUIX 编辑器布局里修改 HTML / CSS。普通界面不再需要先创建独立 WebUIX Widget 再手动绑定 HTML 文档。
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 HTML / CSS 资产;单个界面优先直接在
WebUIXUserWidget内完成。
编辑器工作流
内置代码编辑器
双击 HTML/CSS 资产打开,支持语法高亮、Ctrl+S 保存、Alt+Shift+F 格式化、自动补全(标签、属性、事件、CSS 属性、资源路径)。编辑器默认置顶。
外部文件同步与热重载
可指定外部 .html/.css 文件路径,编辑后自动检测变化并热重载。适合开发期快速迭代。正式项目推荐使用 UWebUIXHtmlDocument 资产。
资源选择器
CSS 中写 url(...) 时可打开资源选择器,按类型(图片、音频、字体等)筛选 UE 资产。音频资源支持预览播放。
诊断面板
编辑器底部状态栏显示诊断摘要(错误/警告),可跳转上一个/下一个诊断并复制诊断文本。
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="brand">WebUIX</div>
<div class="subtitle">{{LoadingStatus}}</div>
<div class="bar">
<div class="bar-fill" style="width: {{LoadingProgressPercent}}%;"></div>
</div>
</div>
Timing 配置
| 字段 | 说明 |
|---|---|
Minimum Display Time | 最短显示时间,避免加载界面一闪而过。 |
Maximum Display Time | 限制最长显示时间,防止异常加载永久卡住。 |
Fade In / Fade Out Duration | 控制加载界面的淡入淡出时间。 |
Auto Hide When Loading Completes | 加载完成后自动隐藏。 |
Block Until First Frame | 首帧准备完成前保持加载界面,减少黑屏或未初始化画面。 |
Hide Policy | 隐藏策略:手动、加载完成后、达到最短显示时间后。 |
Skip 配置
| 模式 | 说明 |
|---|---|
Disabled | 用户不能跳过。 |
Blueprint Only | 只能由蓝图调用跳过。 |
Any Key Or Click | 用户按键或点击即可请求跳过。 |
蓝图生命周期
在 Loading Config Blueprint 内实现这些事件和函数,可以控制开始显示、地图加载、加载完成、跳过请求、是否隐藏和是否允许跳过。
全局 Blueprint API
建议由加载管理器或 GameInstance 统一调用 WebUIX Set Loading Progress,页面只负责展示模板变量和响应生命周期事件。
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)在 Cook 时嵌入到 UWebUIXHtmlDocument 的派生数据中。
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);
transition: filter 200ms;
}
.inactive {
filter: brightness(0.6) saturate(0.3);
}
backdrop-filter
backdrop-filter 对元素背后区域的内容应用滤镜(常用于毛玻璃效果)。
.glass-panel {
background: rgba(255,255,255,.12);
backdrop-filter: blur(16dp);
border: 1dp rgba(255,255,255,.2);
border-radius: 16dp;
}
.overlay {
backdrop-filter: blur(8dp) brightness(0.5);
}
backdrop-filter 会引入额外的 RHI 渲染通道(BackdropFilterPass)。大量使用可能增加 GPU 开销,建议在调试控制台的 Paint 面板中查看 BackdropFilterPassCount 统计。
filter 与动画
filter 属性支持 CSS transition 和 animation 平滑过渡:
.btn {
filter: brightness(1);
transition: filter 150ms ease;
}
.btn:hover { filter: brightness(1.15); }
.btn:active { filter: brightness(0.92); }
@keyframes pulse-glow {
0%, 100% { filter: drop-shadow(0 0 4dp #38bdf844); }
50% { filter: drop-shadow(0 0 16dp #38bdf8aa); }
}
.glow { animation: pulse-glow 2s ease-in-out infinite; }
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:/// 前缀(编辑器资源选择器自动补全):
/* Hover: glass sound, 50ms cooldown */
.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;
}
/* Click: crisp click sound, higher volume */
.ui-click-sound:active {
background-sound: url("asset:///WebUIX/WebUIX/Sound/click_003.click_003");
background-sound-volume: 0.55;
background-sound-cooldown: 0.05s;
}
/* Focus: focus feedback sound */
.ui-focus-sound:focus {
background-sound: url("asset:///WebUIX/WebUIX/Sound/close_002.close_002");
background-sound-volume: 0.28;
}
<button class="btn primary ui-hover-sound ui-click-sound ui-focus-sound">
Confirm
</button>
提示:音效资产通过软引用(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; }
}
.modal-open { animation: slide-in 200ms ease-out; }
@keyframes fade-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.loading { animation: fade-pulse 1.2s ease-in-out infinite; }
支持:timing-function、iteration-count、direction、fill-mode、delay、play-state。
animation-watch 元素
animation-watch 观察 CSS 动画状态并通过事件桥发送 JSON payload 给 Blueprint。详见扩展元素章节。
自定义组件
WebUIX 允许在 Blueprint 中创建全新的 HTML 标签 — 不是简单模板,而是一个拥有完整生命周期的组件。内置的
drag-area、modal、dropdown 等扩展元素均以这种方式实现。
快速创建
- 创建 Blueprint,父类选择 UWebUIXComponent
- 在 Class Settings 中填写
TagName(如my-card) - 编写默认 HTML 模板和 CSS — 这构成组件内部结构
- 实现
Construct/Tick/Destruct事件,通过Dom操作内部 DOM
暴露属性与事件 — 点击"公开"即可
在 Blueprint 中编写 UFUNCTION(BlueprintCallable) 函数后,只需在函数上点击 公开到
HTML,该函数就会自动成为 HTML 中可用的 OnXxx 事件属性。同样,Blueprint 变量点击公开后,即可在 HTML 中作为自定义属性使用。
<!-- Exposed as event: bind directly in HTML -->
<my-card title="Sword" OnCardClicked="OnSwordPicked(id)" OnRarityChanged="OnRarityUpdate(rarity)"></my-card>
<!-- Exposed as attribute: pass values like native attributes -->
<my-card title="Sword of Light" badge="{{Model.NewItems}}" rarity="epic" locked="true">
<p>A legendary weapon.</p>
</my-card>
<!-- Exposed as function: call directly in templates -->
<span>{{UE::CallText(GetCardStatus)}}</span>
编辑器的 HTML 代码补全会自动列出所有已注册组件的自定义属性、事件和函数,无需手动查找。
注册组件
全局:添加到 Project Settings → WebUIX →
Components,所有文档可用。
文档级:添加到 UWebUIXHtmlDocument 的 Components 数组,仅该文档可用。
DOM API
Dom->GetElementById("my-id");
Dom->QuerySelector(".my-class");
Dom->SetAttribute("badge", "5");
Dom->ClassListAdd("highlight");
Dom->StyleSetProperty("color", "#ff0");
Dom->SetTextContent("Updated!");
Dom->AppendChild(newElement);
数据绑定与模板
上下文变量 {{变量}}
从 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 内置统计 {{UE::FPS}}
| Token | 说明 |
|---|---|
{{UE::FPS}} |
当前帧率 |
{{UE::FrameMs}} |
总帧时间 (ms) |
{{UE::UpdateMs}} |
DOM 更新时间 (ms) |
{{UE::RenderMs}} |
渲染时间 (ms) |
{{UE::RhiDraws}} |
RHI 绘制调用数 |
{{UE::WidgetWidth}} / {{UE::WidgetHeight}} |
控件显示尺寸 |
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>
模板指令
<!-- forEach loop -->
<template foreach="item in Model.Items">
<div class="item-row">{{item.Name}} × {{item.Count}}</div>
</template>
<!-- Conditional rendering -->
<template if="{{Model.IsLoggedIn}}">
<div class="welcome">Welcome, {{PlayerName}}!</div>
</template>
<template else>
<div class="login-prompt">Please log in.</div>
</template>
<!-- switch -->
<template switch="{{Model.Tab}}">
<template case="inventory"><div>Inventory</div></template>
<template case="shop"><div>Shop</div></template>
<template default><div>Unknown</div></template>
</template>
<!-- show visibility control -->
<div show="{{Model.HasBonus}}">Bonus Active!</div>
事件桥
通过 HTML 事件属性调用 Blueprint UFUNCTION,按函数名查找 Widget 或 Bridge Target。
支持的事件
| 事件 | 触发时机 |
|---|---|
OnClick |
鼠标/触摸点击释放 |
OnDblClick |
双击 |
OnInput |
输入值变化(每次按键) |
OnChange |
值提交(blur/Enter/松开) |
OnFocus |
获得焦点 |
OnBlur |
失去焦点 |
OnKeyDown / OnKeyUp |
键盘按下/释放 |
OnOpen / OnClose |
元素打开/关闭 |
OnDragstart / OnDrag / OnDragend |
拖拽开始/移动/结束 |
OnDragover / OnDragout / OnDragdrop |
拖拽悬停/离开/放下 |
OnAnimationStart / OnAnimationUpdate / OnAnimationEnd /
OnAnimationCancel |
动画生命周期 |
使用示例
<button OnClick="StartGame">Start</button>
<button OnClick="OpenSettings(panel='video')">Settings</button>
<input value="{{Model.SearchText}}" OnChange="OnSearchChanged(value)" />
<input value="{{Model.Name}}" OnInput="OnNameInput(value)" />
<div class="item-slot" OnClick="OnSlotClicked(id)" />
<drag-area OnDrop="OnItemDropped(event, id)" />
Bridge Object
创建 UWebUIXBridgeObject,设置 TargetObject,赋给 Widget 的 BridgeObject 属性。事件按名称路由到目标对象。
UMG 导航 (nav-order)
通过 nav-order 属性控制手柄/键盘导航顺序:
<button nav-order="10">First</button>
<button nav-order="20">Second</button>
<button nav-order="auto">Auto</button>
<div nav-order="none">Skipped</div>
动画监听
<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-anchor="center" OnDragdrop="OnBagDrop(TargetId)">
<drag-cell class="slot">
<span>#{{dragCell::DisplayIndex}}</span>
<span>{{dragCell::DisplayCol}},{{dragCell::DisplayRow}}</span>
</drag-cell>
<drag-item id="sword" col="0" row="0" cols="2" rows="2"
OnDragstart="OnItemDragStart" OnDragend="OnItemDragEnd">
<b>2x2</b>
</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" edge_margin="0dp">
Drag Panel
</handle>
<p>This panel can be moved by dragging the title bar.</p>
</div>
handle 元素通过 move_target 指定被拖拽的目标,edge_margin
限制边界。拖拽预览渲染在独立透明 RT 上,主页面纹理不会被修改。
拖拽状态 CSS
drag-cell.slot:hot { background: #38bdf833; }
drag-cell.slot:occupied { border-color: #f59e0b; }
drag-item.item:dragging { opacity: .72; transform: scale(1.04); }
drag-item.item:invalid { filter: drop-shadow(0 0 8dp #ef4444); }
表单控件
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)" />
渲染管线
WebUIX 使用保留渲染架构,每帧仅重新绘制发生变化的区域。
HTML + CSS -> DOM -> Style Cascade -> Layout -> Display List -> RHI Render Target -> Slate Present
瓦片绘制缓存
页面分为瓦片,稳定区域不重绘。仅脏瓦片被标记并重新光栅化。
Last-Frame-Wins
高频交互采用 latest-frame-wins 策略:旧视觉帧可以丢弃,最终状态保持准确。
独立拖拽预览
拖拽预览渲染在独立透明 RT 上 — 主页面纹理在拖拽过程中不会被修改。
避免不必要的 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 预处理
UWebUIXHtmlDocument 在保存/Cook 时生成预计算数据,运行时直接使用,无需文件 I/O 或重新解析。
预计算内容
| 数据 | 说明 |
|---|---|
ResolvedHtmlBundle |
合并后的 HTML + 链接的 CSS |
CookedDomNodes |
预解析的 DOM 树 |
CookedStyleSheet |
已解析的样式表 |
CookedImageResources |
压缩后的图片字节(PNG/JPG) |
ReferencedAssets |
文档引用的所有 UE 资产(图片、音频等软引用) |
修改 HTML/CSS 源码后调用 UWebUIXHtmlDocument::RefreshDerivedData() 更新资产派生信息。
调试控制台
内置调试工具,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
WebUIXUserWidget、WebUIXWidget 和 DOM / Element 句柄使用。推荐先通过元素 ID 或选择器拿到目标元素,再调用 DOM、样式、事件或材质接口。DOM 与元素查询
模板与数据绑定
HTML 可以使用模板表达式绑定蓝图或运行时数据,也可以通过事件属性调用同名 Blueprint 函数或事件。
元素材质 API
这些节点用于控制 HTML 元素上的材质。元素可以是使用材质作为 background-image 的 div,也可以是使用材质资源的 img。只要元素最终由 WebUIX 解析为材质资源,就可以通过同一套 API 获取和修改。
Get Element Material 需要元素已完成解析并至少渲染过一次。如果在 Construct 同帧太早调用,可能拿不到材质。推荐在页面切换完成后、下一帧、Tick 或明确初始化事件之后获取并缓存句柄。<div id="hud-minimap" style="background-image: url('/Game/UI/M_UI_Minimap.M_UI_Minimap');"></div>
Loading API
参考速查
集中列出 WebUIX 常用标签、事件属性、CSS 属性和状态选择器,方便快速查找。
事件属性
CSS 属性速查
布局
盒模型
文字
效果
音效
背景
Flexbox
模板
输入与 IME
Windows IME 通过 UE 文本输入接口接入。OnInput 实时同步、OnChange
提交语义、OnTextInput 底层字符流(中文输入不要只依赖它)。
项目设置
通过 Project Settings → Plugins → WebUIX 访问(UWebUIXSettings)。
| Setting | 默认 | 说明 |
|---|---|---|
TargetFrameRate |
60 | WebUIX 控件最大渲染帧率 |
bEnableExperimentalNativeIme |
false | 启用原生 Windows IME(实验性) |
bPackageWebUIXInspectorInRuntime |
false | 打包时包含调试控制台(Editor/PIE 无需开启,直接按 F8) |
bAutoPrewarmDocument |
true | 首次加载时自动预热文档 |
TextContrast |
1.0 | 文字渲染对比度乘数 |
TextGamma |
1.0 | 文字渲染伽马 |
bEnableSubpixelText |
true | 子像素字体渲染 |
ViewportCullingPaddingPx |
8 | 视口裁剪额外像素 |
DocumentRoot |
— | 外置 HTML 文件根目录 |
Components |
— | 全局注册的自定义组件类列表 |
已知限制
- 支持平台:Win64、macOS、Linux、Android、iOS。
- WebUIX 是自研 HTML/CSS 渲染器,不是 Chromium 浏览器;不执行 JavaScript,不加载任意网页。
- 不支持
<video>、<audio>、<canvas>、<iframe>。 - 不支持 CSS 自定义属性(
var(--...))— 使用模板绑定系统替代。 - 不支持 SVG 渲染 — 使用 PNG/JPG 图片资产。
- 不支持浏览器 API(
window、document、fetch、localStorage等)。 - 外置 .html/.css 文件适合开发期迭代;正式项目推荐使用 UWebUIXHtmlDocument / UWebUIXCssStyleSheet 资产。
- IME 原生输入法(Windows)为实验性功能,其他平台使用回退模式。
- 无远程 URL 支持 — 所有资产必须来自 UE 资产系统或项目本地文件路径。