在 ARPG 项目中分层组织 GAS 的实战架构
February 24, 2025About 6 min
在 ARPG 项目中分层组织 GAS 的实战架构
Epic 自带的 GameplayAbilities 插件给了我们 ASC / Ability / Effect / Cue 这套抽象,但当项目规模膨胀到上百个能力、几百个攻击资产、上千个 GameplayTag 时,光靠原生类是兜不住的——会到处出现继承爆炸、配置散落、能力间互相硬引用。
这篇笔记整理一个真实 ARPG 项目里 GAS 的三层架构,以及围绕它沉淀的数据资产体系,供搭建中大型战斗系统时参考。
一、三层结构
把 GAS 切成自顶向下三层,每一层只关心自己的事:
| 层次 | 来源 | 职责 |
|---|---|---|
| Epic 原生层 | Engine/Plugins/GameplayAbilities | UGameplayAbility、UAbilitySystemComponent、UGameplayEffect、FGameplayTag 等核心类型 |
| 内部框架层 | 内部公共插件 | 在原生类上扩展激活流程、标签关系、属性事件等通用能力,跨项目复用 |
| 项目层 | Source/<Game>/GAS | 项目专属实现:所有属性集、能力派生类、效果计算 |
整体设计原则:
- 状态全部走
FGameplayTag,不在游戏代码里写枚举字符串。 - 所有伤害/回复修改都先进
MetaDelta元属性,统一在PostGameplayEffectExecute内做 Clamp、归零、状态触发。 - 法术参数全部数据资产化(
USpellAsset/USpellRingAsset/USpellFlightAsset)——能力本身只负责"挑哪个资产、什么时候用",具体伤害和碰撞参数留给资产编辑器。 - 默认网络模式:
LocalPredicted + ClientOrServer(本地预测,服务器或客户端均可发起)。
二、类继承图谱
六条继承链分别用类图呈现,<<Epic>> 是引擎原生类,<<框架层>> 跨项目复用,<<项目层>> 是项目专属实现。
2.1 Ability 继承链
2.2 AbilitySystemComponent 继承链
2.3 AttributeSet 继承链
2.4 GameplayEffect 继承链
2.5 GameplayCue 继承链
2.6 AbilitySet 与 AbilityTask
三、运行时数据流
完整的输入到表现链路,按层次串起来就是这样:
从输入到表现的完整链路:
四、核心数据资产关系
法术资源做成软引用 + 异步加载,能力本身保持轻量:
五、模块依赖与 include 习惯
GAS 主要依赖三套模块:
PublicDependencyModuleNames.AddRange(new string[]
{
"GameplayAbilities", // Epic GAS 核心
"GameplayTags", // 标签系统
"GameplayTasks", // 任务系统
});
PrivateDependencyModuleNames.AddRange(new string[]
{
"GameplayAbilities",
"GameplayTags",
"TargetingSystem", // 目标定位系统(与 GAS 集成)
"GameFramework", // 内部框架层
});
常用 include:
// Epic 原生
#include "AbilitySystemComponent.h"
#include "GameplayEffect.h"
#include "GameplayAbility.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "Abilities/Tasks/AbilityTask.h"
// 项目层
#include "GAS/AbilitySystemComponentProject.h"
#include "GAS/Abilities/GameplayAbilityProject.h"
#include "GAS/AbilitySystemGlobalsProject.h"
#include "GAS/Attributes/AS_Health.h"
#include "GAS/Effects/GameplayEffectStructs.h"
#include "GAS/Cue/GameplayCueManageComponent.h"
// 框架层
#include "AbilitySystem/AbilitySystemComponentBase.h"
#include "AbilitySystem/Abilities/GameplayAbilityBase.h"
#include "AbilitySystem/AbilitySystemStructLibrary.h"
六、规模感
参考量级(仅作量级估算,实际数字按项目而定):
| 类别 | 量级 | 说明 |
|---|---|---|
| C++ 能力类 | ~6 | 1 个项目基类 + 几个 C++ 派生(处决、死亡、肢解等) |
| 蓝图能力(GA_*.uasset) | 40+ | 玩家、敌人、交互等 |
| 属性集 | 13 | 8 个战斗属性集 + 5 个专用属性集 |
| 法术资产(PA_Spell_*) | 200+ | 所有武器/角色的攻击定义 |
| 环形资产(PA_SpellRing_*) | 300+ | 近战碰撞区定义 |
| 飞行资产(PA_SpellFlight_*) | 60+ | 投射物定义 |
| 敌人能力集(GASets_*) | 30+ | 按角色类型分组 |
| GameplayCue 类型 | 4 | Burst / BurstLatent / Looping / StaticBurst |
| GameplayTag 总数 | 1000+ | 含历史重定向记录 |
| AbilityTask 类 | 3 | SpellRing + 2 个框架层任务 |
到这个量级,每多写一个 C++ 派生类的成本都会被放大,因此做数据资产 + 蓝图覆盖远比做继承结构更划算。后续几篇笔记会展开讲核心类、流程、蓝图、数据资产、标签和维护实践。
关联阅读
- 已有的 GAS 学习笔记:GameplayAbilitySystem
- 社区权威参考:tranek/GASDocumentation(英文,覆盖 GAS 几乎所有细节)
- 系列其它篇:核心 C++ 类、完整流程图、蓝图使用、数据资产、GameplayTag、维护指南、攻击传递 TDD。