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:
@@ -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`
|
||||
两个字段绑的都是它。资产名与用途不符是既存问题,本次不改名,只是别再去找那个不存在的资产。)
|
||||
|
||||
保存场景。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user