WebView

WebView 2.1.1 文档,覆盖桌面 CEF、移动端原生 WebView、启动字体缓存、跨平台键盘输入 SDK、本地网页目录选择器、自动打包、Unreal 桥接与配置说明。

v2.1.1 UE 5.0 - UE 5.8 Win64 / Mac / Linux / Android / iOSWindows H.264 / WebRTCDesktop CEF / Native Mobile WebViewWeb UI

文档介绍

Project Maintained Web UI

WebView for Unreal Engine

本文档说明 WebView 2.1.1 的插件能力、接入流程、Blueprint 使用方式、桥接模式和主要配置变量。

支持引擎UE 5.0 - 5.8
平台Win64 / Mac / Linux / Android / iOS
推荐图形接口推荐 D3D12,D3D11 为兼容回退
默认本地网页目录Plugins/WebView/Content/WebView/Web

适用场景

当前最适合以下类型的项目界面。

01HUD / 主界面 / 设置页

适合常驻或弹出的游戏 UI,把 HTML 页面作为可维护的菜单界面。

02任务面板 / 商店面板 / 活动页

适合快速迭代运营内容,用网页资源驱动活动、商店和任务页面。

03项目内本地网页 UI

适合打包本地页面,也支持远程页面在项目内统一呈现。

04与 Unreal 的双向通信页面

适合需要 UE 与网页双向通信的工具面板、交互页面和调试界面。

2.1.1 更新

WebView 2.1.1 重点改进本地页面启动稳定性、显式字体缓存和跨平台键盘输入准确性。

插件版本为 2.1.1,支持 UE 5.0 - 5.8。本版本保留 2.1.0 的 Windows CEF 媒体能力,并新增启动字体缓存和更准确的键盘输入 SDK。

Windows 媒体支持

  • 支持 H.264 视频播放,包括 H.264 编码的 MP4 文件。
  • 新增 WebRTC 支持,可用于网页中的实时通信场景。
  • 新版 Windows Runtime 通过下载器安装;旧 Runtime 不会自动获得 H.264 或 WebRTC 能力。

本地网页目录与自动打包

  • Local Web Root 现在是目录选择器,支持项目内相对路径和项目外绝对路径。
  • 选择目录后,插件自动维护 DirectoriesToAlwaysStageAsNonUFS,无需再手动填写 Packaging Settings。
  • Windows 编辑器对项目外目录使用 NTFS junction,切换目录时只更新文件系统链接,不复制网页文件;真正的复制发生在 UAT 打包阶段。
  • Packaged File Extensions 控制项目外目录在打包时允许复制的后缀;清空数组表示不过滤。

启动字体缓存

  • Preload Local Fonts On Startup 现在使用字体文件数组,支持在一个文件对话框中多选 woff/woff2/ttf/otf/eot 字体。
  • 所选字体必须位于当前 Local Web Root 下;目录外的文件会被拒绝并提示。
  • UE 启动时会在创建第一个 WebView 页面前读取配置字体到进程缓存,减少本地页面切换时的字体回退闪烁。

更准确的键盘输入 SDK

  • Windows 保留原生键盘消息所需的物理按键数据,可更准确地区分小键盘、扩展键以及左右修饰键;Mac/Linux 使用 UE 平台按键事件进行统一映射。
  • 网页侧可通过 WebView.setKeyboardBindingCaptureEnabled(true) 开启通用按键绑定捕获,并监听 WebView.on("NativeKeyDown", callback)。
  • 捕获数据包含 code、key、keyCode、location、修饰键状态和 repeat,便于网页实现可靠的按键绑定页面。
H.264 和 WebRTC 当前仅在 Windows CEF Runtime 提供。Mac、Linux、Android、iOS 的网页媒体能力仍以各自平台 CEF 或系统 WebView 能力为准。旧版本项目中的纯文本 LocalContentRoot 会在启动时自动迁移。

功能概览

