WebUIX

Unreal Engine 原生 HTML/CSS UI 插件 - 无浏览器、无 JavaScript、纯 C++ 渲染 / Native HTML/CSS UI plugin for Unreal Engine - no browser, no JavaScript, pure C++ renderer

v1.7.0 UE 5.0 - UE 5.8 Win64 / macOS / LinuxAndroid / iOSDirect RHINo JS Engine

概览

WebUIX Overview

WebUIX for Unreal Engine

WebUIX 是自研的 HTML/CSS UI 渲染引擎,作为原生 UMG 插件运行在 Unreal Engine 中。无浏览器进程、无 JavaScript 引擎、无 CEF/Chromium — 用熟悉的 HTML/CSS 语法构建游戏 UI,通过 Blueprint 完成所有交互逻辑。

跨平台

目标平台:Win64、macOS、Linux、Android、iOS。媒体后端与部分功能存在平台差异,使用条件见 已知限制。

高性能原生渲染

Direct RHI 渲染,无浏览器进程开销。支持跨帧缓存、脏区增量更新、独立 RT 拖拽预览

HTML/CSS 开发体验

Box model、Flexbox、Grid、CSS 变量、过渡动画、滤镜、UI 音效及原生视频;支持范围以插件实现为准。

Blueprint 深度集成

事件桥、数据模型绑定、原生 DOM 操作 API 和自定义组件系统。

自定义 HTML 组件

在 Blueprint 中创建新 HTML 标签,定义自定义属性与事件。组件内 UFUNCTION 可直接在 HTML 中调用 — 类似 Web Components 开发模式

内置调试控制台

F8 打开 — 实时 DOM 树、元素选择器、样式计算面板、渲染统计、脏区可视化

手柄与控制器输入

自动输入设备检测(键鼠/触控/手柄),支持虚拟手柄光标(可为键鼠和手柄分别设置独立外观)与方向键/摇杆 UI 导航,nav-order 属性可显式控制导航顺序。

自定义 Emoji 字形

编辑器内置 Emoji Library 面板,可下载/导入/烘焙图标包,采用文件夹+SVG 格式,兼容 Twemoji/OpenMoji/Noto 目录约定;真彩色渲染,不受 CSS 文字颜色影响。

原生圆盘菜单

使用原生 radial-menu、radial-item 和 radial-center 元素构建动作圆盘,支持模板循环、百分比尺寸、空心中心、可配置边框与缝隙、图片、CSS hover 状态和蓝图事件。

浏览器风格边框

独立四边样式、椭圆与百分比圆角、轮廓、圆角阴影和九宫格边框图片,让装饰效果更贴近浏览器。

快速开始

当前推荐流程:直接创建并打开 WebUIXUserWidget,在同一个 Widget Blueprint 资产里完成 HTML、CSS、预览和蓝图逻辑。

1. 创建资产

在 Content Browser 中使用 Add → WebUIX → Widget Blueprint / WebUIX User Widget。创建出的 Blueprint 父类是 UWebUIXUserWidget。

2. 内置编辑

打开资产后,直接在 WebUIX 编辑器布局里修改 HTML / CSS。页面源码、预览和 Blueprint 逻辑在同一个资产中编辑。

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 资产链接到外部磁盘文件进行双向同步。外部文件修改后,编辑器会自动更新资产内容与预览;同步后的内容可以保存到资产中,方便搭配外部编辑器迭代。

资源选择器

CSS 中写 url(...) 时可打开资源选择器,按类型(图片、音频、字体等)筛选 UE 资产。音频资源支持预览播放。

诊断面板

编辑器底部状态栏显示诊断摘要(错误/警告),可跳转上一个/下一个诊断并复制诊断文本。

编辑器预览按 autoplay、muted、controls 属性播放视频,可使用原生控制条。资源选择器支持 video 的 src(MediaSource、Content/Movies 本地 MP4、在线 URL)与 poster(图片)。在线视频的播放效果取决于媒体来源、格式和播放器配置。

预览与页面状态

编辑器提供预览复用与滚动位置恢复,方便连续编辑同一页面。运行时切换页面时,可使用 Widget 组件池 复用实例并保留页面状态;局部内容变化优先使用模型、class 或 style 更新,刷新接口见 Blueprint API。

变换 HUD 与交互检查

