From e48825531576e14c11c187fcff1138d490e744db Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 30 Jul 2026 14:58:08 +0800 Subject: [PATCH] =?UTF-8?q?docs(enemy):=20Task=2015=20=E8=A1=A5=E4=B8=A4?= =?UTF-8?q?=E9=A1=B9=E2=80=94=E2=80=94UseAbility=20=E9=9D=99=E9=BB=98?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E4=B8=8E=E9=A2=91=E9=81=93=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E5=AE=9E=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 11 发现 EnemyBrainContext.UseAbility 对找不到的能力 id 静默返回 false: 入场演出资产漏配会被静默跳过且零报错,是第 6 条禁止的静默通过。 建图期已挡掉空 id,故运行期解析不到必是配置错误,改为 LogError(非抛异常, 因为这是每帧路径)。放 Task 15 因为那是第一次能观察到配齐/漏配两种表现的时点。 Task 12 实测:EVT_BossFightToggled 资产不存在,实际是 EVT_BossFightEnded 被当开关用(BGMController 与 BossHPBar 都绑它)。资产名与用途不符是既存问题, 本次只记录不改名。 --- .../plans/2026-07-30-boss-ai-single-track.md | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) 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` + 两个字段绑的都是它。资产名与用途不符是既存问题,本次不改名,只是别再去找那个不存在的资产。) 保存场景。