feat: isolate lobby during minigames

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ud18010
2026-07-29 15:26:54 +08:00
co-authored by Claude Opus 4.8
parent 31afce6882
commit 6a5e534d00
9 changed files with 1408 additions and 8 deletions
+20 -4
View File
@@ -614,7 +614,23 @@ Core 不引用 UnityEngine,不访问 UI,不访问 socket,不读写 Unity
4. 本地 smoke 进入小游戏。
5. 验证异常路径:CDN 缺文件、版本不存在、资源缺失、服务端断开、重复退出。
## 12. 异常处理与兜底
## 12. 大厅与小游戏阶段隔离
进入小游戏后,大厅必须暂停并隐藏,直到小游戏退出后再恢复。大厅与小游戏是互斥阶段,不允许大厅 UI、输入、场景单位渲染与小游戏同时处于可操作状态。
隔离由 `MiniGameStageIsolation` 负责,调用方在进入小游戏前调用 `SuspendLobbyForMiniGame()`,在 `MiniGameHost.OnGameExited` 中调用 `ResumeLobbyAfterMiniGame()``MiniGameHost` 只负责小游戏生命周期,不直接依赖大厅对象。
隔离范围包括:
- 大厅操作 UI 根节点:隐藏并在恢复时还原原始 active 状态。
- 大厅场景/单位/特效根节点:隐藏并停止渲染。
- 大厅输入脚本:禁用,避免小游戏期间响应大厅点击、摇杆或快捷键。
- 大厅 Tick/表现脚本:禁用,避免后台继续驱动大厅单位。
- 需要保持 active 的 CanvasGroup:关闭交互和射线阻挡。
进入失败也必须恢复大厅。下载失败、校验失败、DLL 加载失败或热更客户端 `OnEnter` 抛异常时,`MiniGameHost` 会触发 `OnGameExited`,调用方应统一在该回调中恢复大厅。
## 13. 异常处理与兜底
| 场景 | 处理策略 |
|---|---|
@@ -631,7 +647,7 @@ Core 不引用 UnityEngine,不访问 UI,不访问 socket,不读写 Unity
| 结算 Prefab 缺失或结构不符 | 宿主回退代码构建简易结算窗。 |
| 玩家重复退出/重复结算 | 宿主通过 `_running``_waitingForResultConfirm` 防重入。 |
## 13. 开发红线
## 14. 开发红线
1. 小游戏专属逻辑必须使用 C#,不要新增 Lua 小游戏逻辑。
2. 新资源加载必须异步,不要使用同步 `XResLoader.LoadRes` / `LoadResAB`
@@ -644,7 +660,7 @@ Core 不引用 UnityEngine,不访问 UI,不访问 socket,不读写 Unity
9. 发布旧版本时不要只覆盖部分平台,除非明确确认平台与服务端兼容。
10. 签名、MD5、框架版本校验失败时不要降级加载旧包。
## 14. 验收清单
## 15. 验收清单
新增小游戏合入前至少验证:
@@ -662,7 +678,7 @@ Core 不引用 UnityEngine,不访问 UI,不访问 socket,不读写 Unity
- 客户端能显示结算并退出回大厅。
- CDN 缺文件、入口类型错误、资源缺失等异常不会卡死。
## 15. 建议开发拆分
## 16. 建议开发拆分
第一阶段:最小闭环