嵌套 transform、hover 缩放和全屏尺寸变化涉及绘制、命中测试与裁剪。制作 HUD 时,在预览中同时检查视觉位置、鼠标或触摸命中区域和滚动容器裁剪,并用 调试控制台 查看元素。运行时 Inspector 的打包选项见 项目设置。

Loading Config

Loading Config 是 WebUIX 的加载界面配置资产,用来统一制作 Startup UI 和 Map Loading UI。它基于 UWebUIXLoadingScreenProfile,在一个 Blueprint 资产里保存页面、HTML、CSS、生命周期事件、跳过规则和进度状态。

创建资产

在 Content Browser 中使用 Add → WebUIX → Loading Config 创建资产,然后打开它编辑启动页和地图加载页。

项目设置启用

在 Project Settings → Game → 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="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用户按键或点击即可请求跳过。

蓝图生命周期

On Startup BeginOn Map Loading BeginOn Loading CompleteOn Skip RequestedShould Hide Loading ScreenCan Skip Loading ScreenSet Loading Progress

在 Loading Config Blueprint 内实现这些事件和函数,可以控制开始显示、地图加载、加载完成、跳过请求、是否隐藏和是否允许跳过。

全局 Blueprint API

WebUIX Show Startup Loading ScreenWebUIX Show Map Loading ScreenWebUIX Hide Loading ScreenWebUIX Request Skip Loading ScreenWebUIX Set Loading Progress

建议由加载管理器或 GameInstance 统一调用 WebUIX Set Loading Progress,页面只负责展示模板变量和响应生命周期事件。

编辑器界面

这些界面展示 WebUIX 的主要编辑体验:在 Unreal Editor 内同时处理 HTML/CSS、实时预览、Blueprint 逻辑、Loading Screen 配置、本地化文本和项目级设置。

WebUIX Widget Blueprint 编辑器截图
Widget Blueprint 编辑器。 左侧是 My Blueprint 变量与事件,中间是 Preview 和 HTML/CSS Source,右侧是 Blueprint Logic 图表。
  • 变量列表会显示名称、类型和绑定状态,方便检查模板数据来源。
  • Preview 面板用于快速查看 UI 布局,不需要离开 Widget Blueprint。
  • HTML/CSS Source 与 Widget 资产绑定,适合直接编辑结构和样式。
  • Blueprint Logic 与 WebUIX 事件、变量刷新和交互逻辑保持在同一个编辑器内。
WebUIX Loading Config 编辑器截图
Loading Config 编辑器。 Loading Screen 资产可分别编辑 Startup Screen 和 Map Loading,并同屏查看预览、源码和蓝图逻辑。
  • 顶部标签切换 Startup Screen 与 Map Loading 页面。
  • Preview 支持常见分辨率和比例检查。
  • HTML 模板可使用 LoadingProgressPercent、LoadingStatus 和 loc 本地化标记。
  • 右侧 Blueprint Logic 负责加载状态、进度和生命周期事件。
WebUIX Demo 与本地化模板截图
Demo 与本地化。 示例 Widget 展示运行时页面、HTML 模板、本地化 key 和 Blueprint 事件如何组合。
  • 模板中可直接写 loc key,并提供 fallback 文本。
  • Demo 页面展示按钮交互、页面切换、图片切换和调试入口的用法。
  • External Text 按钮用于把文本资源同步到外部编辑流程。
  • 右侧 Blueprint Graph 仍然负责 UI 事件和业务逻辑。
WebUIX Project Settings 截图
Project Settings。 项目设置集中管理输入法、Inspector、Loading Screen、外部文本同步、资源选择器和渲染质量选项。
  • Input Method 可启用 Native IME。
  • Debug 与 Shortcuts 控制 Inspector 打包和快捷键。
  • Loading Screen Config Asset 指定项目默认加载界面。
  • Rendering Performance 与 Rendering Quality 用于调节帧率预热、文本对比度和 Gamma。

1.7.0 更新内容

新增原生视频元素、本地与在线媒体来源、编辑器预览播放、视频资源选择器、原生控制条以及 Blueprint 播放接口与事件。Demo 增加在线视频展示。

媒体来源、播放器配置、播放接口与打包方法见 Video / Media,使用条件见 已知限制。

HTML/CSS 基础

