docs(enemy): 执行须知第 5 条——RequireComponent 指向抽象类型时 AddComponent 返回 null

HurtBox 标了 [RequireComponent(typeof(Collider2D))],Collider2D 是抽象类,
Unity 无法自动补齐,AddComponent<HurtBox>() 返回真 null。建测试对象须先挂
具体碰撞体。Task 6 实测证实;HurtBoxEditor.cs:97 早有同样注释,说明这个坑
项目里踩过但没写进规范。
This commit is contained in:
2026-07-30 14:04:42 +08:00
parent c577d6baa6
commit 5046125acb
@@ -63,6 +63,22 @@ Unity 只对**编译失败**的程序集给出完整诊断集。`ChargeAbility.c
**不要**用反射直写字段——前者跑的是真实的 `GetComponentInParent` 解析路径,后者是伪造结果。
只检查 `enabled` 标志本身(如阶段门的启停断言)则不需要 `Awake`
**5. ⚠️ `[RequireComponent]` 指向抽象类型时 `AddComponent` 返回 null。**Task 6 实测证实)
`HurtBox` 标了 `[RequireComponent(typeof(Collider2D))]`,而 `Collider2D` 是抽象类,
Unity 无法自动补齐 → `AddComponent<HurtBox>()` 返回**真正的 null**(不是 fake-null)。
建测试对象时必须先挂一个具体碰撞体:
```csharp
_host.AddComponent<BoxCollider2D>(); // 必须在 HurtBox 之前
var hb = _host.AddComponent<HurtBox>();
```
同样带该特性的还有 `HitBoxColliderProxy` / `PerceptionTriggerProxy` / `LethalTrap`
`HitBox` 本身**没有**);Task 12 新建的 `BossFightTrigger` 也标了它,
给它建测试或裸建物体时同理。
旁证:`HurtBoxEditor.cs:97` 早就为此写了「先加 Collider2D 以满足 HurtBox 的 RequireComponent」——
这个坑项目里踩过一次,只是没写进规范。
### 项目硬约束
1. **禁止下游兜底**CLAUDE.md 第 6 条):不要用 `?? 默认值` / `try-catch` / `if(null) return` 掩盖上游漏配。缺配置就 `Debug.LogError` 或抛异常。