插件定位是项目侧可维护的网页界面方案,而不是依赖引擎内置 WebBrowser 的黑盒包装。

  • 支持本地页面、远程页面和 JS 双向通信。
  • 支持在 UMG 中直接放置控件,不要求你先写自己的 Slate 包装。
  • 支持反射调用、委托调用、Unreal -> JS 调用。
  • 支持基础输入、拖拽测试、透明点击透传、IME 输入法链路。
  • 桌面端 Win64 / Mac / Linux 使用插件管理的 CEF / Chromium Runtime;Android / iOS 使用系统原生 WebView。
  • Windows CEF Runtime 从 2.1.0 开始支持 H.264 视频播放和 WebRTC。
  • 主插件包不再内置完整桌面 CEF Runtime;桌面端首次使用时由插件下载器准备对应平台 Runtime。
如果你需要网页侧桥接库,可以下载 WebSDK。压缩包内提供网页桥接脚本,适用于 TypeScript、JavaScript 模块和单 HTML 直接引入三种接法。
如果你想直接查看打包后的测试页面效果,可以打开 测试例子。

视频预览

下面这段视频展示了插件内 index.html 示例页面的真实运行效果,包括本地页面内容、交互区块与媒体播放表现。

插件内 Demo 页面实录

该视频对应插件内网页示例 Plugins/WebView/Content/WebView/Web/index.html 的实际展示内容,可用于快速判断界面风格、交互流畅度和视频播放效果。

PC:打开视频直链

IOS:打开视频直链

接入方式

通常只需要把插件放进项目;桌面端 CEF Runtime 会在首次进入编辑器或首次创建 WebView 时自动检查并下载,也可以通过工具栏手动准备。

  1. 将插件目录放到 Plugins/WebView。
  2. 桌面端 Win64 / Mac / Linux 使用插件管理的 CEF Runtime;Android / iOS 使用系统原生 WebView,不在移动端打包 CEF。
  3. 首次使用时让插件完成 Runtime 下载;也可以从 WebView 工具栏手动下载、重试或修复当前平台 Runtime。
  4. Windows 推荐使用 D3D12 获得更好的页面渲染性能与视频表现;D3D11 保留为兼容回退。Windows 的 H.264 和 WebRTC 使用 2.1.1 对应的 Runtime 包。
  5. Android 会先把随包网页文件抽取到应用可读目录,再交给系统 WebView 加载;如果真机出现黑屏,请先检查 logcat 中的 WebView、chromium、AndroidRuntime 和 LogWebViewUserWidget 相关日志。
在 Project Settings -> Game -> WebView 中选择 Local Web Root 和 Local Host Name。目录字段支持项目内或项目外文件夹;选择后插件会自动同步打包设置。默认目录是 Plugins/WebView/Content/WebView/Web,默认域名是 webview.local。

如何使用

你可以直接在 UMG 中使用包装控件,也可以继承底层用户控件做更细的扩展。

方式 A:直接拖入 UMG

在 UMG 中使用 UWebViewWidget。适合大多数项目快速接入。

方式 B:继承底层控件

继承 UWebViewUserWidget 以自定义事件处理、桥接回复和页面行为,也可以在内容浏览器中右键,进入“用户界面”菜单创建 WebViewUserWidget。

插件内已附带演示内容。你可以直接打开 Plugins/WebView/Content/WebView 下的资源,并进入 Demo 关卡查看交互示例、桥接示例、视频播放和拖拽吸附测试。
本地页面默认放在 Plugins/WebView/Content/WebView。例如设置地址为 /index.html 时,插件会映射到本地网页目录并通过 http://webview.local/index.html 访问。

拖动专用低延迟模式

为了避免普通 hover / 鼠标移动把网页动画帧率抬高到超出配置上限,插件当前把“额外加帧 + 催帧”限制为网页主动通知的拖动阶段专用优化。

  • 普通鼠标移动、hover、滚轮和点击,默认按正常浏览器节奏执行,不会仅因为移动鼠标就进入高帧率模式。
  • 只有网页明确告诉引擎“现在进入拖动阶段”时,插件才会启用低延迟 boost 和后续催帧。
  • 示例页面 index.html 已经在两个拖动区域内接好了这套逻辑,可直接作为接入参考。