支持的 HTML 标签

headbodylinktitle divsectionarticleheaderfootermainnavaside spanph1h2h3h4h5h6 ulollitabletheadtbodytrtdth buttoninputtextareaselectoptionlabel imgvideoprogressasvg

扩展元素: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)在 Cook 时嵌入到 UWebUIXHtmlDocument 的派生数据中。

支持 Grid 布局、--name 自定义属性、继承与 var(--name, fallback);复杂嵌套变量有解析深度限制,不保证所有 CSS Grid 或浏览器语法等价。视频可使用 object-fit / object-position,建议显式设置宽高以避免元数据加载后固有尺寸变化。

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>

静态音效引用可通过文档资源收集进入 Cook;动态指定的音效需显式提供资产引用。资源选择器的 Audio 筛选可插入路径。UI 音效不等同于 <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。详见扩展元素章节。

保留式动画路径

不需要布局且满足合成条件时,transform 和 opacity 动画可复用保留层;其他路径可能重新绘制。请用调试统计确认实际行为。

局部视觉变化优先使用 class、style 或模型更新,避免替换整份 HTML;改变 show、尺寸或布局样式仍可能触发布局。

自定义组件

WebUIX 允许在 Blueprint 中创建全新的 HTML 标签 — 不是简单模板,而是一个拥有完整生命周期的组件。内置的 drag-area、modal、dropdown 等扩展元素均以这种方式实现。

快速创建

  1. 创建 Blueprint,父类选择 UWebUIXComponent
  2. 在 Class Settings 中填写 TagName(如 my-card)
  3. 编写默认 HTML 模板和 CSS — 这构成组件内部结构
  4. 实现 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);

CSS 边框

WebUIX 支持独立四边、更多线型、椭圆与百分比圆角、轮廓和九宫格边框图片,使用浏览器风格的 CSS 语法。

独立四边与线型

可使用 border、border-width/style/color,或 border-top/right/bottom/left 简写与长写。四边可混合宽度、线型和颜色,并按浏览器式角点归属绘制。

soliddasheddotteddouble grooveridgeinsetoutset nonehidden

椭圆与百分比圆角

border-radius 支持一至四个角、斜杠分隔的水平/垂直半径、四角独立属性和百分比。

.panel {
  border-radius: 24dp 12dp 32dp 8dp / 16dp 28dp 12dp 20dp;
}
.avatar {
  border-radius: 50%;
}

圆角阴影

box-shadow 可配合 border-radius 绘制圆角外阴影与 inset 内阴影,支持多个逗号分隔的阴影层,以及偏移、模糊、扩展半径和透明颜色。外阴影会扩大绘制范围;大面积模糊阴影会增加绘制成本。

.shadow-panel {
  border-radius: 16dp;
  box-shadow: 0 8dp 24dp #00000066, inset 0 1dp 0 #ffffff33;
}

轮廓与偏移

outline 绘制在边框外侧且不占布局空间;outline-offset 可将其向内或向外偏移。

.focused {
  outline: 2dp dashed #67e8f9;
  outline-offset: 6dp;
}

九宫格边框图片

border-image 支持 source、slice、width、outset、repeat、fill 和简写形式,可用于可缩放框体。

.frame {
  border: 12dp solid transparent;
  border-image: url("/Game/UI/Frame.Frame") 24 fill / 12dp / 0 stretch;
}

混合边框示例

每条边和每个角都可以独立配置;相邻边按确定的浏览器式归属衔接,不会改变声明的边框宽度。

.mixed {
  border-top: 4dp solid #2563eb;
  border-right: 6dp dashed #0d9488;
  border-bottom: 7dp dotted #d97706;
  border-left: 8dp double #7c3aed;
  border-top-left-radius: 18dp 12dp;
  border-top-right-radius: 8dp 20dp;
  border-bottom-right-radius: 24dp 10dp;
  border-bottom-left-radius: 12dp 24dp;
}

兼容性说明

优先使用标准浏览器语法。WebUIX 将布局尺寸与边框绘制分开处理,因此轮廓和装饰边框无需额外补偿缝隙。

Video / Media

来源与最小示例

启用适合目标平台的 UE Media Framework 播放器插件。可通过 VideoPlayerOverrides 指定播放器,也可使用 UE 自动选择的播放器。缺少可用播放器会返回错误。

