处理器与战斗钩子
先判断要改的是“命中之后做什么”“GE 应用前打什么标记”“连击能不能往下一步走”,还是“步骤变化后通知谁”。前三项都有专用缝;不要先去改子弹复制或 FastArray。
相关文档:第一次接线见 注册第一条攻击结果,字段见 开发者设置与战斗数据,运行链路见 战斗流程与攻击结果。
先判断要不要扩展
需求 | 默认是否足够 | 扩展入口 |
|---|---|---|
命中后发 Gameplay Event / 播 Cue | 足够 | 内置 GameplayEvent、GameplayCue Processor |
破防、死亡、战斗日志 | 默认没有项目规则 | 派生 |
按来源/目标标签分流结算 | 基类已有 Query | |
GE 应用前追加动态标签 | 基类空实现 | |
把属性回调收成 AttackResult | 基类空实现,必须项目填 | |
连击门闩、选招附加规则 | 默认全放行 | |
步骤变化驱动动画层或 UI | 组件已广播 | |
近战本地立刻受击反馈 | 组件已提供 | Instant GE 上挂 |
适合自定义的案例:韧性扣到 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。
内置类 | 做什么 | 默认是否够用 |
|---|---|---|
| 占位。原生 Handle 为空,首次调用打 Warning。 | 不够。项目必须覆写,再调 |
| 对服务器 Pawn 或本地控制 Pawn 发 Event。载荷 | 够用:受击硬直、连击推进事件。 |
| 本地执行 Cue,不随结果再复制一次。可从攻击定义覆盖 Cue 列表,并用 | 够用:受击闪光、命中音效。 |
失败信号:编辑器里把 bEditorDebugEnabled 关掉后,该 Processor 在 PIE 中整段跳过。VLog 在 VeryVerbose 下会写 “Skipped local predicted / server only processor”。
ExecutePolicy 契约
HandleAttackResult 按策略决定这条结果能不能进 Processor。预测上下文来自载荷的 bIsPredictingContext。
策略 | 何时执行 | 适合放什么 | 不要放什么 |
|---|---|---|---|
| 非预测结果,相关机器都会跑。 | 权威结算后的 Event、需要两端一致的状态读取。 | 只能出现一次的扣费、死亡。若 GE 走了预测,预测那一遍会被跳过,等权威结果再跑。 |
| 本地预测结果,以及未被 PredictionKey 匹配上的权威结果。匹配成功( | 受击顿帧、本地 Cue、镜头抖动。 | 改血量、改库存、写存档。预测弹不会产生预测 AttackResult,这条策略帮不了子弹。 |
| 非预测、且不是复制进来的权威结果。 | 战斗日志、统计、掉落。 | 客户端必须立刻看到的表现。 |
近战 Instant GE 挂上 UGCS_GEComponent_PredictivelyExecute 后,AutonomousProxy 会先写 PredictionKey 再本地 Execute。权威结果复制回来时,容器用同一 Key 把复制条目标成 bWasPredicated。Cue Processor 若要本地立刻播,策略用 LocalPredicted,并谨慎打开 bPredictGameplayCues,避免和权威那一遍叠两次。
Combat Flow 钩子
UGCS_CombatFlow 是每个 Actor 一条、权威实例化再复制的流水线。组件在 BeginPlay 把它注册为 GGA Globals 接收器,PreApply 转发到 Flow。
入口 | 能改变什么 | 默认已经够用的情况 |
|---|---|---|
| 给即将应用的 Spec 追加动态 AssetTags(经 | 攻击定义的 |
| 从 | 不够。 基类实现为空,项目 Flow 必须在这里产出结果,否则 Processor 永远收不到命中。带预测执行组件时,本地预测执行也会进来。 |
| 按 ExecutePolicy 分发。默认已合并 | 够用。不要为了“跑 Processor”再抄一遍分发。 |
RegisterAttackResult 只接受权威端或预测上下文。客户端丢进一条既不权威也不预测的结果会被拒绝并 Warning。
不要在 PreApply 里再 Apply 新的 GE,以免重入 Globals 接收器。子弹命中也不要在子弹层手写 AttackResult;保留 EffectContext 里的攻击定义句柄,让属性回调走回这条流水线。
连击 Ability 钩子
UGCS_ComboAbility 拥有连击推进。子攻击技能不要直接改 ComboStep,除非有意绕过这套契约。选招只在本地控制端跑。
入口 | 能改变什么 | 默认已经够用的情况 |
|---|---|---|
| 返回 false 则 | 没有“硬直中禁止接下一击”的规则。 |
| 用传入 Event 做第一步,默认进 | 开场不需要额外镜头或武器切换。 |
| 先问 | 输入缓冲已经在技能或输入层处理好。 |
| 清 | 默认清零即可。 |
| 在表过滤之后再否决一行。默认 true。可读 | 表上的 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。
验证
- 单机打一击:Gameplay Debugger 的 Attack Result 出现新条目,Default Processor 的 Event / Cue 各一次。
- 近战预测:AutonomousProxy 先看到 LocalPredicted Cue;权威结果到达后同一 Processor 不再跑。VLog VeryVerbose 出现 Skipped。
- 子弹:客户端只有弹道,服务器才有 Result。不要给子弹 GE 挂预测执行还指望本地结算。
- 连击:输入事件后 ComboStep 从 0 到 1;收招行的
bResetComboStep只在MinComboStep > 0时回到 0。