7.4 KiB
最小登录收尾:第二轮验收结果
更新:2026-09-21 21:40。C:/projects/ft/Client,Unity 2022.3.62f2c1,Unity CLI Loop 2.2.0。正式 API http://s101.local:18080/。范围以《当前阶段范围裁决-仅最小登录.md》为准。
结论
本轮补齐三个真实 Unity 登录退出时序场景,并通过快速 101→102→101 回归。测试发现的声音释放、地图初始化和旧阶段异步退出问题已按专项评审做最小修复;最终三轮运行时错误均为 0,实际 Hub Test=OK。已完成主会话限定代码自审,尚无覆盖本轮补丁的新独立复审。
可执行的本轮 Unity 收尾通过;整个阶段不标为全部验收完成。 真实渠道 SDK/真机、真实 HTTP 故障与断网恢复、完整存档隔离及必要玩法仍有未验收项。当前仍依赖 PlayFab 存档,没有迁移 KV 或删除 SDK。
证据矩阵
| 验收项 | 实际结果 | 证据(本目录) |
|---|---|---|
| 正常登录、非法 ID 更正重试、同号重登 | 前轮实际通过,本轮不重复开发 | UnityCliLoop最小登录验收-2026-09-21.md,uloop-final-reentry-run-03.log |
| 登录等待中退出 | 实际提交101,AuthorizedAtExit=false时进入QuitStage;旧身份/Cookie清空、令牌取消;旧输入事件触发后仍未授权,最终LoginStage,错误0 | acceptance-during-login-fixed-result.json、acceptance-during-login-fixed-errors.json |
| 失败弹窗旧重试按钮 | 退出后旧事件连续触发两次,无身份恢复/场景回流,错误0 | acceptance-old-retry-result.json、acceptance-old-retry-errors.json |
| 登录成功延迟中退出 | 捕获AuthorizedAtExit=true且SceneAtExit=LoginStage,立即QuitStage;最终LoginStage未授权,错误0 | acceptance-success-delay-result.json、acceptance-success-delay-errors.json、acceptance-success-delay-settled.json |
| 快速101→102→101 | 修复后同样快速时序三轮错误0,未靠延长初始化等待隐藏问题 | acceptance-progress-destroy-fixed-run.log;acceptance-progress-101/102-after.json、对应errors.json |
| Cookie及旧身份/Hub释放 | 两次退出旧身份清空、CookieJarReplaced=true/NewJarCount=0、SessionAdvanced=true、OldHubConnected=false | acceptance-progress-102-exit.json、acceptance-progress-101-exit.json |
| 实际SignalR | 最终101,Connected=true,实际IRTService.Publish的Test返回OK;不是业务推送或断网重连证据 | acceptance-final-hub.json |
| 核心进度抽查 | 101返回后抽查字段完全相同;102身份/进度不同;不等同完整存档隔离 | acceptance-progress-101-before.json、acceptance-progress-101-after.json、acceptance-progress-102-after.json |
| 首页入口 | 实际点击战令打开未解锁预览,社交页打开俱乐部页,无新的业务异常;未购买/领奖/入会 | acceptance-battlepass-、acceptance-social- |
| 最终状态 | FishingStage、101/InternalId2、Authorized=true,地址正确;原始Error日志0 | acceptance-final-state.json、acceptance-final-errors.json、acceptance-final-ui.json |
退出脚本走生产 QuitStage;不把停止 Play 或清缓存当注销。登录使用实际输入控件/EventSystem,竞态测试使用已观察按钮的公开 onClick,并非真实渠道 SDK 登录。首次成功延迟退出返回时处于 BoostrapScene,后续 settled 证据才确认最终 LoginStage。
核心字段抽查
| 账号 | 等级 | 金币 | 钻石 | 鱼竿ID | 战令状态 |
|---|---|---|---|---|---|
| 101(前后相同) | 62 | 36550472 | 0 | 20001 | 30701029,Active=false |
| 102 | 60 | 213645 | 100 | 20001 | 30701023,Active=true |
101 的过期/缺失活动路径本轮未复现此前 GetActivateItemId、FishingEvent not found、BattlePass 空引用。礼包有效性为 false;未操作奖励或验证所有道具/任务数据。正常游戏初始化可能执行已有同步回调,因此不能声称全过程网络只读。
发现与最小修复
实施前评审:《最小登录收尾-第二轮验收方案.md》《登录提前退出声音释放-修复方案与评审.md》。代码边界共四文件:
- SoundService.Release:声音未初始化即退出的空引用;补可空依赖、有效句柄和重复释放保护。
- FishingAct:旧地图初始化 await 返回后继续操作已失效场景;补捕获原登录生命周期及销毁检查,释放迟到资源。
- FishingBehaviorB:缺鱼竿清理空引用、已销毁对象的迟到手部/鱼饵/鱼竿资源;只补初始化退出保护。
- FishingStage:旧阶段各异步续体/进度回调保护;框架先卸载场景再启动 QuitAct,故 base.StartAsync 异常过滤同时检查旧对象已销毁或令牌已取消。存活且未取消的阶段错误仍抛出。
没有修改框架 DLL、正式地址、鱼概率/奖励、存档机制、俱乐部、KV 或工具包。前轮五文件修复和外围未提交改动保留。
验证与限制
- Unity 最新编译成功:0 错误、271 警告(acceptance-final-compile.json)。SoundExitTests 与 MapExitTests(8项)通过;后者只提取指定生产方法/片段,依赖使用替身,不代表完整玩法测试。
- 四文件 diff 检查通过;最终源码 SHA256:acceptance-round2-source-hashes.json。限定自审:《最小登录第二轮-限定代码审查.md》。旧独立 R1 审查不覆盖本轮补丁。
- 最终 Warning 总数236,完整消息保存在 acceptance-final-warnings-all.json;包括活动注册、红点和动画配置警告。未全部处理,不宣称零警告或所有玩法健康。最新成功轮没有观察到新增 FishingStage 取消 Warning;该异常过滤的确定分支覆盖来自定向测试。
- 所有失败证据保留:acceptance-before-map-guard、acceptance-before-stage-catch、acceptance-before-destroy-filter。修复后重进 Play 加载新代码,不清控制台冒充通过。
- 关闭战令预览时 ULoop 点击工具在按钮自行销毁后读取对象名称,产生工具 MissingReference;预览实际关闭。acceptance-social-errors.json 保存原堆栈,不算业务修复或隐去的原始错误。最终新 Play 轮 Error=0。
剩余验收及下一步
| 项目 | 当前缺口 | 下一步 |
|---|---|---|
| 真实渠道SDK/真机 | 用户明确安排最终再统一打包确认;本轮未测,不阻塞当前Editor验收 | 最终打包后验证渠道退出、换号与迟到SDK回调;当前不打包、不索要APK |
| HTTP401/超时恢复 | 本轮仅实际非法输入纠错;未注入真实传输故障 | 在可控且限定目标进程的环境注入,再验证失败状态和重试 |
| 真实断网自动重连/业务推送 | 当前非管理员,未执行系统断网;没有用主动Disconnect/Connect冒充自动恢复 | 安排仅影响C盘测试客户端的网络故障环境及对应推送 |
| 钓鱼玩法及完整存档隔离 | 已进场景/抽查核心字段;未抛竿、领取或全面比较存档 | 用户核对账号进度并补必要玩法验收;禁止用重置/覆盖存档制造测试 |
| 新独立代码review | 本轮完成主会话自审,尚无新独立复审 | 需要时将本报告、四文件diff与方案交给另一个审查任务 |
当前 Editor 保留 PlayMode、101/FishingStage(21:40取证),Hub正常,供人工复测。后续先补上述验收条件,发现新的范围内问题再专项评审并编码;不自动扩大到KV/俱乐部/SDK删除。没有Git提交、推送或发布,未操作D盘Unity。