核心功能
GenericCombatSystem 叠在 GenericGameplayAbilities 上,负责把一次攻击从请求收到结算。Ability 或动画窗口发出攻击请求,Trace 或子弹产生命中,Gameplay Effect 在属性回调里收成攻击结果,再由 Combat Flow 上的 Processor 决定受击、Cue 或项目规则。近战挥砍和远程射击走同一套结果容器,差别只在命中怎么来。
六条能力线
我想搞清楚的问题 | 先读 |
|---|---|
输入、技能、战斗各管哪一段,项目还要写什么 | 系统边界与扩展范围 |
CombatFlow、AttackResult FastArray、Processor 策略 | 战斗流程与攻击结果 |
攻击定义、近战/子弹请求、Effect Context 载荷 | 攻击定义与请求 |
Trace 组件、Subsystem Sweep、动画命中窗口 | Trace 与命中窗口 |
子弹三层状态、预测边界、穿透与链式发射 | 子弹运行时 |
锁定目标、候选列表、阵营过滤 | 目标锁定与阵营 |
连击选招、武器 Actor、战斗实体接口 | 连击、武器与战斗实体 |
完整字段留给 参数参考。要改 Processor、接口或子弹实例时,进入 扩展指南。
请求到 Processor 的链路
一次可观察的攻击通常按这条路径走完:
UGCS_CombatAbility 继承 UGGA_GameplayAbility,从 ActorInfo 取 Combat 组件和战斗实体接口。近战 Task HandleCollisionTraces 在窗口里 AddMeleeRequest;远程由 UGCS_BulletSystemComponent::RequestSpawnBullet 生成批次。命中后,函数库把攻击定义句柄写入 FGCS_ContextPayload_Combat,再对目标应用 Effect。目标身上的 Combat Flow 吃 GGA 的 FGGA_GameplayEffectModCallbackData,在 HandleGameplayEffectExecute 里拼出 FGCS_AttackResult,交给 RegisterAttackResult 写入可复制 FastArray。复制到达后 HandleAttackResult 按各 Processor 的 Default / LocalPredicted / ServerOnly 策略执行。
基类 HandleGameplayEffectExecute 的默认实现是空的,插件也不会自动调用它。项目必须把 GGA 的 PostExecute 转到 Flow,并在子类里注册结果,否则 Processor 不会跑。第一次接线见 注册第一条攻击结果。死亡 Processor 同样是空占位,死亡表现由项目实现。
怎么接着读
第一次接入建议先看 系统边界与扩展范围,再对照 快速开始 或 观察配套项目。已经知道要做近战、远程或连击时,可以直接进入对应能力线,再从页尾跳到操作指南。
系统边界与扩展范围
GCS 解决的是“GAS 和技能已经能跑,但近战窗口、子弹、锁定和受击还要在角色蓝图里手写”的问题。它把攻击请求、命中、攻击结果和 Processor 收成组件与数据表;伤害公式、死亡演出、动画资源和 UI 仍由项目完成。
相关文档:接入步骤见 快速开始,组件挂载见 挂上战斗组件。
产品交付与插件模块
Fab 产品会把 Generic Input System(GIPS)、GenericGameplayAbilities(GGA)和 GenericCombatSystem 一并交付。买家用这三层拼出“按键 → 技能 → 命中结算”。配套项目用来观察现成关卡,插件包本体 CanContainContent 为 false。
GCS 插件只有一个 Runtime 模块 GenericCombatSystem。.uplugin 硬依赖 GGA,以及引擎侧 EnhancedInput、GameplayAbilities、ModularGameplay、TargetingSystem、StateTree、GameplayStateTree、MotionWarping。GIPS 出现在产品组合里,不在本插件的 .uplugin 依赖表上。StateTree 与 MotionWarping 写在依赖里,GCS 运行时源码没有直接调用它们的 API。
三层谁管什么
层 | 谁管 | 典型入口 |
|---|---|---|
输入缓冲、按键映射、带标签的动作窗口 | GIPS(产品附带) | 输入 Setup、缓冲窗口 |
技能授予、属性、Effect Container、标签互斥 | GGA | |
攻击请求、Trace / 子弹命中、Attack Result、锁定与阵营 | GCS | |
战斗技能基类 UGCS_CombatAbility 继承 UGGA_GameplayAbility。Combat Flow 吃的属性回调类型是 GGA 的 FGGA_GameplayEffectModCallbackData。把 Ability System Globals 指到 UGGA_AbilitySystemGlobals,Effect Context Payload 和这条回调才会按预期分配。
输入如何激活战斗 Ability,按 GIPS 或项目自己的 Enhanced Input 绑定处理。GCS 不封装 Input Action 或 Mapping Context。
插件提供、项目必须自己写
GCS 提供可复制的韧性属性集 UAS_Poise(Poise / MaxPoise / PoiseRecover),作为可选起点。项目可以授予它,也可以用自己的 AttributeSet。插件不强制任何伤害公式。
项目继续掌握:
- 伤害数字怎么从 SetByCaller、Capture 或 Execution 算出来。
- 死亡:内置
UGCS_AttackResultProcessor_Death的默认实现是空的,真正的StartDeath/FinishDeath写在战斗实体或项目 Processor 里。 - 动画 Montage、命中停顿的具体资源,以及 HUD、伤害飘字。
UGCS_AbilityActionSetSettings这份 DataAsset 里的动作行如何映射到 Montage;它不是 Developer Settings。
开发者设置类现名 UGCS_DeveloperSettings,常用两项是 CharacterMeshLookupTag(默认查找主网格的组件 Tag)和仅供调试的 bDisableAffiliationCheck。
一个具体场景
第三人称角色用 GIPS 缓冲轻击,GGA 授予近战 AbilitySet 和生命属性。GCS 在 Pawn 上挂 Combat、Trace、Targeting 和 Team 组件,Combat Flow 里放 LocalPredicted 的 Cue Processor 和 Default 的受击 Processor。挥砍命中后,GGA 的 Effect 改目标生命;GCS 把同一次 execute 收成 Attack Result,客户端立刻播 Cue,服务器再复制结果给 SimulatedProxy。步枪弹道和近战扫掠都进同一条 Flow。伤害曲线、死亡 Ragdoll 和血条仍在项目蓝图里。