Lesson 6 / 6
验证、调试与 Git Diff 审查
Unity 任务的完成定义不是“代码写完”,而是编译、测试、手动验证和 diff 都说明项目没被破坏。
Unity 的 Definition of Done
完成不是一个点,而是一条门禁
编译Console 无新增红错
测试能测则测
手动验证正常 + 异常
Diff 审查红黄绿灯
风险说明未验证要写明
- 代码可以编译,Unity Console 无新增红色错误。
- 自动测试通过:普通 C# 逻辑优先 Edit Mode Test;Runtime 行为用 Play Mode Test。
- 正常流程手动验证通过。
- 异常流程已验证:失败、超时、空数据、重复点击、关闭页面、第二次打开。
- 异步请求在页面关闭或 Scene 切换后不会继续改 UI。
- 没有意外 Scene / Prefab / Asset / Meta / Packages / ProjectSettings 修改。
- 没有意外修改 HappyMahjong 高风险文件:
AppContext.cs、GameContext.cs、GameUIView.cs、GameTableView.cs、Assets/Scripts/Base/StrangeIoC/、生成代码。 - 新增 Inspector 字段有配置说明。
- 未验证的平台和风险已明确写出。
Console 调试最小流程
新手不要先猜问题。每次验证失败先走固定顺序:
- 看第一条红错: 后面的错误可能只是连锁反应。
- 展开 stack trace: 找到第一个项目代码文件和行号。
- 区分错误类型: 编译错误、空引用、对象已销毁、Missing Script、资源加载失败。
- 回到对象和配置: 如果是 UI 引用问题,去 Hierarchy / Inspector / Prefab 看绑定。
- 记录验证证据: PR 写清复现步骤、Console 是否干净、还有哪些 warning 未确认。
| 错误 | 常见根因 | 优先检查 |
|---|---|---|
NullReferenceException | Inspector 引用为空、对象还没初始化、链路没绑定。 | 字段引用、Awake / Start 顺序、Mediator binding。 |
MissingReferenceException | 页面关闭后异步回调继续访问 UI。 | OnDisable / OnDestroy 是否取消事件和请求。 |
| Missing Script | 类名 / 文件名 / meta / Prefab 引用被破坏。 | 最近是否重命名脚本或改了 .meta / .prefab。 |
| 资源加载失败 | 路径、AssetBundle、UIUtil / PopUpManager 用法不一致。 | 项目相似实现,不要新造 Resources.Load 路径。 |
测试怎么选
| 要验证的东西 | 测试类型 | 例子 |
|---|---|---|
| 纯业务规则 | Edit Mode Test | 等级不能小于 0、空昵称显示 Unknown。 |
| Command / Model 状态规则 | Edit Mode Test | 请求期间按钮 disabled,失败后恢复。 |
| MonoBehaviour 生命周期 | Play Mode Test | OnDisable 会取消请求。 |
| Scene / Prefab / UI 绑定 | Unity 手动验证或 Play Mode Test | 按钮确实绑定到 View。 |
Git Diff 红旗
Diff 红绿灯
绿色:通常可继续
- 同模块 C# 小改
- 有路径和验证
- 沿用现有实现
黄色:先解释
*Context.cs- 新增 Inspector 字段
- UI 加载 / 弹窗层级
红色:先停止
.unity/.prefabPackages/ProjectSettings- StrangeIoC 框架源码
git status
git diff --stat
git diff
必须解释的变化: `.unity`、`.prefab`、`.asset`、`.controller`、`.anim`、`.mat`、`.meta`、`Packages/manifest.json`、`ProjectSettings/*`。
Why — 这些文件不是永远不能改,而是不能“顺手被 agent 改了还没人知道”。如果任务只是小体验改动,出现大量 Prefab 或 ProjectSettings diff,应该先停止。
HappyMahjong 额外红旗:
Assets/Scripts/Base/StrangeIoC/、Assets/Scripts/InGameScripts/InGameScripts/Game/View/GameUIView.cs、GameTableView.cs、Hall/AppMain/AppContext.cs、Game/GameContext.cs、Assets/Scripts/CodeGen/、Assets/Scripts/Generated/。这些不是绝对不能改,但 agent 改动前必须说明必要性。审查 agent diff 的提示词
请对当前 Git Diff 做对抗性审查。重点检查:
- Unity 生命周期错误
- 异步取消和对象销毁后访问
- 事件重复订阅
- Inspector 序列化兼容性
- Update 中高频性能问题
- Prefab、Scene、Meta、Packages、ProjectSettings 意外修改
- StrangeIoC Context binding 是否遗漏或越界
- 是否错误修改 Assets/Scripts/Base/StrangeIoC 框架源码
- 是否错误绕过 UIUtil / PopUpManager / 项目网络层
- 是否误改 GameUIView.cs、GameTableView.cs、AppContext.cs、生成代码
- 缺少 Edit Mode / Play Mode 测试
- 与 HappyMahjong 现有架构不一致
按 Blocker、High、Medium、Low 输出。
不要直接修改代码。
课堂收尾练习:60 秒判断 diff
Presenter: 用现场选定的功能构造一个假 diff,混入
.unity 或 StrangeIoC 框架源码,让学员 60 秒判断能不能继续。示例格式:
需求:{现场选定的功能}
Diff:
- {Module}/View/{Module}View.cs
- {Module}/View/{Module}Mediator.cs
- Assets/Scenes/AppMainScene.unity ← 不应出现
- Assets/Scripts/Base/StrangeIoC/... ← 不应出现
合格答案:不能继续。.unity 和 StrangeIoC 框架源码与小需求不匹配,要求 agent 回到目标模块最小改动。
Retrieval check
如果只修改 Command / Model,却看到大量 `.prefab` diff,应该怎么做?
Primary source
课后阅读 Unity 官方 Edit mode and Play mode tests。项目内优先读 Docs/04-ai-index/risky-files.md。课堂只需记住:普通 C# 逻辑尽量能在 Edit Mode 测,Unity Runtime 行为才上 Play Mode / 手动验证。
Ask the agent: “请根据当前 diff 生成 HappyMahjong 验证清单,每项包含前置条件、步骤、预期结果、需要观察的日志,并单独列出 StrangeIoC / UIUtil / PopUpManager / TSDK 风险。”