<video id="intro" src="Intro.mp4" controls muted style="width:640dp;height:360dp;object-fit:contain"></video>

本地 Intro.mp4 位于项目 Content/Movies;也可使用 Movies/Intro.mp4、asset:/Game/Media/Intro.Intro 的 MediaSource 资产 URI、HTTP/HTTPS MP4 直链或 HLS m3u8。不能填视频网站播放页面或 iframe 地址。

属性与预览

src、poster、autoplay、loop、muted、controls 均受支持。布尔属性按是否存在判断,autoplay="false" 仍会启用;模板需按条件添加/移除属性。默认打开媒体而不自动播放。编辑器预览可以播放和发声;默认静音适合展示。启动预加载阶段不打开视频。

支持显式尺寸、object-fit、object-position、圆角、透明度、裁剪和变换。无尺寸/元数据时使用 300×150,媒体元数据可能改变固有尺寸;需要稳定布局时设置宽高。首帧前显示 poster 或黑色背景,暂停和结束保留帧,Stop 回到 poster。控制条保持可见;不可跳转流禁用拖动,未知时长流显示 LIVE。

Blueprint

UWebUIXWidget 与 UWebUIXUserWidget 都使用 FWebUIXElementHandle;先 GetElementById("intro"),文档重建后重新取得句柄。

  • PlayVideo(Element)、PauseVideo(Element)、StopVideo(Element):bool 表示命令是否接受,Play 可在打开完成后执行;Stop 关闭媒体,再次 Play 重新打开。
  • SeekVideo(Element, Seconds):仅可跳转媒体接受,时间单位秒。
  • SetVideoVolume(Element, Volume):0–1;SetVideoMuted(Element, bMuted)、SetVideoLooping(Element, bLooping)。
  • SetVideoMediaSource(Element, Source):UMediaSource;字符串来源用 SetAttribute(Element, "src", Value),最后一次显式设置生效。
  • GetVideoState(Element, OutState):bool;FWebUIXVideoState 包含 Status、CurrentTime、Duration、VideoSize、Volume、bMuted、bLooping、bCanSeek、bBuffering、bHasVideoFrame、PlayerName、ErrorCode、ErrorMessage。

OnVideoEvent(Element, Event, State):Loaded、Playing、Paused、BufferingChanged、Ended、Error、Progress。Progress 最多每秒 4 次;控件进度绘制并不受这个通知频率限制。Loaded 不是首帧就绪,请检查 bHasVideoFrame。HTML 事件属性为 onloadeddata、onplay、onpause、onbufferingchange、onended、onerror、ontimeupdate;按现有事件桥绑定 Blueprint。

生命周期与错误

隐藏但存在的节点保持播放/音频;暂停或停止需显式调用。移除节点、替换文档和销毁 Widget 会关闭音频及播放器。换源会使旧回调失效。暂停不持续刷新静态视频区域,但其他动画仍可能使页面重绘。

错误可能为 InvalidSource、FileNotFound、NoCompatiblePlayer、OpenRejected、MediaOpenFailed、MediaPlaybackFailed、OpenTimeout。底层未必能准确区分网络与编码原因;打开超时为 30 秒。错误后可重新 Play,不无限重试。

打包与 Demo

将本地 MP4 放入项目 Content/Movies,并确认文件已包含在最终包中。MediaSource 资产可通过静态 URI、Blueprint 资产引用或 AdditionalResourceUris 纳入 Cook;其底层视频文件需单独包含。使用 PlatformMediaSource 时配置每个平台的媒体来源。动态来源需显式添加打包引用;网络视频需要联网播放,不会自动下载进发布包。

Demo 默认使用带署名授权的 Big Buck Bunny 在线片段,需要网络。离线使用时,将插件 Resources/WebUIX/Examples/Media/WebUIXDemo.mp4 复制到项目 Content/Movies/WebUIXDemo.mp4,再将 video 的 src 改为 WebUIXDemo.mp4。在线 MP4 服务端应支持 Range / HTTP 206;其他容器或编码的可用性取决于所选播放器。

数据绑定与模板

上下文变量 {{变量}}