// drag begin
window.WebView.send("SetDragLowLatency", {
  active: true,
  sources: ["free-drag"]
});

// drag end
window.WebView.send("SetDragLowLatency", {
  active: false,
  sources: []
});
建议只在真正持续拖动的交互里打开这个模式,例如背包拖拽、节点拖拽、时间轴拖拽或大型面板拖动,不要对普通 hover 或任意 mousemove 常开。

桥接方式

当前支持三种主要调用模式。

1. 反射调用

网页侧使用 WebView.call("Foo") 或 WebView.send("Bar"),Unreal 侧分别映射到 Call_Foo 与 Send_Bar。

2. 委托调用

如果你不想直接依赖反射函数名,可以在蓝图里监听 JS 事件 与 JS 函数调用 两个委托,然后手动回复结果。

3. Unreal 调 JS

使用 CallWeb、CallWebJSON 等入口从 Unreal 调网页,网页侧通过 WebView.on(...) 注册回调。

插件配置变量说明

这部分是插件级配置,主要影响本地网页目录映射和项目打包时的资源组织方式。

本地网页根目录Directory

对应 Project Settings -> Game -> WebView -> Local Web Root。默认值为 Plugins/WebView/Content/WebView/Web。这是目录选择器,支持项目内相对路径和项目外绝对路径。

本地域名String

对应 Project Settings -> Game -> WebView -> Local Host Name。默认值为 webview.local,用于把 /index.html 这类本地路径解析成可访问地址。

打包文件后缀String Array

对应 Project Settings -> Game -> WebView -> Packaged File Extensions。项目外目录在真正打包时只复制这些后缀的文件;后缀不带点号且不区分大小写。清空数组表示不过滤。

启动时预加载本地字体File Array

对应 Project Settings -> Game -> WebView -> Preload Local Fonts On Startup。点击 Select Multiple Font Files... 可在一个文件窗口中一次选择多个字体文件,数组项仍可单独删除或编辑。每个文件必须位于当前 Local Web Root 下,目录外的选择会被拒绝并提示,数组为空时不预加载。桌面 CEF 会在创建首个 WebView 页面前预读这些 woff/woff2/ttf/otf/eot 文件,减少页面切换时的回退字体闪烁。Android / iOS 使用系统 WebView,其字体缓存行为由平台决定。

选择目录后,插件会自动把项目内目录或 Content/WebView/ExternalWebRoot 加入 DirectoriesToAlwaysStageAsNonUFS。Windows 编辑器使用 junction 指向项目外目录,切换目录不会复制文件,实际打包时才会按后缀过滤并复制。桌面 CEF 的 scheme handler 还会缓存小型本地资源,并按文件大小和修改时间校验缓存是否仍然有效,大型媒体文件仍按请求读取,缓存只存在于当前进程,不会跨 UE 进程持久化。
如果你从旧版本升级,旧的纯文本 LocalContentRoot 会在启动时自动迁移到新的目录字段。通常不需要手动修改 ini,也不要同时保留插件自动条目和同一目录的重复手工条目。

蓝图 API

Blueprint API

蓝图 API

以下节点覆盖 WebView User Widget 的页面控制、输入穿透、帧率设置和 JavaScript Bridge。节点预览按 Unreal Blueprint 风格渲染,便于对照蓝图实现。

设置 URL

C++SetUrl 返回值void 参数URL 用途设置 WebView 页面地址,并让现有浏览器直接导航。 场景运行时对当前 WebView 实例调用 Set URL,即可切换本地 /index.html、远程 HTTPS 页面或普通域名;2.0.1 起无需调用 Restart Browser。

重启浏览器

