战斗流
UGCS_CombatFlow 是一个 UObject,战斗系统组件可以配置自己的 CombatFlow。你可以基于 GCS_BaseCombatFlow 蓝图扩展或配置处理逻辑,也可以从 UGCS_CombatFlow 派生并重写需要的函数。
处理属性变更
如游戏性属性所述,GGA_AttributeSystemComponent 会把属性集的 PostGameplayEffectExecute 回调转发到 CombatFlow 的 HandleGameplayEffectExecute。你可以在这里处理本次 Gameplay Effect 对属性造成的变化,并按游戏规则生成攻击结果。
如果 Gameplay Effect 配置了 UGCS_GEComponent_PredictivelyExecute,自主代理上的瞬时效果也会在本地预测执行,并进入同一处理流程。
属性如何变化、产生什么攻击结果,取决于你的游戏规则;参考实现提供了魂类游戏中常见的处理方式。
产生攻击结果
在 HandleGameplayEffectExecute 中处理属性变化后,根据该过程和游戏规则构造 FGCS_AttackResult,再通过战斗系统组件注册。注册只接受权威端或本地预测上下文;普通的非权威、非预测注册会被拒绝。
FGCS_AttackResult 包含 Gameplay Effect 的 EffectContextHandle、聚合后的来源与目标标签,以及可选对象。它本身没有 TaggedValues 字段。需要传递额外数值时,将其写入 EffectContextHandle 所携带的 FGCS_ContextPayload_Combat;例如,你可以把处理流程计算出的实际生命变化作为自定义数值保存到该载荷中。
自定义 CombatFlow
攻击者可以发起不同的攻击请求,而不同目标也可能需要不同的处理方式。你可以自定义 CombatFlow,并在各自的 CombatSystemComponent 上配置不同的流程,避免把目标差异都写进攻击者的 If/Else 判断中。
例如,箭矢通常会让敌人触发受击反应;如果大型敌人不应因普通箭矢做出反应,可以为它配置不同的 CombatFlow。
适合采用不同 CombatFlow 的情况包括:
- 狗不应弹反玩家的攻击。
- 巨型 Boss 不应因为脚部受到轻微攻击而倒地。
- 建筑物不应闪避攻击。
在 CombatFlow 中访问攻击请求
攻击请求会通过 GameplayEffectContext 在处理流程中传递,因此可以从 Context 读取请求及其关联的攻击定义。
注意事项
- AttackRequest 是
Const UObject,用于承载配置数据。将其视为静态数据,不要在游戏运行时修改。 - 在蓝图属性支持内联实例化时,可以直接创建 AttackRequest 实例,并将它随所属资产保存。
攻击结果
权威端或本地预测流程注册攻击结果后,结果会加入战斗系统组件的 Fast Array 容器,并立即交给 CombatFlow 处理。权威结果随后通过网络复制;客户端收到新结果时也会调用 CombatFlow。攻击反馈由配置的攻击结果处理器根据结果内容产生,例如发送游戏事件或触发 Gameplay Cue。
处理攻击结果
你可以在 CombatFlow 中以数据驱动的方式配置多个 AttackResultProcessor,并用执行策略控制它们在预测和权威流程中的运行时机。
Default:处理非预测结果,在相关机器上执行。LocalPredicted:本地预测结果会立即执行;未与本地预测匹配的权威结果也会执行。客户端收到的权威结果若通过 PredictionKey 匹配到本地预测结果,会跳过这次重复处理。适合用于本地即时反馈;权威状态变更应放在Default或ServerOnly处理器中。ServerOnly:只处理服务器上的非预测、非复制权威结果,适合仅由服务器执行的逻辑。
可以参考 GCS_BaseCombatFlow 蓝图中的配置。
内置攻击结果处理器
Send Gameplay Event(发送游戏事件)
此处理器可以根据攻击结果向攻击者或受击者发送不同的游戏事件。
也可以使用 TagQuery 按结果标签分流。例如,仅当来源标签包含 Block 时触发格挡受击事件;仅当来源标签包含 Hit 时触发普通受击反应。
自定义攻击结果处理器
通过继承 GCS_AttackResultProcessor 可以实现新的处理器。例如,伤害统计处理器可以把每次受击结果记录到日志、战报或 UI 系统。选择执行策略时,应根据逻辑是否需要本地即时反馈或权威状态更新来配置。