跳转到正文

挂上战斗组件

作

作者

作者

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

目录

挂上战斗组件

本篇把一个战斗角色接到 GCS:权威端先按 GenericGameplayAbilities 文档完成 InitializeAbilitySystem,再挂战斗组件并实现 IGCS_CombatEntityInterface。做完后 Debugger Shared 段能看到组件和接口,本篇先不发出攻击。

相关文档:系统分层见 系统边界;Flow 与结果见 战斗流程与攻击结果。

前置条件

  1. 已按 快速开始 启用 GenericCombatSystem 及其 .uplugin 依赖。GIPS 负责输入缓冲,不是本插件模块依赖。
  2. 已按 GGA 文档把 Ability System Globals 指到 UGGA_AbilitySystemGlobals,并在权威端调用 InitializeAbilitySystem。本页点名 GGA 文档,不链到其他插件路径。
  3. 准备一个可在服务器生成的战斗 Pawn。GCS 不要求指定角色基类,Actor 或组件实现接口即可。
  4. 准备一个可实例化的 UGCS_CombatFlow 子类(基类是 Abstract),上面至少放一条 Processor。怎么覆写并接到 GGA 回调,见 注册第一条攻击结果。

1. 先确认 Ability System

在挂 GCS 之前,权威端角色已经有可用的 GGA Ability System Component。Combat Flow 靠 GGA 的属性回调和 Effect Context Payload 收成 FGCS_AttackResult。ASC 还没初始化时,后面的命中和 GE 都不会按预期进入 Flow。

2. 挂最小组件集

在要参与战斗的 Pawn 上:

  1. 添加 UGCS_CombatSystemComponent,指定 CombatFlowClass。权威端 BeginPlay 会用这个类 NewObject 出 Flow 并复制给客户端,所以不能填抽象基类。
  2. 近战再加 UGCS_TraceSystemComponent。实际 Sweep 由 Trace Subsystem Tick,组件持有 Handle 和命中事件。
  3. 远程再加 UGCS_BulletSystemComponent。它管理复制的子弹 Entry、实例和预测契约。
  4. 需要锁定或阵营过滤时加 UGCS_TargetingSystemComponent 与 UGCS_CombatTeamAgentComponent。Targeting 可挂在非 Pawn Actor 上;Team 组件复制 FGenericTeamId。
  5. 让角色或其中一个组件实现 IGCS_CombatEntityInterface。至少能返回当前目标、是否死亡、当前武器和连击表(没有连击就返回空表)。

动作选择如果走标签匹配,用 UGCS_AbilityActionSetSettings 这份 DataAsset,不要把它当成项目设置类。实体的 QueryAbilityActionsByContext 再读这份资产。

3. 实现接口时先写最小返回

接口可以挂在 Actor 或组件上。UGCS_CombatFunctionLibrary::GetCombatEntityInterface / FindCombatInterface 会先看 Actor,再找实现了接口的组件。

最小实现建议:

函数

本篇建议

GetCombatTargetActor

转给 UGCS_TargetingSystemComponent 的当前锁定目标

IsDead

返回项目自己的死亡标记;还没做死亡就先返回 false

GetCurrentWeapon / SetCurrentWeapon

记住“本次动作要用的武器”,不要在这里做装备栏切换

GetComboDefinitionTable

没有连击返回空;有武器时通常转给武器上的连击表

其余旋转、移动集、死亡流程可以先留空实现,等连击和武器篇再补。

预期结果

权威端 PIE 后,角色上能找到 Combat 组件和已实例化的 Combat Flow。蓝图 Get Combat System Component / Find Combat System Component 成功。Debugger Shared 段把战斗实体接口标为存在。

验证

  1. UGCS_CombatSystemComponent::GetCombatSystemComponent / FindCombatSystemComponent 非空。
  2. 近战角色 GetTraceSystemComponent / FindTraceSystemComponent 成功;远程角色再确认 GetBulletSystemComponent / FindBulletSystemComponent。
  3. 锁定角色能 GetTargetingSystemComponent;阵营角色能通过 GetCombatTeamAgentInterface 读到队伍。
  4. 打开 Gameplay Debugger 的 Combat 分类(模块启动时注册为 GenericCombatSystem):Shared 段看到 Combat 组件、Combat Flow,以及战斗实体接口。
  5. Flow 上的 Processor 列表不是空的。

常见失败

现象

先查

蓝图搜不到 GCS 组件

插件与依赖是否启用;工程是否已编译后重开编辑器

Combat Flow 一直是 None

CombatFlowClass 是否为空,或填了不能实例化的 UGCS_CombatFlow 抽象基类

Shared 段没有战斗实体接口

接口是否加在被查找的 Actor/组件上;是否编译 Blueprint

后面打不出 Attack Result

权威端是否先 InitializeAbilitySystem;Globals 是否为 GGA

客户端看得到组件、服务器没有 Flow

Flow 只在权威端创建。先看服务器窗口

下一步

组件找得到之后,按 注册第一条攻击结果 让 Combat Flow 真正产出 Result。近战再走 做一次近战攻击,远程走 做一次远程攻击。