docs(enemy): Boss AI 单轨落地——新增作者指南,清理描述已删除系统的长期文档

新增 Docs/Guides/09_BossAi_Authoring_Guide.md:
定制路径写法([AiDefinition] + AiScript)、建态原语(AiStateFragments +
BossFragments + IBossControl)、阶段=换招池、一招怎么配(EnemyAbilitySO +
EnemyAttackSO + 动画事件)、开战触发、死亡归物理层,
以已落地的 ChaoFengAi 为逐段范例,附 Boss 专属陷阱与已知缺口。
08 号指南加交叉引用。

删除两份整份描述已删除且从未实现的体系的文档:
Docs/Architecture/23_BossSkillModule.md、Docs/Design/47_BossSkillSystem.md。
删前已确认全库无 Markdown 链接残留,索引行与关联文档行改指新指南或 spec。

修订:25_CharacterArchitectureOverview §4 Boss 章节按实际代码重写;
07_EnemyModule 加过时提示、§11 改重定向;02_EventSystem 修正 Boss 事件发送方;
19_BossPatternLibrary 加废止提示(设计意图仍有效,类型名已废);
AssetFolderSpec 删旧 Boss 技能编辑器条目;三处 README/索引同步。
Docs_Dev/ 历史记录保留不动。

spec 标记为已实施,并记录实施期偏差(无 Boss 骨架、Telegraph 枚举保留、
阶段直查不走黑板、BossSkillEvent 一并删除)与八项已知未完成项,
其中 EnemyHurtState 无受击动画永久卡死为最高优先级、且与 Boss 轨无关。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 17:14:32 +08:00
co-authored by Claude Opus 5
parent cf0ac60fad
commit 6d3816d7ef
12 changed files with 654 additions and 242 deletions
@@ -1,9 +1,12 @@
# 25 · 角色系统架构全景图
> **命名空间** `BaseGames.Player`、`BaseGames.Player.States`、`BaseGames.Enemies`、`BaseGames.Enemies.AI`、`BaseGames.Boss`、`BaseGames.Combat`
> **命名空间** `BaseGames.Player`、`BaseGames.Player.States`、`BaseGames.Enemies`、`BaseGames.Enemies.Abilities`、`BaseGames.AI`、`BaseGames.Combat`
> **路径** `Assets/_Game/Scripts/Player/`、`Assets/_Game/Scripts/Enemies/`、`Assets/_Game/Scripts/Combat/`
> **关联文档** [05_PlayerModule](05_PlayerModule.md) · [06_CombatModule](06_CombatModule.md) · [07_EnemyModule](07_EnemyModule.md) · [09_ProgressionModule](09_ProgressionModule.md) · [23_BossSkillModule](23_BossSkillModule.md)
> **建立日期** 2026-05-17
> **关联文档** [05_PlayerModule](05_PlayerModule.md) · [06_CombatModule](06_CombatModule.md) · [07_EnemyModule](07_EnemyModule.md) · [09_ProgressionModule](09_ProgressionModule.md) · [`Docs/Guides/08_EnemyAi_Authoring_Guide`](../Guides/08_EnemyAi_Authoring_Guide.md) · [`Docs/Guides/09_BossAi_Authoring_Guide`](../Guides/09_BossAi_Authoring_Guide.md)
> **建立日期** 2026-05-17  **§4 Boss 章节重写** 2026-07-30Boss 与小怪单轨统一)
>
> ⚠️ §3.3「AI — Behavior Designer 节点库」仍描述已移除的第三方行为树插件,尚未重写;
> 当前决策层是自研 `BrainGraph`,写法以上方两份作者指南为准。
本文档是跨模块的**角色系统实现全景图**,侧重三类角色(玩家 / 小怪 / Boss)在 Scene 中的节点结构、脚本职责划分、子系统数据流与相互协作关系。各模块深度细节请参阅上方关联文档。
@@ -28,7 +31,7 @@
4. [Boss](#4-boss)
- 4.1 [继承关系](#41-继承关系)
- 4.2 [Scene 节点结构](#42-scene-节点结构)
- 4.3 [技能执行流 BossSkillSO + BossSkillExecutor](#43-技能执行流-bossskillso--bossskillexecutor)
- 4.3 [一招的数据流](#43-一招的数据流)
- 4.4 [阶段切换](#44-阶段切换)
5. [共享战斗层 Combat Module](#5-共享战斗层-combat-module)
- 5.1 [核心接口](#51-核心接口)
@@ -444,100 +447,110 @@ EnemyBase.TakeDamage(DamageInfo)
```
MonoBehaviour
└── EnemyBaseIDamageable / ILOSRequester
└── BossBase
├── 阶段切换EnterPhase(int) + BossPhaseEventChannelSO 广播
├── IsHPBelow(float ratio) → BD_IsHPBelow 轮询条件
└── override Die() → _onBossFightEnded.Raise(true)
└── BossBase+ BaseGames.AI.IBossControl
├── 阶段:CurrentPhase / EnterPhase(int) + BossPhaseEventChannelSO 广播
├── 阶段过渡:BeginPhaseTransition(targetPhase, invincibleDuration)
│ → IsPhaseTransitioning(期间 IsInvincible 为真)→ EnterPhase
├── IsHPBelow(float ratio):供 AI 图的条件边读取
├── 竞技场锚点:AnchorAt(i) / DistanceToAnchor(i)(转发 BossArenaAnchors
└── override Die() → 中止阶段过渡 + _onBossFightEnded.Raise(true)
└── [具体 Boss 类]
override EnterPhase → 额外过渡逻辑(动画/无敌帧/BD 子树切换)
override EnterPhase / OnBeginPhaseTransition → 额外过渡演出
```
**Boss 没有独立的技能体系。** 招式即敌人能力(`EnemyAbilitySO` + `EnemyAbilityBase`),
选招即 `EnemyAttackSelector`,决策即 `EnemyAiBrain` 上的 `AiScript` 图。
Boss 专属的只有 `IBossControl` 这一个决策面加几个旁挂 MonoBehaviour。
---
### 4.2 Scene 节点结构
```
[Boss_XxxGuardian]
BossBase具体 Boss 脚本继承 BossBase
│ ├── EnemyStats / EnemyMovement / EnemyCombat / EnemyFeedback
│ ├── BossSkillExecutor 接收 BD/Orchestrator 指令,执行 BossSkillSO 协程
│ ├── WeakPointSystem 弱点激活窗口管理(BossSkillExecutor 技能后开启
│ ├── TelegraphSystem 攻击预兆提示(激光标线 / 范围高亮 / 地面警示
│ ├── BehaviorTree 含 BD_EnterPhase 的行为树资产
[ENM_XxxBoss]
│ 具体 Boss 脚本继承 BossBase,实现 IBossControl
│ ├── EnemyStats / EnemyMovement / EnemyLocomotion / EnemyFeedback
│ ├── GroundNavigator(或 FlyingNavigator
│ ├── PhysicsPerceptionSystem 感知(追逐区 / 视野 / 攻击范围
│ ├── EnemyAiBrain 决策层(_definitionId 指向 [AiDefinition] 的 AiScript
│ ├── BossPhaseAbilityGate 阶段 = 换招池:按阶段启停能力组件
│ ├── BossArenaAnchors(可选) 竞技场定点走位的锚点集合
│ ├── EnemyAbilityBase × N 每招一个组件,各自引用一份 EnemyAbilitySO
│ ├── BossResource(可选) 怒气 / 充能;是否已满经 IBossControl.ResourceFull 读取
│ └── AnimancerComponent
├── HurtBox 主体受击盒(Layer=EnemyHurtBox
│ └── 弱点受击盒同样是 HurtBox,靠 _damageMultiplier 表达倍率,无独立弱点系统
├── WeakPoint_Head 弱点受击盒
│ └── HurtBox(弱点专属,WeakPointSystem 控制激活/关闭
├── ContactDamageZone 身体接触伤害(常驻,Layer=EnemyHitBox
── HitBox_XXX × N 各近战招的判定盒(默认禁用,由动画事件按时机开关
├── XxxMuzzle × N 弹体发射点
── HitBox_Slam 近战攻击 HitBoxLayer=EnemyHitBox
├── HitBox_Sweep 横扫 HitBox(可与 BossSkillSO 绑定)
└── BossArenaBlocker(可选) 竞技场封锁触发器(Boss 战开始时封门)
── [场景侧] BossFightTrigger 房间入口触发区:发开战事件 + AiSignal.Engaged
```
---
### 4.3 技能执行流 BossSkillSO + BossSkillExecutor
### 4.3 一招的数据流
```
BossSkillSOCreateAssetMenu: BaseGames/Boss/BossSkill
├── skillId / displayName
├── BossSkillType(枚举)
├── AttackPatternSO
│ ├── DamageSourceDamageSourceSO
│ ├── KnockbackAngle
│ ├── 弹幕参数:ProjectilePrefab / Count / SpreadAngle / Speed
│ ├── AoE 参数:Radius / Offset
│ └── 时序:WindupDuration / ActiveDuration / RecoveryDuration
├── VulnerabilityWindowDuration 技能结束后弱点暴露时长(秒)
└── SkillSequenceSO(可选) 组合技序列(按顺序或随机排列多个 BossSkillSO
EnemyAbilitySOCreateAssetMenu: BaseGames/Enemies/Enemy Ability,前缀 ABL_
├── abilityId / designNote
├── attackSequence: EnemyAttackSO[] 一招内的多段
├── cooldown 从执行结束起计
├── interruptOnHurt / interruptOnStagger 中断规则
├── category / weight / priority 选招器用
├── rangeRadius / rangeOffset 招式自管的圆形触发范围
└── requiresGrounded / requiresLineOfSight 选招硬门
BossSkillExecutor.ExecuteSkill(BossSkillSO)
│ if _isExecuting → return
── StartCoroutine(ExecuteSkillCoroutine)
├── _onBossSkillStarted.Raise(BossSkillEvent)
├── TelegraphSystem.ShowTelegraph(skill.pattern) 预兆提示激活
├── WaitForSeconds(WindupDuration) 前摇等待
├── 激活 HitBox[] / ProjectileManager.Spawn(pattern) 伤害输出
├── WaitForSeconds(ActiveDuration) 活跃帧等待
├── 关闭 HitBox / 清理弹幕
├── WeakPointSystem.OpenWindow(VulnerabilityWindowDuration) 弱点窗口
├── WaitForSeconds(RecoveryDuration) 后摇等待
└── _onBossSkillEnded.Raise(BossSkillEvent)
EnemyAttackSO(前缀 EATK_)—— 一段动作的时间轴
├── clip: ClipTransitionAnimancer
├── hitBoxSlot / hitBoxEnterT / hitBoxExitT 判定开关的归一化时机
── damageSource: DamageSourceSO
├── projectileConfig / projectileCount / projectileFireT
└── hasPoiseWindow / poiseLevel / poiseStartT / poiseEndT
WaitForSeconds 缓存
static Dictionary<float, WaitForSeconds> _wfsCache
[RuntimeInitializeOnLoadMethod] ClearWFSCache()
→ 避免协程每次 new WaitForSeconds 的 GC 分配
执行链
AI 图的攻击态 OnEnter
└── IAiContext.Combat.UseBestAttack()
└── EnemyAttackSelector 从 category==Attack 且 CanUse 的能力里选一个
CanUse 含 enabled、冷却、射程、grounded / LOS 硬门;
WeightedRandomAntiRepeat 模式对上次选中的招施加权重折扣)
└── EnemyAbilityBase.Execute():逐段播 clip
判定 / 生成 / 音效 / 无敌帧全部由 clip 上的动画事件驱动
EnemyAnimationEvents.HandleEvent
```
**InterruptCurrentSkill()**:阶段切换时强制停止当前协程并调用 `FinishExecution()`,确保状态一致性。
---
### 4.4 阶段切换
```
BD_IsHPBelow(每帧轮询
└── BossBase.IsHPBelow(ratio) = CurrentHP / MaxHP < ratio
→ true 时 BD 子树激活 BD_EnterPhase
AI 图的条件边(如 x.Vitals.HpBelow(0.5f)
└── 转入阶段过渡态(BossFragments.PhaseTransition
OnEnterLocomotion.Stop() + Combat.InterruptAbilities()
+ IBossControl.BeginPhaseTransition(targetPhase, invincibleDuration)
BD_EnterPhase → BossBase.EnterPhase(phase)
├── _currentPhase = phase
├── BossPhaseEventChannelSO _onBossPhaseChanged.Raise(BossPhaseEvent{BossId, Phase})
│ → Boss HP 条分段动画(UI
│ → 音乐系统切换 BGM 段落
→ VFX 场景效果触发
└── [子类重写 EnterPhase]
├── BossSkillExecutor.InterruptCurrentSkill() 打断当前技能
├── 切换 BD 行为树活跃子树(换招式库)
── 播放阶段过渡动画(Animancer
└── 短暂无敌帧(保护阶段切换不被秒杀)
BossBase.BeginPhaseTransition
├── IsPhaseTransitioning = true → IsInvincible 随之为真
├── OnBeginPhaseTransition(targetPhase) [子类重写:浮空 / 过渡动画]
├── 等待 invincibleDuration
├── EnterPhase(targetPhase)
├── _currentPhase = phase
│ ├── BossPhaseAbilityGate.ApplyPhase(phase)
│ │ → 按阶段表设置各能力组件的 enabled
│ │ → 被禁用的能力 CanUse 为 false,自动从选招器候选消失
── _onBossPhaseChanged.Raise(BossPhaseEvent{BossId, Phase})
│ → Boss HP 条分段动画 / BGM 段落切换 / 场景 VFX
└── IsPhaseTransitioning = false
→ AI 图上 .To(下一态).When(x => !x.Boss.IsPhaseTransitioning) 放行
```
**阶段不是 SO 上的字段,也不是选招器里的过滤条件——阶段就是"哪些能力组件当前启用"。**
`BossBase.OnSpawn``ApplyPhase(0)`,保证对象池复用时回到初始招池。
作者写法详见 [`Docs/Guides/09_BossAi_Authoring_Guide.md`](../Guides/09_BossAi_Authoring_Guide.md)。
---
## 5. 共享战斗层 Combat Module
@@ -613,10 +626,10 @@ StatusEffectEventChannelSO 广播效果开始/结束(UI 状态图标)
| `ProjectileConfigSO` | `BaseGames.Combat` | 投射物速度/碰撞层/生命时长/弹幕参数 |
| `EnemyStatsSO` | `BaseGames.Enemies` | 敌人 HP/Defense/速度/攻击冷却 |
| `EnemyAnimationConfigSO` | `BaseGames.Enemies` | 敌人动画 Clip 集合 |
| `AttackPatternSO` | `BaseGames.Enemies`(Boss) | 攻击图案:伤害/弹幕/AoE/时序 |
| `BossSkillSO` | `BaseGames.Enemies`Boss | Boss 技能全量配置 |
| `SkillSequenceSO` | `BaseGames.Enemies`Boss) | Boss 组合技序列(有序/随机) |
| `BossResourceConfigSO` | `BaseGames.Enemies`Boss | Boss 阶段资源(HP 阈值/技能池) |
| `EnemyAbilitySO` | `BaseGames.Enemies.Abilities` | 一招的全量配置(id/冷却/权重/射程/中断规则);小怪与 Boss 共用 |
| `EnemyAttackSO` | `BaseGames.Enemies.Abilities` | 一段动作的时间轴(clip + 判定/弹体/霸体的归一化时机) |
| `AiRecipeSO` | `BaseGames.Enemies` | 小怪 AI 配方(未发现层 + 交战层两个可插拔模块)。Boss 不用配方,走 `[AiDefinition]` 定制图 |
| `BossResourceConfigSO` | `BaseGames.Enemies`Boss | Boss 资源(怒气/充能)配置 |
**设计原则**:所有运行时组件在 `Awake` 中通过 `Initialize(SO)` 接收配置,与数据资产完全解耦,支持 Inspector 热替换和难度 A/B 测试,无需修改脚本代码。