WebUIX

Native Unreal Engine HTML/CSS UI documentation for WebUIX 1.2.0, updated for editor workflow, thumbnails, rendering fixes, and UE 5.0-5.8 packages.

v1.5.1 UE 5.0 - UE 5.8 · Win64 packages UE 5.0 - 5.8Native HTML/CSSNo CEF / ChromiumNo JavaScript

开始

概览

WebUIX Overview

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 里的 onclickonchange 等事件会调用同名 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>

使用到游戏中

  • 点击 CompileSave
  • 运行时像普通 UMG 一样 Create WidgetAdd to Viewport,也可以放进 HUD、其他 UMG 或 3D Widget 工作流。
  • 多个界面需要共享样式时,可以引用独立 WebUIX CSS Stylesheet 资产;HTML 源码放在各自的 WebUIXUserWidget Embedded 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 UIMap 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地图加载或关卡切换阶段显示,适合地图名、加载状态和提示文本。

模板变量

{{LoadingProgress}}{{LoadingProgressPercent}}{{LoadingStatus}}{{LoadingMapName}}
<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 配置、本地化文本和项目级设置。

WebUIX Widget Blueprint 编辑器截图
Widget Blueprint 编辑器。 左侧是 My Blueprint 变量与事件,中间是 Preview 和 HTML/CSS Source,右侧是 Blueprint Logic 图表。
WebUIX Loading Config 编辑器截图
Loading Config 编辑器。 Loading Screen 资产可分别编辑 Startup Screen 和 Map Loading,并同屏查看预览、源码和蓝图逻辑。
WebUIX Demo 与本地化模板截图
Demo 与本地化。 示例 Widget 展示运行时页面、HTML 模板、本地化 key 和 Blueprint 事件如何组合。
WebUIX Project Settings 截图
Project Settings。 项目设置集中管理输入法、Inspector、Loading Screen、Editor-only 外部文本同步、资源选择器和渲染质量选项。

HTML/CSS 基础

支持的 HTML 标签

headbodylinktitle divsectionarticleheaderfootermainnavaside spanph1h2h3h4h5h6 ulollitabletheadtbodytrtdth buttoninputtextareaselectoptionlabel imgprogressasvg

扩展元素: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 属性速查

布局与尺寸

displaypositionposition:stickyinsettoprightbottomleftwidthheightmin/max-widthmin/max-heightoverflowz-index

盒模型

marginpaddingborderborder-widthborder-colorborder-radiusbox-sizingbox-shadow

文字

font-familyfont-sizefont-weightfont-styleline-heightletter-spacingtext-aligntext-decorationtext-overflowwhite-spaceword-breakcolortext-shadow

Flexbox

flex-directionflex-wrapflexflex-growflex-shrinkalign-itemsalign-contentalign-selfjustify-contentrow-gapcolumn-gap

背景与渲染

background-colorbackground-imagebackground-sizelinear-gradientradial-gradientopacitytransformtransform-origintransitionanimationimage-color

单位与值

dpemremvwvh%calc()min()max()inheritinitialunset

Pseudo-class 状态

:hover:active:focus:checked:disabled :first-child:last-child:nth-child(n):not(...)

扩展状态::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-soundURI指向 USoundBase 资产路径
background-sound-volumefloat1.0音量乘数(>=0)
background-sound-pitchfloat1.0音高乘数(>=0.01)
background-sound-cooldowntime0播放冷却时间,支持 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>

项目级注册

  1. 创建 Blueprint 组件类,父类选择 WebUIXComponent
  2. 设置组件 TagName。HTML 中写同名标签时,运行时会按归一化标签名匹配并展开该组件。
  3. 在组件 Blueprint 中暴露属性、事件或函数;编辑器补全会读取这些描述,HTML 中可通过属性和事件回调使用。
  4. 需要全项目可用时,把组件类添加到 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,可见性切换使用 showkey 用于循环项稳定复用。

