用途
该技能用于指导将 Godot 4.3+ 游戏发布到浏览器(HTML5/WebAssembly),重点覆盖 Web 导出与桌面导出的差异:渲染器、线程与服务器响应头、浏览器互操作、持久化、输入与音频规则。示例代码面向 Godot 4.3+,不使用已弃用 API。
主要能力
- Web 导出预设配置:说明 variant/thread_support、variant/extensions_support、vram_texture_compression 系列、html/canvas_resize_policy、html/focus_canvas_on_start、html/experimental_virtual_keyboard、html/head_include、html/custom_html_shell、progressive_web_app/enabled 等选项的默认值与适用场景;输出包含 .html、.js、.wasm、.pck 及 audio worklet 文件,需一起上传,页面默认文件名建议为 index.html。
- 线程与无线程模式:线程构建依赖 SharedArrayBuffer,要求服务器对每个文件发送
Cross-Origin-Opener-Policy: same-origin和Cross-Origin-Embedder-Policy: require-corp。默认无线程模式可在任意静态托管运行;WorkerThreadPool 无线程时任务内联执行;Thread.start() 在无线程构建中返回 OK 但函数不运行。建议默认无线程,仅在性能分析确需时启用,并用OS.has_feature("threads")做条件分支。 - 托管方案:itch.io 上传根目录含 index.html 的 ZIP,项目类型选 HTML,线程构建需勾选 SharedArrayBuffer 支持;GitHub Pages 等无自定义头静态托管应使用无线程构建,或启用 PWA 的
progressive_web_app/ensure_cross_origin_isolation_headers(默认 true)由 Service Worker 在首次加载后添加响应头;自有服务器/CDN 需发送 COOP/COEP、将 .wasm 作为 application/wasm 提供,并用 Brotli 或 gzip 预压缩 .wasm 和 .pck。PWA 更新后JavaScriptBridge.pwa_needs_update()变 true 并发出pwa_update_available信号,调用JavaScriptBridge.pwa_update()重载所有已打开标签页。 - 平台检测与 JavaScript 互操作:使用特性标签(web、web_android、web_ios、web_macos、web_windows、web_linuxbsd)而非 OS.get_name() 字符串判断;JavaScriptBridge 仅在 Web 生效,调用需以
OS.has_feature("web")保护;回调需保存为成员变量防止被回收;JavaScriptBridge.download_buffer建议在输入事件中触发;eval()不得传入来自玩家输入或网络数据的字符串。 - 音频注意事项:浏览器在用户交互前阻止音频,应设置“点击开始”界面;默认播放类型为 Sample,通过 Web Audio API 低延迟播放,但总线上的 AudioEffect(混响、滤波器、AudioEffectCapture、AudioEffectSpectrumAnalyzer)不生效;强制 Stream 可恢复效果但增加延迟和爆音风险。推荐音乐用 Ogg Vorbis、音效用短 WAV,MP3 也可用。
- 存档与持久化:
user://由 IndexedDB 支持,文件关闭时同步;ConfigFile、FileAccess、ResourceSaver 用法不变。隐私浏览、存储阻止设置、清除站点数据会清空 user://,应检查OS.is_userfs_persistent()并提示玩家。存储按源隔离,同一游戏换域名或新 itch.io 上传 URL 会从空存档开始,建议提供存档导出/导入。浏览器可能在磁盘压力下驱逐存储,账号与跨设备存档需后端支持。 - 输入、窗口与性能限制:全屏、鼠标捕获、指针锁定、剪贴板写入只能在输入事件处理器中调用;键盘焦点在点击画布外时丢失,应保持 html/focus_canvas_on_start 开启并提示点击聚焦;Ctrl+W、Ctrl+T、F11 等浏览器快捷键可能被浏览器处理,不应绑定核心操作;后台标签页会被节流或暂停,应在
NOTIFICATION_WM_WINDOW_FOCUS_OUT时暂停游戏;WebAssembly 内存有限,大关卡和未压缩纹理会先使低端和移动浏览器崩溃;.pck 和 .wasm 每兆字节都需在游玩前下载,应裁剪未使用资源并在服务器端压缩。 - 常见问题排查:空白页且控制台报 SharedArrayBuffer 未定义(无 COOP/COEP 的线程构建)、本地正常上传后失败(编辑器测试服务器发送了目标主机没有的响应头)、从磁盘打开 index.html 失败(file:// 阻止 WebAssembly,应通过 HTTP 提供)、画面比桌面平淡或偏暗(Compatibility 渲染器丢弃高级光照,应烘焙光照贴图)、第二次点击才有声音(自动播放策略)、存档下次访问消失(隐私窗口或新源)、HTTP 请求仅在浏览器失败(CORS 或混合内容,应修复服务器响应头并仅用 HTTPS/WSS)、request_fullscreen/鼠标捕获被忽略(未从输入事件调用)、C#/.NET 编辑器无法导出 Web(需改用 GDScript 或从标准编辑器导出纯 GDScript 项目)。
- 检查清单:项目按 Compatibility 渲染器设计并打光;无 C#,GDExtension 仅在启用 variant/extensions_support 且提供 Web 二进制时使用;除非必要且主机发送 COOP/COEP(或 PWA Service Worker 处理),否则关闭线程支持;面向手机浏览器时启用 vram_texture_compression/for_mobile;在真实主机上测试而非仅编辑器 Run in Browser;音频开始前有点击开始界面,标签页失焦时暂停;全屏、鼠标捕获和下载从输入事件触发;检查 OS.is_userfs_persistent() 并允许玩家导出重要存档;Web 上隐藏退出按钮并使用 OS.has_feature("web") 做平台判断;JavaScriptBridge 回调存入成员变量,eval() 不接收不可信字符串;.wasm 以 application/wasm 提供,服务器端压缩 .wasm 和 .pck;检查下载大小并从 Web 预设排除未使用资源。
使用方式
该技能以文档和代码示例形式提供,需在 Godot 项目导出至 Web 的过程中参考。CLI 导出命令为 godot --headless --export-release "Web" build/web/index.html。
适用场景与限制
适用于 Godot 4.3+ 项目的浏览器发布,尤其关注线程、托管、PWA、存档和浏览器限制的场景。C# 项目在 Godot 4 中无法导出 Web(.NET 编辑器拒绝导出,4.7.2 仍然如此),需移植为 GDScript 或停留在 Godot 3;Web 端仅支持 GDScript 和 GDExtension,不可用原始 TCP/UDP(因此无 ENet),无 OS.execute()、OS.create_process(),不能从游戏内关闭标签页。若 Web 是主要目标,应从项目初期按 Compatibility 渲染器设计,避免后期迁移需重新打光。