跳转到内容

战斗系统(ComboGraph)

本章介绍 ComboGraph 的技术选型理由、连招系统实现,以及基于动画通知的碰撞检测方案。

ComboGraph 在项目中被定位为表现层(动画/连招)逻辑层 (GAS) 间的桥梁。它集成了连招输入及缓冲 (Input Buffering) 与攻击动画播放管理,并负责与 GAS 系统对接,分发和执行核心攻击事件(伤害、技能消耗 Cost、Gameplay Cues 表现反馈)。

系统构成

组件职责
ComboGraphCollision运行时碰撞检测逻辑(见 2.2.2 节)
Primary ComboGraphAsset定义连招节点与流程的数据资产

ComboGraph 资产文件夹结构(HeavyCombo / LightCombo 文件夹 + CG_HeavyAttackCombo / CG_LightAttackCombo 资产)

上一个项目中踩过的坑——为什么用 ComboGraph,而不用蓝图手搓连招逻辑:

维度蓝图手搓ComboGraph
可视化巨大的 Switch on Int + 一堆 If 判断,分支设计时连线一团糟树状节点结构,每个节点是一个动作,每条连线是一个分支条件
输入缓冲需要手写高精度 Input Buffering,是动作游戏”手感”的灵魂,蓝图很难写好自带 InputBuffer,记录当前动作期间的输入并自动衔接下一动作
后期迭代断开一堆连线、重新接线甚至重写逻辑数据驱动,编辑器拖拽节点、修改连线即可
复杂派生停顿/长按检测混在连招逻辑里,最终一团糟连线上的一个不同转换条件

2.2 以轻攻击 Combo 为例,说明 ComboGraph 在项目中的实现

Section titled “2.2 以轻攻击 Combo 为例,说明 ComboGraph 在项目中的实现”

ComboGraph 轻攻击节点图(五段连招树状结构 + 右侧轨道属性面板)

节点图左侧 — 连招逻辑:当玩家输入 LightCombo 按键(鼠标左键)后,在 PlayerBP 中执行该 ComboGraph(从 Entry 开始)并播放第一段蒙太奇。连线表示输入不同按键后按顺序播放对应蒙太奇(Combo 连段),轻攻击 Combo 共四段,最后一段支持左右键轻重击转换。

节点图右侧 — 执行内容(从上到下):

轨道内容
动画播放对应蒙太奇(蒙太奇中的 AN/ANS 一同执行)并设置播放速率
Gameplay Effects为 OnHit 物体发送 Event.Montage 标签,激活 GE_Damage_Melee(伤害 -5.0),触发 GE_Cost_LightAttack(耐力消耗)
Gameplay Cues收到 Event.Montage 标签后的表现层效果——受击位置的声音、粒子效果

2.2.1 动画蒙太奇的配置(AnimNotify)

Section titled “2.2.1 动画蒙太奇的配置(AnimNotify)”

AnimNotify 用于在动画播放到某个时间节点时,发送信号通知或触发逻辑。

动画蒙太奇 AnimNotify 配置(CollisionWind ANS 判定窗口、MotionWarp、NS_Stylized_Trail 拖尾特效、SFX 音效轨道)

目前一段攻击动画中,配置有以下几个 AnimNotify:

通知作用
Motion Warping处理 Motion Warping 逻辑(详见 Motion Warping 章节
Collision Window攻击碰撞判定(下文 2.2.2 & 2.2.3)
Niagara VFX / Sound Effects武器拖尾特效 (Niagara VFX) 和脚步声/攻击音效

ComboGraphCollision 是挂载在发起攻击 Actor 上的组件,充当碰撞管理器角色。它解决了 UE 原生碰撞(Overlap / Hit)难以处理的两个痛点:

BP_MainPlayer Components 面板 — ComboGraphCollision 组件与 GAS 核心组件(AbilitySystemComponent、GSCCore 等)并列挂载

2.2.3 基于动画通知状态的射线检测(ANS-based Trace)

Section titled “2.2.3 基于动画通知状态的射线检测(ANS-based Trace)”
  1. 静态网格体设置

    在武器模型 (StaticMesh) 上添加数个 Socket(插槽),定义每个检测点的位置。

    武器 StaticMesh Socket 设置 — Socket 1 / Socket 2 定义检测起止点

  2. 动画配置

    在攻击 Animation Sequence / Montage 的关键帧轨道上添加 AnimNotifyState (ANS)——即上文中的 Collision Window。起始点 (Notify Begin) 为攻击动作开始造成威胁的那帧,结束点 (Notify End) 为挥剑结束帧。定义了攻击的判定窗口

  3. 运行时逻辑

    动画播到 Collision Window ANS 起始点时,组件开始工作:基于上一帧与当前帧的 Socket 位置差进行形状扫掠(支持 Line、Sphere、Box 或 Capsule),填补帧间空隙,形成连续、严密的扇面判定轨迹,完美解决低帧率下的穿模问题。

碰撞检测可视化 — 蓝色球体连线展示攻击挥舞的连续判定轨迹,橙色命中特效标记实际碰撞点