docs(enemy): 写明 RushExit.Committed 防抖动的前提是能力 cooldown > 0

质量审查发现:Committed 的冷却门若遇上 cooldown==0 的能力,
CanUseAbility 结束下一帧即恢复,Rush↔Rest 每帧抖动照旧出现。
这属能力侧配置错误,不在模块内兜底,纳入 AiDefinitionValidator 校验项。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-29 12:41:09 +08:00
co-authored by Claude Opus 5
parent bb1e2f7705
commit d013fe8e2e
@@ -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 张图若不能一眼看懂就没人敢改 | 路线图 |