9.9 KiB
title, description
| title | description |
|---|---|
| Boss行为树设计:【铁骑士 - 埃癸斯】 | 结合“专家级博弈”与“铁骑士架构”,设计的一套基于意图广播、条件打断与攻防转换的高阶 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
- 原理: 当 AI 发动“无情追击”被玩家完美闪避后,由外部系统或动画事件将
-
[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)
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。
- 前摇期: 触发举盾动画,并在 Boss 身上启用特定的
📌 节点3:HeavyChargeWindup (可中断状态动作类 Action)
- 节点名称:
HeavyChargeWindup - 内部逻辑描述:
- 开场时赋给自身
SuperArmor(如果它没有常驻霸体)。 - 开始漫长蓄力(如 2 秒)。
- 核心机制:监听玩家的
HeavyAttack伤害事件。如果蓄力期间挨到玩家的HeavyAttack判定,主动中断自身蓄力并分发强硬直事件(触发Death & Global Stagger Subtree)。 - 若蓄力圆满完成,返回
TaskStatus.Success以便下一级节点释放“毁灭性打击”。
- 开场时赋给自身