From d013fe8e2e1526456fd7977fe4a83b030e130187 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 29 Jul 2026 12:41:09 +0800 Subject: [PATCH] =?UTF-8?q?docs(enemy):=20=E5=86=99=E6=98=8E=20RushExit.Co?= =?UTF-8?q?mmitted=20=E9=98=B2=E6=8A=96=E5=8A=A8=E7=9A=84=E5=89=8D?= =?UTF-8?q?=E6=8F=90=E6=98=AF=E8=83=BD=E5=8A=9B=20cooldown=20>=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 质量审查发现:Committed 的冷却门若遇上 cooldown==0 的能力, CanUseAbility 结束下一帧即恢复,Rush↔Rest 每帧抖动照旧出现。 这属能力侧配置错误,不在模块内兜底,纳入 AiDefinitionValidator 校验项。 Co-Authored-By: Claude Opus 5 (1M context) --- .../2026-07-29-enemy-ai-composable-modules-design.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Docs_Dev/superpowers/specs/2026-07-29-enemy-ai-composable-modules-design.md b/Docs_Dev/superpowers/specs/2026-07-29-enemy-ai-composable-modules-design.md index 9973b308..fda43b14 100644 --- a/Docs_Dev/superpowers/specs/2026-07-29-enemy-ai-composable-modules-design.md +++ b/Docs_Dev/superpowers/specs/2026-07-29-enemy-ai-composable-modules-design.md @@ -194,6 +194,12 @@ public enum RushExit 一个枚举值同时决定「脱战边怎么写」和「进入条件带不带冷却门」,因为这两件事本就是同一语义的两面。 **两个耦合 flag → 一个语义枚举**,是消除开关面板的实证。 +> **`Committed` 的防抖动保证有一个前提**:所引用的冲锋能力自身 `cooldown > 0`。 +> `EnemyAbilityBase.CanUse` 是 `!_isRunning && !IsOnCooldown`,若 `EnemyAbilitySO.cooldown == 0`, +> 能力结束的下一帧 `CanUseAbility` 就恢复为真,抖动照旧出现。这属于**能力侧的配置错误**, +> 不在本模块内兜底(第 6 条),由 `AiDefinitionValidator` 显式报出(见 §6)。 +> 旧的 `PatrolBetweenChases` 路径有同样的弱点,本次不改变该前提,只是把它写明并纳入校验。 + ```csharp public sealed class RushEngagement : IEngagementModule { @@ -415,7 +421,7 @@ E003(战斗区激活才掉落)、E004(战斗触发才出场)将来需要 | 工具 | 作用 | 优先级 | |---|---|---| -| `AiDefinitionValidator` | 接入 `SOValidationRunner`。以 `AssetDatabase.FindAssets("t:AiRecipeSO")` 枚举全部配方,校验:模块字段是否留空、`AbilityRef` 是否两侧同时非空、`ApproachAttackEngagement` 是否配了 `EnemyAttackSelector`。**唯一能防住 450+ 引用出错的东西** | 紧接本次 | +| `AiDefinitionValidator` | 接入 `SOValidationRunner`。以 `AssetDatabase.FindAssets("t:AiRecipeSO")` 枚举全部配方,校验:模块字段是否留空、`AbilityRef` 是否两侧同时非空、`ApproachAttackEngagement` 是否配了 `EnemyAttackSelector`、**`RushExit.Committed` 所引用的能力 `cooldown` 是否 > 0**(见下)。**唯一能防住 450+ 引用出错的东西** | 紧接本次 | | `EnemyAiRecipeWizard` | 建配方资产的脚手架(CLAUDE.md 第 2 条:不裸建),按 `AssetFolderSpec` 定名定路径。**本次必须先有它**,E001 的配方资产才能合规产出 | 本次 | | `_definitionId` 下拉 Drawer | 定制路径(约 5%)从 `AiDefinitionRegistry.Ids` 取值,预制体上不再手打字符串 | 紧接本次 | | `AiGraphExporter` | 把 `AiGraph` 导出为 Mermaid(`Transition.Label` 已为此准备)。150 张图若不能一眼看懂就没人敢改 | 路线图 |