docs(ai): spec 补充"敌人感知↔状态模型"(待机/警觉/追击/巡逻)
两感知(追逐/视野)+HasAlert勾选+统一规则(升级经警觉/降级永不回警觉)+缺省自动降级 +职责边界(转换归AI层,感知只做纯查询)+PerceptionStateMachine可复用件。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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. 交付面
|
||||||
|
|
||||||
### 6.1 Mermaid/dot 导出器
|
### 6.1 Mermaid/dot 导出器
|
||||||
|
|||||||
Reference in New Issue
Block a user