Land Explorer in HomeCamp with boot loading, journal UI, and CDN publish tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
udx
2026-11-04 16:18:01 +08:00
co-authored by Cursor
parent 9eec364f30
commit 80678ec499
405 changed files with 48053 additions and 420302 deletions
+53 -1
View File
@@ -84,4 +84,56 @@ YooAsset 3.0.6 的 `FileSystemParameters.CreateFileSystem` 使用 `Type.GetType`
客户端 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 上传线上,发布后重新进入小游戏验证点击任务。
本次仅发布 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 上传线上,发布后重新进入小游戏验证点击任务。
## SSH 一键发布 CDN(2026-11-04)
已接通服务器 `Administrator@159.75.128.109:22`,网站目录 `C:\XWorld\CDN\Friends\webgl`。当前发布使用 `Tools/publish_cdn.py` 与服务器端执行的 `Tools/Publish-CdnRelease.ps1`;旧 `Tools/cdn_publish.py upload` 使用旧通道布局,不用于当前网站发布。
Unity 菜单位于 **AIGame/CDN**:
- `Check SSH Connection`:检查免密连接与目标目录。
- `Preview Upload Changes`:只读比较服务器与本地暂存文件,记录需上传的差异。
- `Upload Staged Resources`:发布已构建的资源。
- `Build And Upload (Art + HotUpdate)`:依次检查连接、构建当前 WebGL Art/热更新包并发布,不构建 Player。要求编辑器为 WebGL 目标且不在 Play Mode。
- `Prepare SSH Key`:首次生成专用密钥及服务器公钥安装脚本。
- `Open Publish Folder`:查看预览、日志、ZIP 与发布回执。
本机配置位于 `Tools/cdn_publish.local.json`,示例为 `Tools/cdn_publish.example.json`。专用密钥位于 `Tools/.cdn-deploy/`,两个本机路径均已加入 Git 忽略规则。Windows 私钥 ACL 限制为创建者与 SYSTEM;服务器 Administrator 默认公钥文件为 `C:\ProgramData\ssh\administrators_authorized_keys`。SSH 使用 BatchMode 与严格主机密钥检查,不处理账号密码;公钥安装脚本仅包含公钥。更换网络出口时需更新云防火墙来源白名单。公钥配置依据:https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement 。
命令行(仓库根目录):
```powershell
python Tools/publish_cdn.py check
python Tools/publish_cdn.py plan --compare
python Tools/publish_cdn.py upload
python Tools/publish_cdn.py upload --startup-export AIClient/Build/WeChat/Base
python Tools/publish_cdn.py rollback --release <发布回执中的32位releaseId>
```
发布从 `Tools/cdn_root/wechat/version.prod.json` 读取包版本;验证清单 MD5、YooAsset CRC、版本标记并计算每个文件 SHA256。服务器比较后仅传输差异 ZIP,验证包含未变服务器文件的完整发布集合,防止遗漏文件。服务器先写资源,最后原子替换 `cdn/version.json`;发布时检查原版本未被其他发布者更改。保留旧资源与服务器私有目录中的上一版版本清单,回滚拒绝覆盖后续不同版本。服务器发布后从公网重新读取总版本与包清单进行校验;如果公网检查失败,会明确报告“服务器已发布”,不自动重复提交。
`--startup-export` 是新底包构建后的可选步骤:从该导出目录的 `minigame/game.js` 精确选择当前启动 data,校验 DATA_CDN、DATA_FILE_SIZE 和 SDK 使用的 MD5 中间 16 位命名,仅将对应的 `.webgl.data.unityweb.bin.txt` 加入同一发布事务。服务器路径白名单不允许任意根目录文件;公网额外验证启动 data 的完整 SHA256。原底包和旧哈希资源保留,回滚只切换远端热更版本,不会切换本地微信底包。Unity 常规资源发布菜单仍不自动构建 Player 或附带首包。
本轮实际发布:`releaseId=05a167475cd6402291421c746379c7c4`;DefaultPackage `d0116d388c58c3c73593c02037d0e3ad`,Art `0fd7811b1c0988f4b728dadb59041f38`。306 个本地文件共 69.48 MiB,实际差异 27 个文件/12.70 MiB,包括 HomeCamp +0.30 EV 曝光与首页接入。服务器完整性验证及公网两份清单 MD5 通过。回执:`Tools/output/cdn_publish/release-05a167475cd6402291421c746379c7c4.json`。11 项本地发布事务测试通过,覆盖损坏/缺失上传、过期版本、路径穿越、无变更、旧资源保留与回滚。
此流程发布 Art 和热更新资源;如变更 AOT/JS 桥接或底包配置,仍需按微信导出流程生成并部署相应底包及启动数据。
### HomeCamp 热更新兼容旧底包(2026-11-04)
微信开发者工具实际 Boot 日志已读取新版 `d0116d388c58c3c73593c02037d0e3ad`,但首页仍显示旧插画,原因是 `MissingMethodException: MethodNotFind YooAsset.SceneHandle::add_Completed`。10 月 22 日导出的 WebGL 底包裁剪了 `SceneHandle.Completed` 和 `UnloadSceneAsync`,因此不是 CDN 未上传或客户端未读取新版本。
`MainHudView.cs` 中的 HomeCampPresenter 改为在常驻 UiManager 上以协程轮询旧底包保留的句柄状态,卸载改用 Unity SceneManager(YooAsset 通过 sceneUnloaded 回收句柄)。下载期间隐藏或销毁首页仍能完成清理。无需重打底包。
`AIClient/AgentScripts/InspectHomeCampAot.cs` 通过 Pipeline 检查旧 ManagedStripped 与实际生成的热更 DLL,确认 SceneHandle/HandleBase 引用均存在;回执 `Tools/output/homecamp_aot_compatibility/aot_check.json`。兼容修复仅上传 5 个差异文件/0.25 MiB,Art 不变;新 DefaultPackage `5b9d783853bd29484ecf828fbf33af47`,发布回执 `Tools/output/cdn_publish/release-4fdfb222706a47879f1511dd532630cf.json`,服务器及公网清单验证通过。
微信开发者工具使用现有底包普通重新编译后,Boot 确认加载上述新版本;首次下载完成后显示降低曝光后的 3D HomeCamp,商店打开后返回营地正常,本轮无红色异常。开发者工具仍有 ASTC 软件解压和加载帧耗时提示;未进行微信真机性能验收。
### 启动画面整理(2026-11-04,待构建新底包)
用户截图的第一段深棕底花屏对应 Unity Splash Logo:项目开启 show/showUnityLogo,底色为 `#231F20`,当前许可支持关闭。第二段来自旧 `BootPatchView.Create()` 运行时拼装的黑底 AIGame/方形进度条;LegacyRuntime 字体无法正常显示所用中文。这两段属于启动壳,不是远端 HomeCamp 资源。
本地已通过 Pipeline 关闭 Splash,并将启动界面改为 `Doc/UIPrefabCreater/UI_BootLoading.json` → `Assets/AOT/UI/UI_BootLoading.prefab`。它在初始化 YooAsset 前就要显示,因此随 Boot 场景直接引用并放在 AOT 目录,不进入业务 Art 加载链路。复用已有营地插画与 Common 九宫格,使用独立静态中文子集 `Assets/AOT/UI/BootChinese.asset`,保留插画比例并裁切铺满。状态仅展示易懂的加载提示;版本哈希留在日志,进度单调平滑增长,营地准备好后才到 100% 并淡出。
`GameplayBootstrap` 将 MainUiReady 推迟到 HomeCamp 结束加载后,避免先展示旧插画 HUD 再切换 3D。`AIGame/Boot/Build Loading Screen` 可重建字体/Prefab/Boot 引用;导出基础包会检查配置,Setup Boot Scene 也保留启动 Prefab 引用。JsonUIPrefabBuilder 的 TMP 组件新增可选 `fontAsset` 明确路径,既有 JSON 默认字体行为不变。
验证入口 `AIClient/AgentScripts/VerifyStartupPresentation.cs`;1080×1920 与 1080×2338 两组实际 Prefab 预览通过中文字符覆盖、文本溢出、铺满且不拉伸、进度不回退与完成淡出检查,原场景和 Game View 已恢复。截图及回执位于 `Tools/output/startup_presentation/`。本轮尚未构建 Player、替换小游戏底包或发布 CDN;需经明确授权后构建新底包、同步新的启动 data 并在微信端复测,旧壳不能仅靠热更替换启动画面。