C++RestartBrowser 返回值void 参数None 用途关闭并重新创建当前浏览器实例。 场景在需要重建浏览器实例时使用,例如修改仅在浏览器创建时生效的配置。切换页面直接调用 Set URL 即可。

打开 DevTools

C++OpenDevTools 返回值void 参数None 用途打开 Chromium DevTools。 场景调试 HTML、CSS、JavaScript、网络请求和控制台错误。

设置最大帧率

C++SetMaxFPS 返回值void 参数Max FPS 用途调整浏览器离屏渲染最大帧率。 场景按 UI 动画、视频和项目性能预算控制渲染开销。

获取当前 FPS

C++GetFPS 返回值int32 参数None 用途返回最近一秒测得的 WebView 刷新帧率。 场景确认页面是否正在渲染、是否达到预期帧率。

允许游戏同时接收键盘输入

C++bAllowGameInputWhileFocused 返回值void 参数Allow Game Input While WebView Focused 用途WebView 获得焦点时仍让 Unreal 侧收到键盘快捷键。 场景HTML 菜单获得焦点后,仍可用 Shift / Escape 关闭菜单。

调用网页方法

C++CallWeb 返回值void 参数Method 用途调用网页侧注册的方法,不传参数。 场景UE 主动通知 HTML 执行显示、隐藏、刷新等动作。

调用网页方法 String

C++CallWebString 返回值void 参数Method, Value 用途调用网页侧方法并传入字符串。 场景向 HTML 传递语言、玩家名、状态文本或简单参数。

调用网页方法 JSON

C++CallWebJSON 返回值void 参数Method, JsonObjectWrapper 用途调用网页侧方法并传入结构化 JSON。 场景传递背包、商店、任务列表、设置页等复杂数据。

JS 事件

C++OnJSEvent 返回值Event 参数Method, Data 用途网页调用 WebView.send(name, data) 时触发。 场景HTML 按钮通知 UE 执行不需要返回值的逻辑。

JS 函数调用

C++OnJSFunction 返回值Event 参数Method, Data, Request Id 用途网页调用可等待回复的函数时触发。 场景HTML 请求 UE 查询数据,稍后用 Request Id 回复。

回复 JS 函数 JSON

C++ReplyJSFunctionJSON 返回值bool 参数Request Id, Data 用途向网页侧函数调用返回 JSON 数据。 场景处理 JS Function Call 后,把 UE 查询结果返回给 HTML。

变量配置说明

变量配置说明

这些配置控制页面加载、窗口行为、渲染分辨率、帧率和输入透传。常规项目只需要设置 URL;菜单覆盖层和高频动画页面再按场景调整输入与渲染选项。

01页面加载

URLText/index.html

网页地址。支持 http(s) 远程地址、普通域名,以及 /index.html 这类本地路径。本地路径会根据 Project Settings 中的本地域名和网页根目录解析。

建议: 运行时对当前 WebView 实例调用 Set URL 即可切换页面,无需调用 Restart Browser。设置相同 URL 不会强制刷新页面。
Open DevTools on StartupBoolfalse

创建浏览器后自动打开开发者工具。只建议在编辑器调试网页时启用。

建议: 排查 CSS、JavaScript、网络请求或 Bridge 消息时开启,发布内容中保持关闭。

02窗口行为

Open New Window Links in Current ViewBooltrue

把 target=_blank 和 window.open 链接直接放到当前 WebView 里打开,而不是创建新的浏览器弹窗。

建议: 菜单、活动页、商店页通常建议开启,避免网页弹出额外窗口。
Allow Web PopupsBoolfalse

允许网页创建独立弹窗。只有当你的页面确实依赖独立 popup 时才需要。

建议: 大多数游戏 UI 保持关闭;需要 OAuth、支付或外部弹窗流程时再评估。

03渲染与性能

Sync FramesBoolfalse

开启后由控件主动驱动浏览器同步刷新;关闭后浏览器按自身节奏刷新,通常更适合动画、视频和半透明效果。

