docs(enemy): Task 15 补两项——UseAbility 静默失败与频道资产实名

Task 11 发现 EnemyBrainContext.UseAbility 对找不到的能力 id 静默返回 false:
入场演出资产漏配会被静默跳过且零报错,是第 6 条禁止的静默通过。
建图期已挡掉空 id,故运行期解析不到必是配置错误,改为 LogError(非抛异常,
因为这是每帧路径)。放 Task 15 因为那是第一次能观察到配齐/漏配两种表现的时点。

Task 12 实测:EVT_BossFightToggled 资产不存在,实际是 EVT_BossFightEnded
被当开关用(BGMController 与 BossHPBar 都绑它)。资产名与用途不符是既存问题,
本次只记录不改名。
This commit is contained in:
2026-07-30 14:58:08 +08:00
parent 990f90d383
commit e488255315
@@ -2423,6 +2423,36 @@ Inspector 检查新对象:`EnemyAiBrain._definitionId = ChaoFeng`、`_recipe`
覆盖的理由:旧预制体上带 `BossSkillExecutor` 与指向已删资产的 `_skills` 覆盖的理由:旧预制体上带 `BossSkillExecutor` 与指向已删资产的 `_skills`
不覆盖则 Task 20 删脚本后它会变成 missing script。这也与「敌人预制体由脚手架统一产出」的既有决策一致。 不覆盖则 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: 放一个开战触发区** - [ ] **Step 5: 放一个开战触发区**
场景里新建一个空物体 `BossFightTrigger_ChaoFeng`,加 `BoxCollider2D`(勾 `Is Trigger`+ `BossFightTrigger` 场景里新建一个空物体 `BossFightTrigger_ChaoFeng`,加 `BoxCollider2D`(勾 `Is Trigger`+ `BossFightTrigger`
@@ -2430,7 +2460,10 @@ Inspector 检查新对象:`EnemyAiBrain._definitionId = ChaoFeng`、`_recipe`
- `_bossId``ChaoFeng` - `_bossId``ChaoFeng`
- `_playerLayers``Player` - `_playerLayers``Player`
- `_onBossFightStarted``EVT_BossFightStarted` - `_onBossFightStarted``EVT_BossFightStarted`
- `_onBossFightToggled``EVT_BossFightToggled` - `_onBossFightToggled`**`EVT_BossFightEnded`**(⚠️ Task 12 实测:**不存在**名为
`EVT_BossFightToggled` 的资产。那个 `BoolEventChannelSO` 实际叫 `EVT_BossFightEnded`
但被当作开关用——`BGMController._onBossFightToggled``BossHPBar._onBossFightToggled`
两个字段绑的都是它。资产名与用途不符是既存问题,本次不改名,只是别再去找那个不存在的资产。)
保存场景。 保存场景。