Files
AIGame/Doc/WeChat_Export.md
T

87 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 微信小游戏导出、导入与首包 CDN
## 开发者工具入口
导出菜单为 `AIGame/WeChat/Export Base Package`,输出到 `AIClient/Build/WeChat/Base/`。
- `minigame/` 是开发者工具项目,包含 `game.js`、`game.json`。
- `webgl/` 是网站资源目录。打开它或父目录时若没有正确配置源码路径,会出现找不到 `game.json`。
- 导出后现在同时生成父目录 `project.config.json`,指定 `miniprogramRoot: "minigame/"`;因此可以打开 Base 或 minigame。
- 父目录入口沿用 SDK 编译配置及符号文件排除规则,保留已有 AppID;不改私有配置。
- `AIGame/WeChat/Open Exported MiniGame Folder` 定位正确的项目目录;旧包可以执行 `Repair Exported DevTools Project`。
## 启动资源下载 404
当前首包 CDN 为 `https://www.xworld.ren/game/Friends/webgl/`,与生产热更新目录位于同一个网站目录。
导出菜单会通过 Unity API 写入 MiniGameConfig 的 CDN,并由 SDK 写入 `minigame/game.js` 的 `DATA_CDN`。
修改现有包配置可用 `AIGame/WeChat/Refresh Exported Config (No Build)`,无需重新编译 Player。
**导出只生成本地文件,不会自动上传网站;重新生成底包不等于必须重新上传全部资源。** 首次部署或缺少文件时,将 `AIClient/Build/WeChat/Base/webgl/` 中需要的资源上传到网站 `/game/Friends/webgl/`,保持相对路径,不要额外嵌套一层 webgl。
| 本地相对 webgl 的路径 | 对外 URL 路径 |
| --- | --- |
| `<hash>.webgl.data.unityweb.bin.txt` | `/game/Friends/webgl/<hash>.webgl.data.unityweb.bin.txt` |
| `StreamingAssets/cdn/version.json` | `/game/Friends/webgl/StreamingAssets/cdn/version.json` |
| `StreamingAssets/yoo/...` | `/game/Friends/webgl/StreamingAssets/yoo/...` |
`base-package-report.txt` 会列出本次实际首包文件和完整下载地址。
2026-10-22 的包为 `1ddb5fcad4415dd3.webgl.data.unityweb.bin.txt`,10,084,442 字节;排查时对应生产 URL 返回 404,而现有 `/game/Friends/webgl/cdn/version.json` 返回 200。
SDK 根据 Unity data 文件内容计算哈希,并写入文件名和 `game.js` 的 `DATA_FILE_MD5`。重新构建后,如果哈希未变且现有 CDN 的完整 URL 可访问,直接复用,无需重复上传;哈希变化时才需要补充对应的新文件。未变的 YooAsset 业务资源包同样无需重复上传。场景或壳内资源/构建设置变化可能影响 Unity data,不能仅凭业务资源未修改就判断其哈希一定不变。
排查 404 时,先核对 `DATA_CDN` 与既有文件部署位置,再核对 `DATA_FILE_MD5` 对应的文件是否存在。404 本身不能证明资源内容发生了变化。修正路径或补齐缺失文件后,确认完整 URL 返回 200,再清理开发者工具缓存并编译。
Unity 首包的 `DATA_CDN` 与游戏进入 Boot 后使用的 YooAsset `version.json`/Art/DefaultPackage 是两阶段下载。当前 YooAsset 生产清单地址仍为 `/game/Friends/webgl/cdn/version.json`,资源根为 `/game/Friends/webgl/yoo/DefaultPackage`。
## 验证
`AIClient/AgentScripts/VerifyWeChatExport.cs` 通过 Unity Pipeline 刷新并验证现有包配置,检查父目录入口、AppID、SDK 排除规则、私有配置与 webgl 资源保留、重复刷新幂等性。
回执及修改前备份在 `Tools/output/wechat_export/`。本次本地验证通过,服务器首包文件尚需发布。
## YooAsset 默认构造函数被裁剪
2026-10-22 小游戏启动出现 `MissingMethodException: Default constructor not found for type YooAsset.WebNetworkFileSystem`。
YooAsset 3.0.6 的 `FileSystemParameters.CreateFileSystem` 使用 `Type.GetType` 和 `Activator.CreateInstance` 创建实例。
实际检查完整与 WebGL ManagedStripped 程序集,确认 WebNetwork/Builtin/Sandbox 三种文件系统在完整程序集中有默认构造函数,裁剪后类型仍存在、默认构造函数已移除。
`AIClient/Assets/AOT/link.xml` 仅保留项目使用的这三个文件系统的无参构造函数,不全量保留 YooAsset,也不降低全局裁剪级别。
该文件独立于 `Assets/HybridCLRGenerate/link.xml`,后续 HybridCLR Gen All 不会覆盖它。Unity 保留规则见[官方托管代码裁剪说明](https://docs.unity3d.com/cn/2022.3/Manual/ManagedCodeStripping.html)。
`AIClient/AgentScripts/VerifyYooAssetStripping.cs`:`Before` 记录裁剪前后构造函数;`BuildAndVerify` 执行正式 Export Base Package,检查新裁剪 DLL 中的构造函数及方法体、新生成的原生构造函数,并对比业务 bundle 与启动 data 的内容哈希。
回执目录为 `Tools/output/yooasset_stripping/`。底包构造函数修复需要新的 wasm 代码生效;未改动的业务资源包继续复用。
本次 20:06 正式导出与产物检查通过:三种文件系统无参构造函数及方法体均已保留,IL2CPP 已生成 WebNetworkFileSystem 构造函数;业务 bundle 内容哈希全部未变。启动 data 实测由 10,084,442 字节变为 10,084,535 字节,文件名变为 `c58ae17711192f12.webgl.data.unityweb.bin.txt`;需要将这个新增启动文件同步到现有 `/game/Friends/webgl/`,无需重传未变业务 bundle。未自动发布服务器,微信开发者工具运行尚待复测。
## 主界面移动端修复产物(2026-10-22 20:49)
启动不再自动加载 测试场景/CaoCao。主界面角色预览材质通过 Prefab 依赖进入 Art,顶部和底部布局使用设备/微信安全区,详见 `UI_AutoGen_Overview.md`。
三个屏幕布局与按钮命中、GPU 抠底、实际启动器无 3D 预加载检查通过;8 组微信窗口/胶囊/旧接口/DPR 用例通过。原 Boot 场景已恢复。
新底包已导出到 `AIClient/Build/WeChat/Base/minigame/`,构建成功并确认原生/JS 安全区桥接均包含。新首包为 `e33b1380f2e627d5.webgl.data.unityweb.bin.txt`(14,785,194 字节)。本次业务 UI 和热更代码有实际修改,需部署对应 Art/DefaultPackage 更新;相对上一构建仅 3 个 Art bundle、1 个热更 rawfile 及相应清单变化。
`Tools/output/home_mobile/deployment.json` 列出需发布文件、本地路径与目标 URL(排除构建报告和日志),资源文件先于总版本清单发布。该适配包含新的 AOT 组件,应搭配新底包。文件目前只在本地构建/暂存,未上传 CDN,微信开发者工具/真机需重新编译复测。
## 2026-10-22:小游戏网络与启动遮罩修复
- `WsClient` 原 WebGL 分支只有“不支持 ClientWebSocket”的占位。现在通过 `Assets/AOT/Scripts/Boot/WebSocketBridge.cs` 与 `Assets/Plugins/WebGL/GameWebSocket.jslib` 使用微信 `wx.connectSocket` / `SocketTask`;普通浏览器回退到 WebSocket。轮询收发在 Unity 主线程处理,包含连接超时、指数退避、手动重连和关闭清理。AOT 原生导入独立保留,避免热更 DLL 直接声明 P/Invoke。
- WebGL 的 `GameNet.Bind` 对本机或非 HTTPS/WSS 地址回退为 `https://game.xworld.ren` 和 `wss://game.xworld.ren/ws?pid={pid}&token={token}`,同时更新 BootContext,供业务 HTTP 使用。编辑器本机配置保留;自定义 HTTPS/WSS 远端地址保留。
- 截图中首次 `/login` 返回 401 后出现 `authed pid=...`,对应游客首次登录失败后自动注册成功,并非最终鉴权失败。ASTC 不支持后软件解压属于纹理兼容提示,与 WebSocket 占位错误不同。
- 原 Boot 固定两帧就隐藏遮罩,异步加载主界面时会暴露空白。现在等待热更通过 BootContext 通知主界面就绪;缺少 HUD 或超时保留可见错误提示,该信号不依赖登录或 WebSocket 成功。
- 验证:`node Tools/verify_game_websocket.js` 的 8 组实际 JS 桥接用例;`dotnet run --project Tools/Tests/WebSocket/WebSocket.csproj` 编译并执行实际 UNITY_WEBGL WsClient;Pipeline 的 `VerifyMiniGameNetwork.Endpoints` / `CheckUiReady` 与 `VerifyHomeMobileUi.CheckReady`。隔离场景验证完成后恢复原 Boot 场景。
- 新增 AOT / JS 桥接与上下文,必须搭配新底包和本次 DefaultPackage 热更,不能只刷新导出配置或只替换旧底包的热更 DLL。Art 未修改,无需重新构建或重复上传未变的 Art bundles。构建与发布清单见 `Tools/output/minigame_network/`;本地构建不自动上传 CDN。微信后台需配置 request 合法域名 `https://game.xworld.ren`、socket 合法域名 `wss://game.xworld.ren`。开发者工具和真机仍需运行复测。
本轮最终本地构建已成功(约 232 秒),底包目录 `AIClient/Build/WeChat/Base/minigame/`。首包数据 `06add2285b23eace.webgl.data.unityweb.bin.txt`(14,785,694 字节);DefaultPackage 清单 `0e3722bbb19457d47bac35bbd4b516a7`,热更文件 `d34a46086ecefa40084479f551820a4e.rawfile`(253,440 字节)。Art 仍为 `006c201e92439eb03ae12d84b86f8fa6`,未变。已验证 4 个平台桥接原生导入、IL2CPP 返回字符串释放、生成 framework 中的桥接、Raw DLL 内容和清单 MD5;原 Boot 场景恢复,编辑器停止且编译完成。`Tools/output/minigame_network/deployment.json` 给出逐文件来源/URL,先发布资源文件,再发布总版本清单;未上传远端,未做微信真机联调。
后续线上核对:新首包 `06add2285b23eace.webgl.data.unityweb.bin.txt` 已返回 200;但 `/cdn/version.json` 仍下发旧热更版本 `5d00808a861cf2d9d5696eaafea5b896`,新 DefaultPackage 清单返回 404,导致新壳继续运行旧 DLL。已将本次缺少的 4 个 DefaultPackage 文件和 `cdn/version.json` 按网站路径整理到 `Tools/output/minigame_network/upload_patch/`,共 254,085 字节。将目录内容上传到网站 `/game/Friends/webgl/`,先 `yoo/DefaultPackage`,最后 `cdn/version.json`;首包与 Art 无需重复上传。仅本地整理,未执行上传。
## 2026-10-22:玩法 API 404 与预览紫色区域
线上新热更已生效,WebSocket 和主界面加载正常;`https://game.xworld.ren/game/state` 仍返回 404,且响应为 Kestrel。本仓库的完整玩法服务为 AIServer,Windows Server 上传/启动方式见 `AIServer/deploy/windows/README.md`。本地已生成并验证 `Tools/output/server_release/AIServer-Windows-x64.zip`,不含开发数据库,不自动替换旧服务;全部游戏域名路由需切到同一新后端,旧后端数据需要单独迁移。
实际 Art 材质仍保存旧抠底色 (0.07,0.02,0.09),而热更代码改为紫色清屏,导致矩形显现;现已改为读取运行时材质 `_Key`。旧/新颜色的 GPU discard 与前景保留、隔离预览截图通过。客户端修复仅更新热更代码,无需底包/Art 重打:上传 `Tools/output/server_release/Client-CDN-Patch.zip` 解压内容到 `/game/Friends/webgl/`,先 `yoo/DefaultPackage`,最后 `cdn/version.json`。新 packVersion `587e28dfd1f166d117eadd24afa8efa1`,仍搭配既有支持 WebSocket 的新底包。两个 ZIP 均未上传线上。
## BuddyDefense 15888 部署地址(当前)
游戏服务已改为 `https://BuddyDefense.xworld.ren:15888` / `wss://BuddyDefense.xworld.ren:15888/ws?pid={pid}&token={token}`,CDN 资源路径维持既有部署。本轮 packVersion `d36750d301123c62fd6f673f324137a5`,发布文件 `Tools/output/server_release/Client-BuddyDefense-15888.zip`,仍先发布 yoo/DefaultPackage、最后发布 cdn/version.json。新常量会在编译时内联进热更 DLL,不增加运行时 AOT API 依赖;既有支持 WebSocket 的底包可直接更新热更,无需重打。
服务器包 `AIServer-BuddyDefense-15888.zip` 默认监听 `127.0.0.1:15888`。用户现有 Caddy 站点也监听 15888,需要加 `bind` 绑定服务器实际非环回网卡 IPv4,避免通配监听占用环回端口;`New-CaddySite.ps1` 在服务器运行可生成准确片段,保留 transport http 的 read_timeout/write_timeout 0。云服务器存在公网 NAT 时使用网卡私网地址绑定,域名 DNS 指向公网地址。更新已运行任务时先使用 Stop-Server.ps1,再安装新开机任务;更改 Caddy 后验证并 reload。需配置新域名的 DNS、证书及公网 TCP 15888 放行。当前本地验证正常,未部署远端。
客户端 ZIP 的网站发布辅助:将 `Publish-BuddyDefenseClient.ps1` 与 `Client-BuddyDefense-15888.zip` 放在同一目录,管理员 PowerShell 执行 `powershell.exe -ExecutionPolicy Bypass -File .\Publish-BuddyDefenseClient.ps1 -WebglRoot "网站中/game/Friends/webgl/对应的实际目录"`。也可先加 `-WhatIf` 检查。脚本校验清单 MD5,最后发布总版本;该目录属于静态资源站点,不是 AIServer 程序目录。发布后通过公网 `https://www.xworld.ren/game/Friends/webgl/cdn/version.json` 确认 packVersion 为 `d36750d301123c62fd6f673f324137a5`。新游戏域名的 DNS/TLS/15888 入口须先可访问。
### 2026-10-23 任务面板打开异常
TMP 会在多段文字下生成同名的 TMP_SubMeshUI 字体渲染子节点;PrototypeFlow.Panel 原先索引全部 Transform 时抛出重复键异常。现按组件排除内部渲染节点,保留业务节点绑定与重名校验。19 个业务面板(含任务、签到、背包、好友)预览场景验证通过。
本次仅发布 DefaultPackage 热更:packVersion `613942741fd3be253c86145d7451031c`,Art 保持 `006c201e92439eb03ae12d84b86f8fa6`。将最新 `Tools/output/server_release/Client-BuddyDefense-15888.zip` 放到服务器发布脚本旁,继续使用 `Publish-BuddyDefenseClient.ps1 -WebglRoot "C:\XWorld\CDN\Friends\webgl"`,脚本先写资源后更新 cdn/version.json。无需重打底包。未由 Agent 上传线上,发布后重新进入小游戏验证点击任务。