docs(enemy): 按 Task 1+2 审查结论修订 spec 与计划

spec:ResourceFull 由「无组件时恒 false」改为显式抛,与 Boss facet、AnchorAt
统一为「依赖组件缺失一律抛,不返默认值」。
计划:Task 16 补上 BossBase 残余三处行为树残留的清理项(含运行时告警字符串);
Task 19 记录 Patterns/ 是零外部引用的独立程序集,可整目录删。
This commit is contained in:
2026-07-30 12:32:43 +08:00
parent 2a1ada4388
commit b0fd040904
2 changed files with 17 additions and 1 deletions
@@ -2441,6 +2441,12 @@ TestRoomA 加开战触发区。三件自检 0 error。
**这属于既有缺陷,若出现请单独记录,不要在本 Task 顺手改**
9. `LastUsedSkillId = null;` 两处(`EnterPhase``OnSpawn`)删掉——防重复记忆已归选招器
10. using 区里因此不再需要的 `using BaseGames.Boss;``using BaseGames.Parry;`
11. **清掉本文件残余的三处行为树残留**(Task 1+2 执行时发现并留待此处,因为本 Task 正好重写这片区域):
- 第 76 行附近的区段注释 `// ── 技能执行(BD Task 调用入口)` —— 随该区段一并删除
- `BeginPhaseTransition` 文档里的 `BD_BossPhaseTransition 检查 IsPhaseTransitioning 来等待过渡完成。`
—— 改为 `AI 图挂 When(x => !x.Boss.IsPhaseTransitioning) 边等待过渡完成。`
- `BeginPhaseTransition` 重入告警里的运行时字符串 `请检查行为树逻辑是否重复触发阶段切换。`
—— 改为 `请检查 AI 图是否重复触发阶段切换。`(这条是开发期真的会看到的日志,不能留)
- [ ] **Step 2: 编译检查**
@@ -2660,6 +2666,10 @@ rm -r Assets/_Game/Scripts/Enemies/Boss/Patterns
rm -f Assets/_Game/Scripts/Enemies/Boss/Patterns.meta
```
⚠️ `Patterns/` 是**独立程序集**`BaseGames.Enemies.Boss.Patterns.asmdef``autoReferenced: true`)。
已核实**零外部引用**(无任何 asmdef 的 `references` 含它),因此可随目录整包删除。
删除后无需改动任何其他 asmdef。
- [ ] **Step 3: 编译 + 全量回归**
回 Unity 刷新。MCP `unity_get_compilation_errors` 期望 0 errors 0 warnings`Run All` 期望全绿。
@@ -219,7 +219,7 @@ namespace BaseGames.AI
{
int CurrentPhase { get; }
bool IsPhaseTransitioning { get; }
bool ResourceFull { get; } // BossResource 满值;无资源组件时恒 false
bool ResourceFull { get; } // BossResource 满值;未挂该组件即抛(见下)
void BeginPhaseTransition(int targetPhase, float invincibleDuration);
// 竞技场锚点(§5.5)。归本 facet 而非黑板:见下方修订说明。
@@ -242,6 +242,12 @@ namespace BaseGames.AI
`EnemyBrainContext.Boss => _boss ?? throw new InvalidOperationException(...)`
按 CLAUDE.md 第 6 条:小怪图误用它必须崩,不能返回一个空对象把问题盖住。
> 修订(2026-07-30Task 1+2 代码审查):`ResourceFull` 初稿定为「无资源组件时恒 false」,
> **已改为未挂 `BossResource` 时显式抛**。原设计是同一条第 6 条禁止的下游兜底——
> 图上挂了 `When(x => x.Boss.ResourceFull)` 边、预制体却漏挂组件时,那条边会永远不成立且零报错。
> 与紧邻的 `Boss` facet、以及 §5.5 的 `AnchorAt` 保持同一失败语义:**Boss 专属 facet 的每个成员,
> 在其依赖组件缺失时一律显式抛,不返回默认值。**
`BossBase` 实现 `IBossControl``EnemyBrainContext` 在构造时 `_boss = enemy as BossBase`
### 5.2 `BossPhaseAbilityGate`