跳转到正文

做一次远程攻击

作

作者

作者

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

目录

做一次远程攻击

本篇做出最小远程:一份子弹定义、一条子弹请求,Ability 用 WaitForBulletEvent 监听 Gameplay Event,从 OptionalObject 取出 UGCS_AttackRequest_Bullet 再交给子弹组件。预测弹只负责轨迹和表现;Gameplay Effect、链式弹和 Emitter 后续弹只在服务器发生。

相关文档:Flow 还没有 Result 时先看 注册第一条攻击结果;子弹契约见 子弹运行时;请求字段见 攻击定义与请求。

前置条件

  1. 已按 挂上战斗组件 挂好 Combat、Bullet 组件;命中检测还需要 Trace 组件。目标 Flow 已能按 注册第一条攻击结果 从属性回调注册 Result。
  2. 权威端已 InitializeAbilitySystem。
  3. 已有一行 FGCS_AttackDefinition,其中的 TargetEffectClass 会改目标属性。
  4. 准备一个实现 IGCS_BulletInterface 的子弹 Actor。默认可继承 AGCS_BulletInstance 或 AGCS_SphereBulletInstance。

1. 写子弹定义

新建 Data Table,行结构选 GCS Bullet Definition(FGCS_BulletDefinition):

字段

本篇建议

BulletActorClass

实现 IGCS_BulletInterface 的可生成类,不能填抽象类

BulletCount / LaunchAngle / LaunchAngleInterval

先 1 发、角度 0

InitialSpeed / MaxSpeed

例如 1500,保证能看见轨迹

AttackDefinition

指向已有的攻击定义行

TraceDefinitions

至少一条命中 Trace;会覆盖子弹实例类上的 Trace

数量、扇形间隔和速度都在定义里,不在请求里改弹种。链式和 Emitter 本篇留空,它们只在服务器生成。

2. 填子弹请求

创建 UGCS_AttackRequest_Bullet:

字段

作用

BulletDefinitionHandle

指向第 1 步的子弹定义行

TargetingSourceType

发射朝向:CameraTowardsFocus、PawnForward、PawnTowardsFocus、WeaponForward、WeaponTowardsFocus、Custom

SourceComponentLookupTagName / SourceSocketName / SourceWeaponSocketName

相机朝向焦点以外才需要;找不到 Socket 就回退到来源位置

bRequireTargeting

需要已锁定目标才开火时打开

本篇用 PawnForward 或 CameraTowardsFocus 即可。Custom 必须覆写 GetTargetingTransform。武器起点还可以走武器接口的 GCS_GetTargetingStartTransform。

3. 用 Event 把请求交给 Task

在远程 Ability 里调用 WaitForBulletEvent:

  1. 填要监听的 Gameplay Event 标签。
  2. bInUseScopedPredictionWindow 默认 true,本地玩家开火时会包一层 FScopedPredictionWindow。
  3. 事件触发后,Task 从 EventData.OptionalObject 取出 UGCS_AttackRequest_Bullet,再交给 UGCS_BulletSystemComponent。
  4. 成功走 OnBulletSpawned,失败走 OnBulletSpawnFailed。

动画窗口可以放 GCS_ANS_BulletTrace 存同一份请求,再在窗口里发带 OptionalObject 的 Gameplay Event。Notify 同样不是运行时发射器。

ValidateAttackRequest 可覆写。默认只检查请求有效、BulletDefinitionHandle 能取出定义行。射速、弹药、资源消耗等合法性由项目自己补,不要假设组件会拒发。

预期结果

本地玩家开火后,客户端立刻看到弹道;Debugger Bullet 段出现预测中的 Entry。服务器确认后,Entry 变成已确认,命中才应用 GE。客户端预测弹不会改属性。

验证

  1. 打开 Gameplay Debugger Combat 分类,打出一发后看 Bullet 段:Entry、实例、Pending / Confirmed / LocalPredicted 计数。
  2. 预测弹有轨迹和特效,目标属性不变。
  3. 服务器窗口能看到同一 Entry,命中后 Attack Result 出现。
  4. 配置了 Chain 或 Emitter 时,后续弹只出现在服务器,客户端不会自己再生成一批。
  5. LogGCS_Bullet 提到 Verbose,能看到生成、确认或否决。

常见失败

现象

先查

Event 到了但不生成

OptionalObject 是否为 UGCS_AttackRequest_Bullet;ValidateAttackRequest 是否失败

有弹道没有 GE

先确认是不是预测弹。预测弹不应用 GE 是契约,不是漏接

服务器也没有 Entry

拥有客户端是否走到服务器生成;AI / 非本地控制应走权威生成

BulletActorClass 生成失败

类是否实现 IGCS_BulletInterface,是否可实例化

方向不对

TargetingSourceType、Socket / Tag 是否找得到;bRequireTargeting 打开时有没有锁定目标

连发不受控

默认不校验射速和资源。在覆写的 ValidateAttackRequest 或 Ability Cost 里拦

下一步

远程闭环通了再接 配置连击与武器。预测和权威对不上时看 调试与排错。