<!-- repeat an element -->
<div class="item-row" for="(item, index) in Items" key="item.Id">
  {{index}}. {{item.Name}} &times; {{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>

多语言与本地化

WebUIX 通过 Unreal 本地化资源支持运行时多语言 UI。在 HTML 中使用 {{loc:key|fallback}} 写文本,然后用 Unreal 的 Localization 面板完成收集、翻译和编译;运行时通过 Blueprint 切换 culture。

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>

本地化面板流程

  1. 在 WebUIX HTML / Embedded Document 中新增或修改 {{loc:key|fallback}}。
  2. 在 Unreal Editor 的 Localization 面板中打开项目本地化目标,执行 Gather 收集文本。
  3. 在同一个本地化面板中填写或导入目标语言翻译,然后执行 Compile 生成运行时资源。
  4. 保存本地化面板生成/更新的资源即可;正常流程不需要手动编辑底层本地化文件。

运行时切换语言

在 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 包含 typewatchIdtargetIdnamepropertyelapseddurationprogresscurrentValue 等字段。

拖拽系统

网格拖拽

<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-titlemodal-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 WidgetHide WebUIX WidgetShow WebUIX Widget(复用实例)。

启动预热

UWebUIXStartupWarmupSubsystem 在游戏启动时自动扫描已 Cook 的 Widget Blueprint,预加载文档和资源。首次打开 UI 零延迟。

配置条件

  1. Widget Blueprint 父类必须是 UWebUIXUserWidget
  2. 设置 bWarmupOnGameStart = true
  3. 必须设置 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 节点文本写入剪贴板。

重新加载文档

C++ReloadDocument返回值void参数None用途按当前配置重新加载 WebUIX markup。场景修改 Embedded HTML、CSS、Editor-only 外置开发文件或运行时源码后刷新界面;打包后不要依赖外部 .html/.css 文件。

预热文档

C++PrewarmDocument返回值bool参数None用途提前准备页面资源,可用于 Embedded HTML、CSS 资产和运行时页面源码。场景菜单打开前预热,减少首次显示时的解析、资源加载和布局成本。

设置语言

C++SetCulture返回值bool参数Culture Name用途切换当前 UE culture 并刷新 WebUIX 本地化文本。场景游戏内语言切换,例如 zh-Hans / en。

刷新本地化

C++RefreshLocalization返回值void参数None用途使用当前语言重新加载本地化文本。场景外部已改变 culture,只需要刷新当前页面文本。

按 ID 获取元素

C++GetElementById返回值FWebUIXElementHandle参数Element ID用途匹配 document.getElementById(id)。场景获取页面上的按钮、文本块或容器,后续执行 DOM 操作。

查询选择器

C++QuerySelector返回值FWebUIXElementHandle参数Selector用途使用 CSS selector 查找第一个匹配元素。场景页面结构不方便固定 id,或需要按 class / 属性查找。

验证元素句柄

C++IsElementHandleValid返回值bool参数Element用途检查 Element Handle 是否仍能解析到当前文档节点。场景文档重载后,避免继续操作已失效的元素。

设置文本内容

C++SetTextContent返回值bool参数Element, Text用途匹配 node.textContent = text。场景蓝图动态更新标题、提示、分数或状态文本。

设置属性

C++SetAttribute返回值bool参数Element, Name, Value用途匹配 element.setAttribute(name, value)。场景写入 value、data-*、aria-* 或自定义状态属性。

读取属性

C++GetAttribute返回值bool + Out Value参数Element, Name用途匹配 element.getAttribute(name)。场景读取 HTML 当前状态,再决定后续蓝图逻辑。

设置样式属性

C++StyleSetProperty返回值bool参数Element, Property Name, Value用途匹配 element.style.setProperty(name, value)。场景从蓝图切换 display、opacity、transform、color 等样式。

切换 Class

C++ClassListToggle返回值bool + Out Enabled参数Element, Class Name用途匹配 element.classList.toggle(className)。场景用 class 驱动 CSS 状态,例如 open、selected、disabled。

设置模型字符串

C++SetModelString返回值bool参数Model Name, Variable Name, Value用途写入 DataModel 字符串变量并触发 UI 刷新。场景配合模板绑定 、{{Model.Name}} 更新页面内容。

获取当前输入设备

C++GetActiveInputDevice 返回值EWebUIXInputDeviceType 参数None 用途获取当前生效的输入设备类型(键鼠、手柄、触控或未知)。 场景根据当前输入设备切换 UI 提示图标或高亮对应的操作提示。

获取当前手柄型号

C++GetActiveGamepadModel 返回值FName 参数None 用途获取当前激活手柄的具体型号标识(例如区分 Xbox、PlayStation 手柄)。 场景按手柄品牌显示对应按键图标,例如 Xbox 的 A 键与 PlayStation 的 × 键。

设置输入设备覆盖

C++SetInputDeviceOverride 返回值void 参数Device Type 用途强制指定当前输入设备类型,覆盖自动检测结果。 场景需要在编辑器或运行时手动预览键鼠/手柄提示图标切换效果。

清除输入设备覆盖

C++ClearInputDeviceOverride 返回值void 参数None 用途清除手动指定的输入设备类型,恢复自动检测。 场景关闭手动预览模式,让插件重新按最近输入自动切换设备。

设置手柄导航配置覆盖

C++SetGamepadInputConfigOverride 返回值void 参数Config 用途覆盖手柄的确认/取消按键、方向导航按键和导航摇杆映射。 场景项目需要自定义手柄导航按键映射,例如交换确认与取消键。

清除手柄导航配置覆盖

C++ClearGamepadInputConfigOverride 返回值void 参数None 用途清除手动覆盖的手柄导航配置,恢复 Project Settings 中的默认值。 场景重置手柄导航按键映射设置。

获取当前手柄导航配置

C++GetGamepadInputConfig 返回值FWebUIXGamepadInputConfig 参数None 用途读取当前生效的手柄导航配置(确认/取消键、方向键、导航摇杆等)。 场景需要在设置界面展示当前手柄按键映射。

进入手柄输入模式

C++EnterGamepadInputMode 返回值void 参数None 用途手动切换到手柄输入模式:显示虚拟手柄光标并启用方向导航。 场景玩家在设置界面手动选择“使用手柄”。

进入键鼠输入模式

C++EnterMouseKeyboardInputMode 返回值void 参数None 用途手动切换到键鼠输入模式:隐藏虚拟手柄光标并恢复正常鼠标光标。 场景玩家在设置界面手动选择“使用键鼠”。

获取按键名称

C++GetKeyName 返回值FName 参数Key 用途获取指定 FKey 的显示名称,用于按键提示图标匹配。 场景配合按键提示图标 DataTable / BP_InputIcon,按当前按下的键查找对应图标。

设置键鼠光标外观覆盖

C++SetMouseKeyboardCursorOverride 返回值void 参数Style 用途覆盖键鼠模式下光标的外观(内置样式,或自定义贴图+热点)。 场景为游戏自定义鼠标光标的外观风格。

清除键鼠光标外观覆盖

C++ClearMouseKeyboardCursorOverride 返回值void 参数None 用途清除覆盖的键鼠光标外观,恢复默认光标样式。 场景重置鼠标光标外观。

设置手柄光标外观覆盖

C++SetGamepadCursorOverride 返回值void 参数Style 用途覆盖手柄模式下虚拟光标的外观(内置样式,或自定义贴图+热点)。 场景为手柄虚拟光标自定义外观风格。

清除手柄光标外观覆盖

C++ClearGamepadCursorOverride 返回值void 参数None 用途清除覆盖的手柄虚拟光标外观,恢复默认样式。 场景重置手柄虚拟光标外观。

参考速查

集中列出 WebUIX 常用标签、事件属性、CSS 属性和状态选择器,方便快速查找。

事件属性

OnClickOnDblClickOnInputOnChangeOnOpenOnCloseOnFocusOnBlurOnKeyDownOnKeyUpOnDragstartOnDragOnDragendOnDragoverOnDragoutOnDragdropOnAnimationStartOnAnimationUpdateOnAnimationEndOnAnimationCancelOnAnyKeyDownOnAnyKeyUpOnInputDeviceChanged

CSS 属性速查

布局

displaypositionwidthheightoverflowz-index

Flexbox / Grid

flex-directionjustify-contentalign-itemsgapdisplay:gridgrid-template-columnsgrid-area

文字

font-familyfont-sizefont-weightcolortext-alignline-height

效果

opacitytransformtransitionanimationfilter:blur()filter:drop-shadow()backdrop-filter

音效

background-soundbackground-sound-volumebackground-sound-pitchbackground-sound-cooldown

Native Tags

passwordmodaltooltipdropdownselectradio-optioncheckbox-optiondrag-areadrag-itemdrag-celldrop-zoneanimation-watchwebuix-html

输入与 IME

Windows IME 通过 UE 文本输入接口接入。OnInput 实时同步、OnChange 提交语义、OnTextInput 底层字符流(中文输入不要只依赖它)。

项目设置

通过 Project Settings → Plugins → WebUIX 访问(UWebUIXSettings)。

Setting默认说明
TargetFrameRate60WebUIX 控件最大渲染帧率
bEnableExperimentalNativeImetrue启用原生 Windows IME(实验性)
bPackageWebUIXInspectorInRuntimefalse打包时包含调试控制台(Editor/PIE 无需开启,直接按 F8)
bAutoPrewarmDocumenttrue首次加载时自动预热文档
TextContrast0.16文字渲染对比度乘数
TextGamma0.92文字渲染伽马
ResourcePickerImageExtensionspng, jpg, jpeg, bmp, tga, webp, svg子像素字体渲染
ResourcePickerAudioExtensionswav, ogg, mp3, flac视口裁剪额外像素
DocumentRootEditor-only 外置 HTML 文件根目录
ComponentsProject Settings 中全局注册的 WebUIXComponent Blueprint 类列表;注册后可在 HTML 中直接使用对应 TagName
bEnableWebUIXGamepadInputSystemtrue是否启用手柄输入系统(自动输入设备检测、虚拟手柄光标、方向键/摇杆 UI 导航)。
bAutoSwitchInputModeByDevicetrue是否根据最近一次输入事件的设备类型自动切换当前输入模式(键鼠/手柄)。

已知限制

  • 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(windowdocumentfetchlocalStorage 等)。
  • 外置 .html/.css 文件只用于 Editor 开发期同步与热重载;打包后不要依赖这些 loose files。正式项目使用 WebUIXUserWidget 的 Embedded HTML,共享样式可使用 UWebUIXCssStyleSheet 资源。
  • IME 原生输入法(Windows)为实验性功能,其他平台使用回退模式。
  • 无远程 URL 支持 — 所有资产必须来自 UE 资产系统或项目本地文件路径。