Lesson 6 / 6

验证、调试与 Git Diff 审查

Unity 任务的完成定义不是“代码写完”,而是编译、测试、手动验证和 diff 都说明项目没被破坏。

建议时长 8–10 min重点:完成定义练习:审查 diff

Unity 的 Definition of Done

完成不是一个点,而是一条门禁

编译Console 无新增红错
测试能测则测
手动验证正常 + 异常
Diff 审查红黄绿灯
风险说明未验证要写明

Console 调试最小流程

新手不要先猜问题。每次验证失败先走固定顺序:

  1. 看第一条红错: 后面的错误可能只是连锁反应。
  2. 展开 stack trace: 找到第一个项目代码文件和行号。
  3. 区分错误类型: 编译错误、空引用、对象已销毁、Missing Script、资源加载失败。
  4. 回到对象和配置: 如果是 UI 引用问题,去 Hierarchy / Inspector / Prefab 看绑定。
  5. 记录验证证据: PR 写清复现步骤、Console 是否干净、还有哪些 warning 未确认。
错误常见根因优先检查
NullReferenceExceptionInspector 引用为空、对象还没初始化、链路没绑定。字段引用、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 TestOnDisable 会取消请求。
Scene / Prefab / UI 绑定Unity 手动验证或 Play Mode Test按钮确实绑定到 View。

Git Diff 红旗

Diff 红绿灯

绿色:通常可继续

  • 同模块 C# 小改
  • 有路径和验证
  • 沿用现有实现

黄色:先解释

  • *Context.cs
  • 新增 Inspector 字段
  • UI 加载 / 弹窗层级

红色:先停止

  • .unity / .prefab
  • Packages / 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.csGameTableView.csHall/AppMain/AppContext.csGame/GameContext.csAssets/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 风险。”