跳转到正文

攻击系统

在战斗中,对敌人造成的每一击,称之为一次“攻击”。角色使用一次近战攻击技能(含攻击动作),可能会对触发1~多次攻击,每一击能够对目标造成不同类型,程度的伤害。 为实现这样的灵活性,GCS引出“攻击系统”。

作

作者

作者

创建时间: 2025年11月24日更新时间: 2026年10月12日

目录

概述

GCS 将一次命中的静态数据放在 AttackDefinition 中,再由近战或子弹 AttackRequest 指定何时、以什么方式使用这份数据。一个攻击动作可以在不同命中窗口使用不同请求和攻击定义。

攻击定义

FGCS_AttackDefinition 是 DataTable 行结构,描述单次命中的数据。创建行结构为 FGCS_AttackDefinition 的 DataTable,并为不同攻击阶段、武器或伤害变体建立行。

主要字段

  • AttackTags:描述攻击特征的 Gameplay Tags。它们会作为动态 Asset Tags 加入 GameplayEffectSpec,供计算和后续处理使用。
  • SetByCallerMagnitudes:以 GameplayTag 为键的浮点数映射,会传入 GameplayEffectSpec,供执行计算等逻辑读取。
  • TargetEffectClass 与 TargetEffectContainer:分别配置应用于命中目标的 Gameplay Effect 类和效果容器。两者不是互斥选项;只要各自有效,就会分别应用。TargetEffectClassLevel 小于 1 时使用 Ability 等级;容器效果等级由 Ability 等级决定。
  • 命中反馈数据:还可配置目标 Gameplay Cues、KnockbackDistance、KnockbackMultiplier、HitStallingDuration 和 HitPlayRateFactor。
  • 扩展字段:C++ 使用 NativeExtension 扩展结构,蓝图使用 Extension 实例化结构,以增加项目自己的攻击定义数据。

攻击定义句柄会随 Gameplay Effect 写入 EffectContext,使后续的 CombatFlow 和处理器可以读取关联定义。

管理攻击定义表

可以按武器类别、攻击类型或项目的数据组织习惯拆分 DataTable。近战 AttackRequest 直接保存攻击定义行句柄;子弹则通过 BulletDefinition 引用攻击定义行。

攻击请求

UGCS_AttackRequest_Base 是攻击请求基类,具体请求提供攻击定义句柄。当前有近战与子弹两种请求;它们负责描述一次攻击的参数,不负责独立执行命中处理。

近战攻击

在动画的近战窗口使用 GCS_ANS_AttackTrace 保存 UGCS_AttackRequest_Melee。请求中:

  • TracesToControl 指定攻击窗口要启停的 Trace 标签。
  • AttackDefinitionHandle 指向本次命中使用的攻击定义行。

UGCS_ANS_AttackTrace 是请求数据容器,不是运行时 Trace 执行器。Ability/项目逻辑在窗口开始和结束时调用 UGCS_AbilityTask_CollisionTrace 的 AddMeleeRequest / RemoveMeleeRequest。该任务通过 UGCS_TraceSystemComponent 启停 Trace,并通过 OnTargetsFound 将命中信息交回 Ability。

子弹攻击

在子弹攻击中,UGCS_AttackRequest_Bullet 通过 BulletDefinitionHandle 指定子弹定义。BulletDefinition 再通过 AttackDefinition 指定命中使用的攻击定义。

请求还可配置发射与瞄准方式:

  • TargetingSourceType 选择相机、Pawn 或武器的朝向/焦点模式;选择 Custom 时,需要在 BulletRequest 子类中重写 GetTargetingTransform。
  • SourceComponentLookupTagName 用于查找来源组件;SourceSocketName、SourceWeaponSocketName 和 LocationOffset 用于设置来源位置。
  • 启用 bRequireTargeting 时,必须提供 TargetingPreset。请求可以从来源 Pawn 解析当前战斗目标。

UGCS_ANS_BulletTrace 可在动画中保存 BulletRequest。Ability 的 GameplayEvent 需要把请求放在事件数据的 OptionalObject 中;UGCS_AbilityTask_BulletTrace 监听配置的事件标签,读取请求后调用 UGCS_BulletSystemComponent 生成子弹。

本地预测只用于玩家发起的首批子弹轨迹与视觉表现。预测子弹不会应用 Gameplay Effect;实际命中与效果结算由服务器权威处理。

自定义攻击请求类型

你可以从 UGCS_AttackRequest_Base 派生请求类型,以承载项目需要的额外参数。若 BulletRequest 的 TargetingSourceType 使用 Custom,请从 UGCS_AttackRequest_Bullet 派生并实现 GetTargetingTransform。