179 lines
9.9 KiB
Markdown
179 lines
9.9 KiB
Markdown
---
|
||
title: Boss行为树设计:【铁骑士 - 埃癸斯】
|
||
description: 结合“专家级博弈”与“铁骑士架构”,设计的一套基于意图广播、条件打断与攻防转换的高阶 Boss Behavior Designer 方案。
|
||
---
|
||
|
||
# Boss 级敌人行为树架构设计:【铁骑士 - 埃癸斯】(Behavior Tree Architect)
|
||
|
||
本方案基于项目中【专家级AI设计理念】(见招拆招、信息广播) 与【铁骑士宏观架构】(弹反追击、重装蓄力打断、二阶段变阵) 综合设计。核心在于**利用条件打断(Conditional Aborts)优先响应玩家的强行为输入**,以实现动态的攻防博弈。
|
||
|
||
## 1. 黑板变量清单 (Blackboard SharedVariables)
|
||
|
||
为了支撑复杂的博弈逻辑与阶段变化,需创建以下变量:
|
||
|
||
- `[SharedTransform] TargetPlayer` - 追踪的玩家目标。
|
||
- `[SharedFloat] HP_Percentage` - 当前生命值百分比,用于二阶段判定。
|
||
- `[SharedBool] IsPhase2` - 是否已进入二阶段 (默认 `False`)。
|
||
- `[SharedBool] IsWeaknessState` - 是否处于“极度虚弱/破防”状态 (默认 `False`)。
|
||
- `[SharedEnum] IncomingThreatType` - 接收到的玩家意图类型 (枚举:`None`, `HighFreqLight`, `HeavyCharge`, `SwitchTech`)。由事件总线或感知触发器动态赋值。
|
||
- `[SharedFloat] ActionCooldown` - 常规攻击连招间的冷却期。
|
||
- `[SharedFloat] LastActionTime` - 上次执行攻击的时间。
|
||
|
||
---
|
||
|
||
## 2. 行为树主干逻辑 (Tree Structure - Indented List)
|
||
|
||
整棵树分为极高优先级的**状态管理**,高优先级的**见招拆招反应**,中优先级的**主动进攻**,以及低优先级的**接敌步伐**。
|
||
|
||
- `[Selector]` (根节点遍历)
|
||
|
||
- `[Behavior Tree Reference]` **死亡与全局硬直 (Death & Global Stagger Subtree)**
|
||
- *原理: 最外层封装处理死亡,以及处理(如蓄力阶段被玩家重攻击成功打断后)造成的强制大硬直。*
|
||
|
||
- `[Sequence]` **虚弱惩罚状态 (Weakness Punishment)** **(Abort Type: Lower Priority)**
|
||
- *原理: 当 AI 发动“无情追击”被玩家完美闪避后,由外部系统或动画事件将 `IsWeaknessState` 设为 True,打断正在进行的其它动作,强制进入虚弱。这段时间 AI 失去霸体。*
|
||
- `[Conditional] Check IsWeaknessState == True`
|
||
- `[Action] Play Weakness/Overheat Animation` (播放核心过载/喘息动画,持续数秒,且失去超级护甲)
|
||
- `[Action] Set IsWeaknessState = False`
|
||
|
||
- `[Sequence]` **二阶段变阵 (Phase 2 Transition)** **(Abort Type: Lower Priority)**
|
||
- *原理: 血量过半后强制打断常规逻辑,播放转阶段动画,解锁红眼/爆气状态。*
|
||
- `[Conditional] Check HP_Percentage < 50`
|
||
- `[Conditional] Check IsPhase2 == False`
|
||
- `[Action] Play Phase Transition Roar` (霸体怒吼,可能震退玩家)
|
||
- `[Action] Set IsPhase2 = True`
|
||
|
||
- `[Selector]` **见招拆招博弈分支 (Reaction & Counter Branch)** **(Abort Type: Lower Priority)**
|
||
- *原理: 持续监听当前的 `IncomingThreatType`。只要不为 `None`,立刻打断主动进攻和追击,进入特定的反制逻辑。*
|
||
|
||
- `[Sequence]` **应对:玩家连续轻攻击 (高频刮痧)**
|
||
- `[Conditional] ThreatType == HighFreqLight`
|
||
- `[Action] Execute Parry Stance` (光耀大盾防反架势)
|
||
- `[Selector]` (判定防反结果)
|
||
- `[Sequence]` (玩家砍在了盾上触发弹刀)
|
||
- `[Conditional] IsParryTriggered == True`
|
||
- `[Action] Execute Relentless Pursuit` (发动迅猛的无情追击突刺。*如果此招未命中,动画事件会设置 `IsWeaknessState = True`*)
|
||
- `[Sequence]` (玩家及时停手)
|
||
- `[Wait] 1.5s` (举盾僵持)
|
||
- `[Action] Parry Recovery` (放下盾牌,露出短暂破绽)
|
||
- `[Action] Clear ThreatType` (重置为 None)
|
||
|
||
- `[Sequence]` **应对:玩家频繁切换武器/高频位移 (Switch-Tech 滥用)**
|
||
- `[Conditional] ThreatType == SwitchTech`
|
||
- `[Action] Area Denial Attack` (举剑猛砸地面,引爆周围立场压缩玩家走位空间)
|
||
- `[Action] Clear ThreatType` (重置为 None)
|
||
|
||
- `[Sequence]` **常规主动进攻分支 (Active Combat Branch)** **(Abort Type: Lower Priority)**
|
||
- *原理: 在冷却就绪时,根据距离和当前阶段挑选主动连段。*
|
||
- `[Conditional] Is Action Cooldown Ready`
|
||
- `[Random Selector]`
|
||
- `[Sequence]` **强力蓄力重击 (毁灭性打击)**
|
||
- `[Action] Heavy Charge Windup` (漫长的前摇准备。*若此时被玩家重攻击击中,底层的感知会被触发,跳至硬直 Subtree*)
|
||
- `[Action] Release Heavy Attack` (释出高伤一击)
|
||
- `[Sequence]` **常规连段 A (近战压迫)**
|
||
- `[Conditional] Check Distance < 3`
|
||
- `[Action] Execute Combo (盾击 -> 挥砍)`
|
||
- `[Conditional] Check IsPhase2 == True` (如果是二阶段,强制追加高阶派生!)
|
||
- `[Action] Execute Follow-up (重下劈)`
|
||
- `[Sequence]` **常规连段 B (中距离突进)**
|
||
- `[Conditional] Check Distance < 6`
|
||
- `[Action] Execute Combo (滑步突刺 -> 横扫)`
|
||
- `[Action] Update LastActionTime`
|
||
|
||
- `[Sequence]` **压迫步伐 (Approaching Strafe)** **(Abort Type: Both)**
|
||
- *原理: 当无法攻击时,采用缓慢、沉稳的压迫性步伐朝玩家移动,而不是奔跑。由于是 Both,随时可以被战斗行为或外界信号打断。*
|
||
- `[Conditional] Check Distance > 2.5`
|
||
- `[Action] Heavy Strafe Towards Target` (持盾压迫寻路)
|
||
|
||
- `[Action] Idle/Guard` (默认待机防守)
|
||
|
||
---
|
||
|
||
## 3. 可视化图表生成 (Mermaid Visualization)
|
||
|
||
```mermaid
|
||
graph TD
|
||
Root([Selector]) --> GlobalSub[[Death / Stagger Subtree]]
|
||
Root --> WeaknessSeq
|
||
Root --> Phase2Seq
|
||
Root --> ReactionBranch
|
||
Root --> ActiveCombat
|
||
Root --> ApproachSeq
|
||
Root --> IdleBlock[Idle Guard]
|
||
|
||
%% 虚弱分支
|
||
WeaknessSeq([Sequence<br>Abort: Lower]) --> CondWeak{Is Weakness?}
|
||
WeaknessSeq --> ActWeak[播放过载虚弱动画<br>失去超级护甲]
|
||
WeaknessSeq --> ResetWeak[Reset Weakness]
|
||
|
||
%% 转阶段
|
||
Phase2Seq([Sequence<br>Abort: Lower]) --> CondHP{HP < 50% & Not Phase2?}
|
||
Phase2Seq --> ActPhase2[爆气怒吼]
|
||
Phase2Seq --> SetPhase2[Set Phase2=True]
|
||
|
||
%% 见招拆招反应
|
||
ReactionBranch([Selector<br>应对玩家操作<br>Abort: Lower]) --> ReactLight
|
||
ReactionBranch --> ReactSwitch
|
||
|
||
ReactLight([Sequence: 应对连击]) --> CondLight{Threat: 连续轻击}
|
||
ReactLight --> ActParry[举起大盾防反]
|
||
ActParry --> SelParry([Selector: 判定结果])
|
||
SelParry --> HitShield([Seq: 弹刀触发]) --> ActPursuit[无情追击突刺<br>落空则致虚弱]
|
||
SelParry --> WaitShield([Seq: 玩家停手]) --> ActVulnerable[放下盾牌产生破绽]
|
||
|
||
ReactSwitch([Sequence: 应对切武/位移]) --> CondSwitch{Threat: 频繁切换/高频位移}
|
||
ReactSwitch --> ActArea[释放场地引爆技<br>压缩走位]
|
||
|
||
%% 主动进攻
|
||
ActiveCombat([Sequence<br>主动进攻<br>Abort: Lower]) --> CondCD{冷却就绪?}
|
||
ActiveCombat --> RandCombo([Random Selector])
|
||
RandCombo --> HeavyCharge[蓄力重攻击<br>可被玩家重攻击打断]
|
||
RandCombo --> ComboA([Seq: 连招A])
|
||
RandCombo --> ComboB([Seq: 连招B])
|
||
|
||
ComboA --> CondDistA{距离<3?} --> ActComboA[盾击挥砍] --> CondPhase2A{是二阶段?} --> FollowUp[强制多段派生: 霸体下劈]
|
||
|
||
%% 压迫步伐
|
||
ApproachSeq([Sequence<br>压迫寻路<br>Abort: Both]) --> CondDist{距离>2.5}
|
||
ApproachSeq --> ActStrafe[沉稳举盾逼近]
|
||
|
||
style ReactionBranch fill:#bf3f3f,stroke:#fff,color:#fff
|
||
style ActWeak fill:#3d59ab,stroke:#fff,color:#fff
|
||
style ActiveCombat fill:#cf8534,stroke:#fff,color:#fff
|
||
style ApproachSeq fill:#4a8247,stroke:#fff,color:#fff
|
||
style GlobalSub fill:#1c1c1c,stroke:#f00,color:#fff,stroke-width:2px
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 自定义 Task 节点需求卡 (Custom Task Specs)
|
||
|
||
为支撑这种高度敏感的 AI 博弈系统,我们需要程序组开发以下 Behavior Designer 交互节点。
|
||
|
||
### 📌 节点1:`ListenIncomingThreat` (条件类 Conditional)
|
||
- **节点名称**: `ListenIncomingThreat`
|
||
- **输入参数 (Exposed)**:
|
||
- `SharedEnum TargetThreatToCheck` (你想截获哪一种 Threat,比如 `HighFreqLight` 或 `Any`)
|
||
- `SharedEnum GlobalThreatVariable` (黑板中用于存储当前 Threat 的变量)
|
||
- **内部逻辑描述**:
|
||
- 通过 `OnUpdate()` 监控 `GlobalThreatVariable`。
|
||
- 如果匹配 `TargetThreatToCheck`,返回 `TaskStatus.Success`。打断低优先级节点。这使得 AI 能够瞬间响应玩家的操作。
|
||
|
||
### 📌 节点2:`ExecuteParryAndCounter` (复合动作类 Action / Sequence)
|
||
- **节点名称**: `ExecuteParryAndCounter`
|
||
- **内部逻辑描述**:
|
||
- **前摇期**: 触发举盾动画,并在 Boss 身上启用特定的 `ParryHitbox`。
|
||
- **监听期**:
|
||
- 如果玩家的攻击(带有 `LightAttack` 标签)撞在 `ParryHitbox` 上,立刻触发玩家大硬直弹刀,并在节点内部立刻播放“无情追击 (Relentless Pursuit)”动画。
|
||
- 如果追击动画的终伤没打中玩家(由外部无敌帧检测/闪避检测判定),调用方法强行把黑板的 `IsWeaknessState` 设为 `True`。
|
||
- **超时期**: 若举盾超过指定时间,未受到攻击,则播放疲惫放下盾牌的动画。
|
||
- **返回值**: 整个逻辑播放完毕或被迫中断才返回 `TaskStatus.Success` 或 `Failure`。
|
||
|
||
### 📌 节点3:`HeavyChargeWindup` (可中断状态动作类 Action)
|
||
- **节点名称**: `HeavyChargeWindup`
|
||
- **内部逻辑描述**:
|
||
- 开场时赋给自身 `SuperArmor` (如果它没有常驻霸体)。
|
||
- 开始漫长蓄力(如 2 秒)。
|
||
- **核心机制**:监听玩家的 `HeavyAttack` 伤害事件。如果蓄力期间挨到玩家的 `HeavyAttack` 判定,主动中断自身蓄力并分发强硬直事件(触发 `Death & Global Stagger Subtree`)。
|
||
- 若蓄力圆满完成,返回 `TaskStatus.Success` 以便下一级节点释放“毁灭性打击”。
|