diff --git a/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md b/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md index e7d894ac..827f8502 100644 --- a/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md +++ b/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md @@ -2423,6 +2423,36 @@ Inspector 检查新对象:`EnemyAiBrain._definitionId = ChaoFeng`、`_recipe` 覆盖的理由:旧预制体上带 `BossSkillExecutor` 与指向已删资产的 `_skills`, 不覆盖则 Task 20 删脚本后它会变成 missing script。这也与「敌人预制体由脚手架统一产出」的既有决策一致。 +- [ ] **Step 4.5: 修 `EnemyBrainContext.UseAbility` 的静默失败(Task 11 发现,此处正是它变可观测的时点)** + +`EnemyBrainContext.UseAbility(id)` 对**找不到的能力 id 静默返回 false**。后果: +`chaofeng_intro` 资产若漏配,`Intro` 态进入后什么都不做,`IsAbilityRunning` 恒假, +`introDone` 立刻成立——入场演出被静默跳过,零报错。它"向前失败"(战斗仍能打), +但正是第 6 条禁止的那种静默通过。 + +`AiStateFragments.Ability/AbilityOnce` 已在**建图期**挡掉空 id,所以运行期解析不到的 id +一定是配置错误,没有合法情形。改为显式报错: + +```csharp + public bool UseAbility(string abilityId) + { + var a = _enemy.Abilities?.Get(abilityId); + if (a == null) + { + Debug.LogError($"[EnemyBrainContext] '{_enemy.name}' 的 AI 图请求能力 " + + $"'{abilityId}',但该敌人身上没有这个能力组件。" + + "请检查能力组件是否挂载、其 EnemyAbilitySO 的 abilityId 是否一致。", _enemy); + return false; + } + return a.Execute(); + } +``` + +用 `LogError` 而非抛异常:这是每帧路径,抛异常会打断整个 `AiRuntime.Tick`; +`LogError` 足以让问题在 Console 里立刻可见,且不会让一个漏配的敌人拖垮整场。 +⚠️ 会影响所有走配方路径的小怪——放在本 Task 是因为此刻嘲风的能力资产刚建好, +是第一次能真正观察到"配齐 vs 漏配"两种表现的时点。改完跑全量回归确认无既有敌人踩中。 + - [ ] **Step 5: 放一个开战触发区** 场景里新建一个空物体 `BossFightTrigger_ChaoFeng`,加 `BoxCollider2D`(勾 `Is Trigger`)+ `BossFightTrigger`: @@ -2430,7 +2460,10 @@ Inspector 检查新对象:`EnemyAiBrain._definitionId = ChaoFeng`、`_recipe` - `_bossId` → `ChaoFeng` - `_playerLayers` → `Player` - `_onBossFightStarted` → `EVT_BossFightStarted` -- `_onBossFightToggled` → `EVT_BossFightToggled` +- `_onBossFightToggled` → **`EVT_BossFightEnded`**(⚠️ Task 12 实测:**不存在**名为 + `EVT_BossFightToggled` 的资产。那个 `BoolEventChannelSO` 实际叫 `EVT_BossFightEnded`, + 但被当作开关用——`BGMController._onBossFightToggled` 与 `BossHPBar._onBossFightToggled` + 两个字段绑的都是它。资产名与用途不符是既存问题,本次不改名,只是别再去找那个不存在的资产。) 保存场景。