From eaf7469d6688df14ca4c00c72e1385dcdf1c4f27 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 9 Jul 2026 15:11:44 +0800 Subject: [PATCH] =?UTF-8?q?docs(ai):=20spec=20=E8=A1=A5=E5=85=85"=E6=95=8C?= =?UTF-8?q?=E4=BA=BA=E6=84=9F=E7=9F=A5=E2=86=94=E7=8A=B6=E6=80=81=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B"(=E5=BE=85=E6=9C=BA/=E8=AD=A6=E8=A7=89/=E8=BF=BD?= =?UTF-8?q?=E5=87=BB/=E5=B7=A1=E9=80=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 两感知(追逐/视野)+HasAlert勾选+统一规则(升级经警觉/降级永不回警觉)+缺省自动降级 +职责边界(转换归AI层,感知只做纯查询)+PerceptionStateMachine可复用件。 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../2026-07-03-enemy-ai-framework-design.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Docs/superpowers/specs/2026-07-03-enemy-ai-framework-design.md b/Docs/superpowers/specs/2026-07-03-enemy-ai-framework-design.md index c5a46353..098990f7 100644 --- a/Docs/superpowers/specs/2026-07-03-enemy-ai-framework-design.md +++ b/Docs/superpowers/specs/2026-07-03-enemy-ai-framework-design.md @@ -199,6 +199,51 @@ public sealed class BasicMeleeGruntAi : EnemyAiScript --- +## 5b. 敌人感知 ↔ 状态模型(待机 / 警觉 / 追击 / 巡逻) + +地面敌人共用的感知驱动状态模型。**职责边界铁律**:状态转换逻辑在 **AI 状态机层**;感知系统只回答"在不在某感知区"(纯传感器,不知道有哪些状态)。 + +### 5b.1 两种感知(感知门面 `EnemyBase`) + +- **追逐感知 `InChaseZone()`**(内,`aggro` 槽):玩家进入 → 触发追击。 +- **视野感知 `InVisionZone()`**(外,`los`/`sight` 槽;无视野槽则回退追逐感知):合并了"警觉触发"与"追击维持"两职——未发现态进入 → 警觉;追击中脱离 → 退出追击。 +- 推荐嵌套 **视野 ⊇ 追逐**(空间滞后:追逐区触发、视野区维持,防边界抖动)。 + +### 5b.2 勾选项 + +- `EnemyStatsSO.HasAlertState`(bool):是否有警觉状态。false 时未发现态进入追逐区**直接追击**、不经警觉;视野仅作追击维持。 + +### 5b.3 统一逐帧规则(`PerceptionStateMachine.Add`) + +``` +全局:Died → Death +待机/巡逻(R): 在追逐区 → 追击(优先) + 否则 HasAlert 且 在视野 → 警觉 + 否则 保持 +警觉: 在追逐区 → 追击 + 否则 脱离视野 → R + 否则 保持警觉(朝向玩家、警觉动画+feedback) +追击: 委托追击能力(如 e001_chase)实现移动/伤害 + 脱离视野 → R(回 Idle/Patrol,**永不回警觉**);退出时 AI 中断追击能力 +``` + +**核心不对称**:警觉**只在升级路径**(未发现态→警觉→追击)出现;**降级**(追击→脱离视野)**永不经过警觉**,直接回 R(该敌人配置的静止态 Idle 或 Patrol)。回 R 后玩家**再进视野 → 会再警觉**(新一次升级,符合 E001 每次重新发现再张口)。 + +### 5b.4 缺省自动降级(一套规则覆盖所有配置) + +- 无警觉(`HasAlert=false`):警觉分支永不触发。 +- 无视野槽:维持退化用追逐感知(脱离追逐区即退出追击)。 +- 视野被追逐包含(误配 S⊆C):等价"无视野",建议校验告警。 + +### 5b.5 复用与实现 + +- **`PerceptionStateMachine`**(`BaseGames.Enemies`):一次性声明四态+统一规则,各敌人只传 `Config`(HasAlert 由 `IEnemyActor.HasAlertState` 运行时读、警觉/追击/巡逻的 OnEnter 钩子、追击能力 id、R)。 +- **E001** = 配置:Idle=伪装、Alert=张口(`e001_alert`)、Chase=委托 `e001_chase`、R=巡逻、HasAlert=true。 +- `ContactChaseAbility` 为**纯执行器**(追击直到被 AI 中断);退出追击的决策归 AI(`OnChaseExit → Combat.InterruptAbilities()`)。 +- 动画:AI 经 `IEnemyActor.SetPhase(AiPhase)` 声明阶段,`EnemyBase.SetAiPhase` 播放(Idle/Alert/Chase/Patrol 各自 clip)。 + +--- + ## 6. 交付面 ### 6.1 Mermaid/dot 导出器