建议: 普通网页保持默认关闭;需要严格跟随 UE 帧节奏时再开启。
Resolution ModeEnumAuto

控制浏览器实际渲染分辨率。Auto 跟随控件尺寸;Manual 使用固定宽高。

建议: 响应式 UMG 使用 Auto;需要固定网页画布或稳定性能预算时使用 Manual。
Manual Render Width / HeightInt1920 x 1080

Manual 模式下的固定渲染尺寸。数值越高越清晰,也会增加浏览器渲染和纹理拷贝成本。

建议: 高分辨率 UI 可以从 1280x720 或 1920x1080 开始测试,再根据清晰度和性能调整。
Max FPSInt120

离屏浏览器渲染最大帧率上限。复杂网页不建议盲目拉高。

建议: 静态菜单可降低;视频、拖拽或连续动画页面可以按实际体验提高。

04输入透传

Allow Game Input While WebView FocusedBoolfalse

WebView 获得焦点后,键盘事件仍发送给浏览器,同时对 Slate 返回 Unhandled,让 Unreal 也能收到 Shift、Escape 等热键。

建议: 适合游戏内菜单覆盖层,让 HTML UI 保持焦点,同时游戏仍可响应关闭菜单等快捷键。
Transparent Click PassthroughDeprecatedfalse

旧版基于透明像素/颜色采样的点击透传。该方案已标记废弃,后续版本会移除。

建议: 新项目不要再依赖它;请优先使用网页 CSS 的 pointer-events。
Passthrough Target Color / ToleranceDeprecatedrgba(0,0,0,0) / 8

旧版透明点击透传的目标颜色和容差。默认以完全透明作为判断标准。

建议: 仅用于兼容旧项目;新页面使用 pointer-events: none 和 pointer-events: auto 控制命中区域。
推荐做法:让不需要接收鼠标的网页区域使用 CSS pointer-events: none;,并在按钮、输入框、面板等需要交互的元素上恢复 pointer-events: auto;。pointer-events 的默认值就是 auto。

05JS Bridge 委托

JS EventDelegate

网页侧调用 WebView.send(...) 时触发,参数包含方法名和 JsonObjectWrapper 数据。

建议: 适合打开面板、播放音效、请求关闭 UI 这类不需要返回值的事件。
JS Function CallDelegate

网页侧调用 WebView.call(...) 时触发,除了方法名和数据外,还会提供 RequestId 用于回传结果。

建议: 适合查询玩家信息、读取设置、请求服务端数据等需要 Promise 返回值的流程。

第三方声明

以下为当前插件内直接使用或随插件分发的第三方内容说明。

  • CEF / Chromium Runtime
    来源:cef_binary_146.0.12+g6214c8e+chromium-146.0.7680.179
    桌面 CEF Runtime 不再作为主插件包的一部分分发,而是通过插件下载器 / 安装器准备。安装后的 Runtime 保留 LICENSE.txt 与 CREDITS.html,用于第三方说明。
  • MDN flower video sample
    文件:Plugins/WebView/Content/WebView/Web/media/flower.mp4 与 flower.webm
    来源:MDN interactive examples 示例媒体
    授权:CC0 示例资源,用于演示本地视频播放能力。

已知限制

这些限制建议在文档和商店页面里直接说明。

  • 桌面端支持 Win64 / Mac / Linux,移动端支持 Android / iOS;移动端使用系统原生 WebView,能力边界由平台实现决定。
  • D3D11 是 Win64 兼容回退路径,复杂页面和高分辨率场景下性能不如 D3D12。
  • H.264 视频播放和 WebRTC 当前仅在 Windows CEF Runtime 提供。其他平台的媒体格式和实时通信能力以系统或平台 CEF 支持为准。
  • 项目外网页目录在打包时会按 Packaged File Extensions 过滤;需要发布其他文件类型时请显式加入后缀,或清空过滤数组。
  • 视频网站兼容性不应默认承诺,尤其是依赖专有编解码器的站点。