跳转到正文

处理器与战斗钩子

作

作者

作者

创建时间: 2026年10月21日更新时间: 2026年10月21日

目录

处理器与战斗钩子

先判断要改的是“命中之后做什么”“GE 应用前打什么标记”“连击能不能往下一步走”,还是“步骤变化后通知谁”。前三项都有专用缝;不要先去改子弹复制或 FastArray。

相关文档:第一次接线见 注册第一条攻击结果,字段见 开发者设置与战斗数据,运行链路见 战斗流程与攻击结果。

先判断要不要扩展

需求

默认是否足够

扩展入口

命中后发 Gameplay Event / 播 Cue

足够

内置 GameplayEvent、GameplayCue Processor

破防、死亡、战斗日志

默认没有项目规则

派生 UGCS_AttackResultProcessor

按来源/目标标签分流结算

基类已有 Query

UGCS_AttackResultProcessor_WithTagRequirement

GE 应用前追加动态标签

基类空实现

HandlePreGameplayEffectSpecApply

把属性回调收成 AttackResult

基类空实现,必须项目填

HandleGameplayEffectExecute

连击门闩、选招附加规则

默认全放行

AllowAdvanceCombo / CanSelectedComboDefinition

步骤变化驱动动画层或 UI

组件已广播

OnComboStepChanged / OnComboStepChangedEvent

近战本地立刻受击反馈

组件已提供

Instant GE 上挂 UGCS_GEComponent_PredictivelyExecute,Processor 用 LocalPredicted

适合自定义的案例:韧性扣到 0 时用一个 Default Processor 读 UAS_Poise,再对目标施加破防 GE,并写一条战斗日志。死亡不要指望内置 Death Processor——它的原生实现是空的,第一次执行会 Warning。

默认已经够用的案例:命中后让受击者播受击 Event、让攻击者播命中 Cue。在 Combat Flow 上放 GameplayEvent(bSendToAttacker 按需要)和 GameplayCue Processor,Cue 标签可写在 Processor 上,或写在攻击定义的 TargetGameplayCues(非空时覆盖 Processor 列表)。

派生 Processor

UGCS_AttackResultProcessor 是 Abstract、EditInlineNew、DefaultToInstanced、Const。放进 Combat Flow 的 AttackResultProcessors。入口是 HandleIncomingAttackResult;ProcessIncomingAttackResult 会跳过已 bConsumed 的结果。新增后确认已经拖进 CombatFlowClass 的实例,而不是只改了 CDO。

UGCS_AttackResultProcessor_WithTagRequirement 在调用前用 SourceTagQuery / TargetTagQuery 过滤聚合标签,空 Query 视为匹配。按攻击类型分流时优先用它,不要在每个 Processor 里手写 HasTag。

内置类

做什么

默认是否够用

UGCS_AttackResultProcessor_Death

占位。原生 Handle 为空,首次调用打 Warning。

不够。项目必须覆写,再调 StartDeath / FinishDeath。

UGCS_AttackResultProcessor_GameplayEvent

对服务器 Pawn 或本地控制 Pawn 发 Event。载荷 DynamicTags 并入 Instigator Tags。

够用:受击硬直、连击推进事件。

UGCS_AttackResultProcessor_GameplayCue

本地执行 Cue,不随结果再复制一次。可从攻击定义覆盖 Cue 列表,并用 TaggedValues 填幅度。

够用:受击闪光、命中音效。

失败信号:编辑器里把 bEditorDebugEnabled 关掉后,该 Processor 在 PIE 中整段跳过。VLog 在 VeryVerbose 下会写 “Skipped local predicted / server only processor”。

ExecutePolicy 契约

HandleAttackResult 按策略决定这条结果能不能进 Processor。预测上下文来自载荷的 bIsPredictingContext。

策略

何时执行

适合放什么

不要放什么

Default

非预测结果,相关机器都会跑。

权威结算后的 Event、需要两端一致的状态读取。

只能出现一次的扣费、死亡。若 GE 走了预测,预测那一遍会被跳过,等权威结果再跑。

LocalPredicted

本地预测结果,以及未被 PredictionKey 匹配上的权威结果。匹配成功(bWasPredicated)则跳过。

受击顿帧、本地 Cue、镜头抖动。

改血量、改库存、写存档。预测弹不会产生预测 AttackResult,这条策略帮不了子弹。

ServerOnly

非预测、且不是复制进来的权威结果。