从 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}} &times; {{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>

多语言与本地化

WebUIX 通过 Unreal 本地化资源支持运行时多语言 UI。在 HTML 中使用 {{loc:key|fallback}} 写文本,编译本地化资源,然后在运行时通过 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>
<span>{{loc:hud.health|Health}}: {{Model.Health}}</span>

属性与组件标签

本地化也可以写在属性值里,包括 label、placeholder、title、aria 文本以及 WebUIX 扩展元素配置。

<webuix-option-stepper
  label="{{loc:settings.graphics_quality|Graphics Quality}}"
  options="GraphicsQualityOptions"
  display-key="DisplayName"
  value-key="Value"
  onchange="OnGraphicsQualityChanged">
</webuix-option-stepper>

<input placeholder="{{loc:login.name_placeholder|Player name}}" />

Key 命名

推荐使用按功能域划分的 key,这样布局变化时翻译仍然稳定。不要用行号或临时控件名作为 key。

Key用途
menu.start主菜单标签和按钮。
hud.healthHUD 文本,例如生命值、分数、弹药或状态。
settings.graphics_quality设置面板标签和选项名。
login.name_placeholder输入框占位文本或提示文本。

收集与编译流程

  1. 在 WebUIX HTML 中新增或修改 {{loc:key|fallback}},并保存资产。
  2. 在 Unreal Editor 的 Localization 面板中打开项目本地化目标,确保资产收集范围包含 Content/WebUIX/Generated,然后运行 Gather。
  3. 在同一面板中编辑或导入目标语言的翻译,然后运行 Compile。
  4. 保存生成的本地化资源,并在项目打包设置中包含目标 culture。

运行时切换语言

在 WebUIX widget 上调用 Set Culture 可以切换 UE culture 并重新加载本地化文本。如果 culture 已经由外部系统切换,只需要刷新当前文档文本时使用 Refresh Localization。

Set Culture: zh-Hans
Set Culture: en
Refresh Localization

打包检查清单

  • 打包项目包含目标 culture,例如 en 或 zh-Hans。
  • 游戏可切换到的每个 culture 都包含对应的本地化资源(locres)。
  • HTML fallback 可作为兜底文本,但正式文本应来自本地化资源。

常见问题

问题处理方式
页面显示 fallback 文本。确认 key 已收集到项目本地化目标、翻译已编译,并且使用的 fallback 与收集时的源文本一致。
语言已切换但 UI 没刷新。在 WebUIX widget 上调用 Set Culture,或在外部切换 culture 后调用 Refresh Localization。
编辑器正常,打包后不生效。检查打包 culture,并确认项目本地化目标生成的 locres 已包含在包中。

事件桥

通过 HTML 事件属性调用 Blueprint UFUNCTION,按函数名查找 Widget 或 Bridge Target。

支持的事件

事件 触发时机
OnClick 元素被点击,或通过 Click / Accept Focused Element 激活
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 属性。事件按名称路由到目标对象。

控件导航

使用 nav-order 设置导航目标,使用 OnFocus / OnBlur 响应焦点变化。焦点、键盘与手柄操作、方向规则和页面切换见 控件导航。

视频事件可使用 onloadeddata、onplay、onpause、onbufferingchange、onended、onerror、ontimeupdate 进入现有 HTML→Blueprint 事件桥,或绑定 OnVideoEvent;时间事件最多每秒 4 次。Loaded 表示媒体打开完成,不保证首帧已经到达。

动画监听

<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)" />

圆盘菜单

radial-menu 是 WebUIX 原生动作圆盘组件。子项内容仍保留在 DOM 中,运行时负责精确扇区几何、命中测试、选中状态、分隔线和可选空心中心。

标记与模板

可以直接写 radial-item,也可以通过 for 生成子项。key 用于保持重复项稳定,value 是选中值,label 会传递给事件参数;radial-center 用于自定义中心内容。

<radial-menu
  value="{{ SelectedAction }}"
  size="42%"
  hollow="true"
  inner-size="24%"
  inner-gap="8dp"
  content-radius="72%"
  start-angle="-30"
  gap-width="2dp"
  border-mode="outer"
  hover-scale="1.06"
  hover-duration="120ms"
  OnChange="OnRadialChanged(value, index, key, label)">
  <radial-item
    for="(action, index) in Actions"
    key="{{ action.Id }}"
    value="{{ action.Id }}"
    label="{{ action.Label }}"
    OnHover="OnRadialHover(value, index, key, label)"
    OnUnhover="OnRadialUnhover(value, index, key, label)">
    <img src="{{ action.Icon }}" alt="" />
    <span>{{ action.Label }}</span>
  </radial-item>
  <radial-center>{{ SelectedAction }}</radial-center>
</radial-menu>

配置属性

属性说明
size外径。支持 dp 和百分比;百分比尺寸会跟随父级可用宽度并保持 1:1 比例。
hollow是否启用空心中心,默认 true。
inner-size / inner-gap控制中心直径以及中心与扇区之间的间距,中心尺寸支持固定值和百分比。
content-radius控制子项内容在半径方向的位置,支持比例值或百分比。
start-angle旋转第一个扇区,默认 -90 度。
gap-angle / gap-width配置扇区之间的角度缝隙或像素宽度缝隙。
separator-width / separator-color控制分隔线宽度和颜色,不改变扇区布局尺寸。
border-modeouter 绘制统一外圈;segments 为每个扇区绘制独立边框。
segment-border-width / segment-border-color控制 segments 边框模式使用的宽度和颜色。
hover-scale / hover-duration / hover-easing可选的内置 hover 缩放;CSS transition 和 radial-item:hover 可以覆盖视觉样式。

选择与悬停事件

在 radial-menu 上绑定 OnChange,在 radial-item 上绑定 OnHover/OnUnhover。名为 value、index、key、label 的蓝图参数会自动接收对应子项数据。

OnChange="OnRadialChanged(value, index, key, label)"
OnHover="OnRadialHover(value, index, key, label)"
OnUnhover="OnRadialUnhover(value, index, key, label)"

CSS 样式

原生几何继续负责扇区形状和命中测试;可使用普通选择器、类、transition、filter、颜色、图片和 transform 定制子项内容与交互状态。

radial-item {
  color: #d7e8fb;
  transition: transform 120ms ease-out, filter 120ms ease-out;
}
radial-item:hover {
  transform: scale(1.06);
  filter: brightness(1.12);
}
radial-item.selected { color: #67e8f9; }
radial-center { background-color: #07111b; }

性能说明

建议保持 radial-menu 挂载,只修改 value、show、class 或绑定子项数据。稳定的 key 可复用循环子项;仅选择或显隐变化时不要替换整个文档。

自定义 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 保留图标的原始配色,不受 CSS 文字颜色(color 属性)影响。

控件导航

WebUIX 的控件导航用于菜单、设置页、物品栏等界面。HTML 描述可导航元素及布局,UMG 管理页面焦点,Blueprint 处理输入动作与页面切换。导航包含顺序移动、二维方向移动、焦点样式和控件激活。

手柄与控制器输入

Project Settings 与自动检测

WebUIX 默认启用手柄输入系统和按设备自动切换输入模式。最近使用的键鼠、触控或手柄输入会更新活动设备。菜单应可见并持有键盘焦点,使用 UI Only 或 Game And UI 输入模式;页面焦点与导航规则见 控件导航。在 Project Settings → Game → WebUIX → Gamepad Input 中调整配置。

[/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

进入手柄模式不会自动显示虚拟光标。需要摇杆移动光标时,配置 Movement Stick,并将活动页面所属 PlayerController 的 Show Mouse Cursor 设为 true;此时确认点击光标位置。隐藏光标后,确认作用于当前焦点元素。Scroll Stick 可独立滚动焦点所在区域,不受光标显隐影响。UWebUIXGamepadCursorLibrary 提供设备覆盖、配置覆盖和光标外观接口。

全局按键监听事件

OnAnyKeyDown / OnAnyKeyUp 是 WebUIX User Widget、Widget 和 Element Extension 上的被动全局监听事件,键盘、鼠标与手柄输入都会触发,且不会消费输入。可用于按键提示与改键界面。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 属性

普通页面用数值 nav-order 声明导航目标。Tab / Next / Previous 按其顺序移动;方向键、D-Pad 与导航摇杆按二维布局选择目标。方向覆盖、分组和环绕设置见 控件导航。

<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

WebUIXNavigationStack 用于管理菜单、设置等多层页面。栈管理页面显示与激活,暂停页保留状态;项目管理输入模式与菜单按键。创建、Push / Pop 和返回游戏流程见 控件导航。

默认绑定

设置默认值用途
Confirm KeyGamepad_FaceButton_Bottom激活当前焦点或光标位置的控件;展开选择器中提交高亮项。
Cancel KeyGamepad_FaceButton_Right关闭选择器或可关闭的顶层 modal。
Directional Nav StickGamepad_Left2D二维焦点导航。
Nav Up / Down / Left / Right KeyGamepad_DPad_*对应方向的焦点导航。
Movement Stick / Scroll StickNone可选的虚拟光标移动 / 焦点区域滚动。
Navigate Next / Previous KeyNone可选的顺序导航按键;展开选择器时移动选项高亮。

取消操作不会自动返回项目的上一页面。需要返回菜单时,项目可先调用 Handle Back;未处理时再执行自己的页面返回流程。

运行时改键

WebUIX Get Gamepad Input Config
→ Set Members(修改需要的按键或摇杆字段)
→ WebUIX Set Gamepad Input Config Override

使用 Get 取得当前配置,再修改需要的字段。将玩家配置保存到 SaveGame 后,可在下次运行时重新应用。WebUIX Clear Gamepad Input Config Override 恢复项目默认配置。

渲染管线

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 变更。

增量更新

无变化写入

重复写入相同模型值不会唤醒帧调度器,也不会安排重新布局。

定向失效

局部文本、属性、class、style 和模板变化会尽量只失效最小子树,而不是重建整个文档。

保留式合成

当变化不需要布局时,transform 和 opacity 更新会复用保留的显示记录与合成层。

稳定循环子项

在 for 列表中使用稳定 key,使未变化节点、组件实例和圆盘子项可跨更新复用。

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(复用实例)。

隐藏或放入池中的视频节点可能继续播放与发声;页面关闭时显式 PauseVideo/StopVideo。移除节点或销毁 Widget 会关闭播放器并释放资源。

启动预热

UWebUIXStartupWarmupSubsystem 预加载文档及可预热资源,减少首次打开的准备开销;不保证零延迟,也不会提前打开视频或完成网络缓冲。

配置条件

  1. Widget Blueprint 父类必须是 UWebUIXUserWidget。
  2. 设置 bWarmupOnGameStart = true。
  3. 必须设置 DocumentAsset。

预热模式

模式 说明
DocumentCacheOnly 异步后台预加载文档和 Cooked 资源(推荐)
PrecreateHiddenWidget 创建 Widget、以 Collapsed 状态加入视口、调用 PrewarmDocument()。之后用 ShowPrewarmedWidget() 立即显示。

Cook 预处理

文档保存/Cook 可生成预解析数据与图片缓存,减少运行时重复读取和解析。外置文档、动态资源与媒体仍可能发生文件或网络 I/O。

预计算内容

数据 说明
ResolvedHtmlBundle 合并后的 HTML + 链接的 CSS
CookedDomNodes 预解析的 DOM 树
CookedStyleSheet 已解析的样式表
CookedImageResources 压缩后的图片字节(PNG/JPG)
ReferencedAssets 静态收集及显式添加的 UE 资产引用;动态来源需补充 AdditionalResourceUris 或可 Cook 的资产引用。

修改 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

Blueprint API

蓝图 API

每个条目都按实际 Blueprint 节点展示 C++ 名称、返回值、参数、用途和典型场景。点击“复制节点”可把可粘贴的 Blueprint 节点文本写入剪贴板。

重新加载文档

C++ReloadDocument 返回值void 参数None 用途按当前配置重新加载 HTML 文档。 场景切换文档资产、外置文件或标记后刷新界面。

预热文档

C++PrewarmDocument 返回值bool 参数None 用途提前加载并准备当前 WebUIX 文档。 场景菜单打开前预热,减少首次显示时的解析和布局成本。

设置语言

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

刷新本地化

C++RefreshLocalization 返回值void 参数None 用途使用当前语言重新加载 HTML 文档。 场景外部已改变 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}} 更新页面内容。

Video · 1.7

PlayVideo、PauseVideo、StopVideo、SeekVideo、SetVideoVolume、SetVideoMuted、SetVideoLooping、SetVideoMediaSource、GetVideoState 与 OnVideoEvent 的参数和异步行为见 Video / Media。

焦点与导航接口(Focus By ID、Navigate、Accept Focused Element、Handle Back)以及页面导航栈的用法见 控件导航。

参考速查

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

事件属性

OnClickOnDblClickOnInputOnChangeOnOpenOnClose OnFocusOnBlurOnKeyDownOnKeyUp OnDragstartOnDragOnDragendOnDragoverOnDragoutOnDragdrop OnAnimationStartOnAnimationUpdateOnAnimationEndOnAnimationCancel

CSS 属性速查

布局

displaypositiontoprightbottomleftwidthheightoverflowz-index

盒模型

marginpaddingborderborder-radiusbox-shadow

文字

font-familyfont-sizefont-weightcolortext-alignline-heightletter-spacingtext-overflowtext-shadow

效果

opacitytransformtransitionanimationfilter:blur()filter:drop-shadow()filter:brightness()filter:contrast()filter:saturate()backdrop-filter

音效

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

背景

background-colorbackground-imagebackground-sizelinear-gradientradial-gradient

Flexbox

flex-directionflex-wrapflexjustify-contentalign-itemsgap

模板

ifelse-ifelseforshowkey

输入与 IME

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

圆盘菜单与边框速查

radial-menuradial-itemradial-center OnChangeOnHoverOnUnhover border-top/right/bottom/leftborder-radius: x / y outline-offsetborder-image

完整语法、事件参数、尺寸行为和示例请参阅 CSS 边框与圆盘菜单章节。

Video / Media · 已知限制

项目设置

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

Setting默认说明
TargetFrameRate60渲染节奏上限,0 跟随 Slate 节奏;不会提升编辑器实际帧率。
bEnableExperimentalNativeImetrue尝试接入 UE 原生输入法,实际可用性依赖环境。
bPackageWebUIXInspectorInRuntimefalse将 Inspector 编译进运行时包,需重新编译/打包。
bAutoPrewarmDocumenttrue同步控件时准备文档,不代表视频启动预加载。
TextContrast0.16字形边缘权重。
TextGamma0.92字形边缘 gamma。
VideoPlayerOverrides{}按 Windows、Mac、Linux、Android、IOS 指定播放器;空值使用 UE 自动选择。
Components[]全局自定义组件类。
ExternalTextExportRoot项目配置 / Project configuration外部文本导出根目录;资源解析路径需按对应工作流设置。

表中为默认值;项目 ini、设置资产及 Widget 配置可能覆盖这些值。

已知限制

  • WebUIX 使用原生 HTML/CSS 渲染,不执行 JavaScript,也不加载任意网页或浏览器 API。
  • 支持原生 <video>、CSS 自定义属性和 var()。HTML/CSS 使用插件支持的语法子集;<audio>、<canvas> 和 <iframe> 不在支持范围。
  • 视频可使用本地 Movies 文件、UE MediaSource、HTTP/HTTPS MP4 直链及 HLS。图片、CSS、字体等资源仍使用对应的 UE 资产或本地文件工作流。
  • 视频建议使用 H.264 编码与 AAC 音频。可播放的容器、协议和编码取决于启用的 UE 媒体播放器;Electra 的在线 MP4 来源通常需要服务器正确返回 Range / HTTP 206。
  • 不支持视频网站页面解析、DRM、自定义鉴权请求头、字幕、DASH、全屏切换,以及启动预加载阶段的视频。
  • 编辑器预览可播放视频和声音。编辑器后台降帧可能导致卡顿或停帧,恢复正常帧率后可继续播放。隐藏但未移除的节点仍可播放和发声,隐藏页面时请调用 PauseVideo 或 StopVideo。
  • WebUIX 面向 UE 5.0–5.8,以及 Win64、macOS、Linux、Android 和 iOS。当前视频功能以 Windows 为主要使用平台;跨平台项目需确认目标平台的 UE 媒体播放器、编码与图形后端是否可用。
  • Linux 的 FFmpeg 后端是可选集成,需另行配置指定 SDK、运行时依赖及分发所需资料。
  • 原生 IME 通过 UE 输入法系统接入,实际可用性与输入行为取决于平台和 UE 环境。
  • 静态资源引用可被收集;动态模板或 Blueprint 来源需显式补充 Cook 引用。MediaSource 资产与底层视频文件需分别包含在包中;网络视频不会自动下载进发布包。