战斗日志、统计、掉落。

客户端必须立刻看到的表现。

近战 Instant GE 挂上 UGCS_GEComponent_PredictivelyExecute 后,AutonomousProxy 会先写 PredictionKey 再本地 Execute。权威结果复制回来时,容器用同一 Key 把复制条目标成 bWasPredicated。Cue Processor 若要本地立刻播,策略用 LocalPredicted,并谨慎打开 bPredictGameplayCues,避免和权威那一遍叠两次。

Combat Flow 钩子

UGCS_CombatFlow 是每个 Actor 一条、权威实例化再复制的流水线。组件在 BeginPlay 把它注册为 GGA Globals 接收器,PreApply 转发到 Flow。

入口

能改变什么

默认已经够用的情况

HandlePreGameplayEffectSpecApply

给即将应用的 Spec 追加动态 AssetTags(经 OutDynamicTagsAppendToSpec)。

攻击定义的 AttackTags 已经够 Processor 过滤。

HandleGameplayEffectExecute

从 FGGA_GameplayEffectModCallbackData 建 FGCS_AttackResult 并 RegisterAttackResult。

不够。 基类实现为空,项目 Flow 必须在这里产出结果,否则 Processor 永远收不到命中。带预测执行组件时,本地预测执行也会进来。

HandleAttackResult

按 ExecutePolicy 分发。默认已合并 DynamicTags 并写入 LastProcessed 缓存。

够用。不要为了“跑 Processor”再抄一遍分发。

RegisterAttackResult 只接受权威端或预测上下文。客户端丢进一条既不权威也不预测的结果会被拒绝并 Warning。

不要在 PreApply 里再 Apply 新的 GE,以免重入 Globals 接收器。子弹命中也不要在子弹层手写 AttackResult;保留 EffectContext 里的攻击定义句柄,让属性回调走回这条流水线。

连击 Ability 钩子

UGCS_ComboAbility 拥有连击推进。子攻击技能不要直接改 ComboStep,除非有意绕过这套契约。选招只在本地控制端跑。

入口

能改变什么

默认已经够用的情况

AllowAdvanceCombo

返回 false 则 AdvanceCombo 直接返回。默认 true。

没有“硬直中禁止接下一击”的规则。

StartCombo

用传入 Event 做第一步,默认进 HandleComboExecution。

开场不需要额外镜头或武器切换。

AdvanceCombo

先问 AllowAdvanceCombo,再选招。

输入缓冲已经在技能或输入层处理好。

ResetCombo

清 DesiredComboStep,并 ResetComboState。Ability 结束时会调。

默认清零即可。

CanSelectedComboDefinition

在表过滤之后再否决一行。默认 true。可读 Extension。

表上的 EventTag / TagQuery / 激活测试已经够。

适合自定义的案例:CanSelectedComboDefinition 从行的 Extension 读“需要的武器标签”,再和 GetCurrentWeapon 的 GetWeaponTags 比较,避免持枪时选出持刀的下一击。

失败信号:没有连击表会 Error;选不到下一行只 Verbose 并标 DesiredComboStep = INDEX_NONE;子技能 TryActivateAbility 失败会整段 Reset。bAbortIfActivationTestFailed 为真时,一次 CanActivate 失败直接放弃整段,不再看后面的行。

OnComboStepChanged

UGCS_CombatSystemComponent 复制 ComboStep(SkipOwner)。本地 UpdateComboStep 会 RPC 到另一端;复制回调在 SimulatedProxy 上触发。步骤实际变化后调用蓝图钩子 OnComboStepChanged(PrevComboStep),并广播 OnComboStepChangedEvent。

适合:动画图按步骤切 Layer、UI 显示“2 / 3 击”。不要在这里选下一招——选招属于 Combo Ability。ResetComboState 只在步骤不是 0 时写回 0。

验证

  1. 单机打一击:Gameplay Debugger 的 Attack Result 出现新条目,Default Processor 的 Event / Cue 各一次。
  2. 近战预测:AutonomousProxy 先看到 LocalPredicted Cue;权威结果到达后同一 Processor 不再跑。VLog VeryVerbose 出现 Skipped。
  3. 子弹:客户端只有弹道,服务器才有 Result。不要给子弹 GE 挂预测执行还指望本地结算。
  4. 连击:输入事件后 ComboStep 从 0 到 1;收招行的 bResetComboStep 只在 MinComboStep > 0 时回到 0。