本仓库是对 Udemy 课程 《Unreal Engine 5 - Gameplay Ability System: Top Down RPG》(讲师 Stephen Ulibarri / Druid Mechanics)官方项目
DruidMech/GameplayAbilitySystem_Aura的 C++ 源码学习笔记。
Aura 是一个基于 UE 5.3 的俯视角暗黑类 ARPG 课程项目,完整演示了 GAS(Gameplay Ability System) 在现代 UE5 项目中的工程化用法。工程约 100+ 个 C++ 文件,涵盖:
- 属性系统(AttributeSet):主属性 / 次属性 / 抗性 / 生命法力 / Meta 属性
- 伤害管线(ExecCalc):抗性减免、护甲、破甲、格挡、暴击、Debuff、径向伤害
- 技能系统(ASC):输入绑定、技能槽位、升级解锁、被动技能
- 技能实现:火球(FireBolt)、电击(Electrocute)、火焰爆裂(FireBlast)、召唤(Summon)、秘法碎片
- 战斗表现:浮字伤害、受击反应、死亡溶解、击退/击飞
- AI:行为树 + 黑板(寻敌、攻击、HitReact 状态)
- UI:WidgetController 模式 + MVVM 加载界面
- 存档:LoadScreen 存档 + 世界状态序列化(SaveGame 标记属性)
原项目:https://github.com/DruidMech/GameplayAbilitySystem_Aura(本机:C:\work\GameplayAbilitySystem_Aura)
源码根目录:Source/Aura/
Source/Aura/
├── Public/ 与 Private/ 对应镜像
│ ├── AbilitySystem/ # GAS 核心:ASC、AttributeSet、ExecCalc、技能、数据资产
│ ├── Actor/ # 投射物、火球、魔法阵、效果物、刷怪点
│ ├── AI/ # AIController、行为树 Service/Task
│ ├── Character/ # 角色基类、玩家角色、敌人
│ ├── Checkpoint/ # 检查点、地图入口
│ ├── Game/ # GameMode、GameInstance、存档类
│ ├── Input/ # 输入配置与绑定组件
│ ├── Interaction/ # 接口:战斗、玩家、敌人、高亮、存档
│ ├── Player/ # PlayerController、PlayerState
│ └── UI/ # HUD、WidgetController、MVVM、伤害浮字
| # | 文档 | 内容 |
|---|---|---|
| 00 | 00-源码覆盖索引 | 按上游源码目录组织的覆盖索引(✅/🟡/🔴/⚪) |
| 1 | 01-项目架构总览 | 整体架构、类关系、初始化流程 |
| 2 | 02-GameplayTags与核心数据结构 | 原生 Tag 单例、FDamageEffectParams、自定义 EffectContext |
| 3 | 03-属性系统 AttributeSet | 属性定义、复制、伤害处理、XP/升级、Debuff 施加 |
| 4 | 04-伤害计算 ExecCalc_Damage | 完整伤害公式:抗性→护甲→暴击→格挡→Debuff |
| 5 | 05-能力系统 ASC | 输入绑定、技能槽位、升级/装备/被动、RPC |
| 6 | 06-技能实现详解 | FireBolt / Electrocute / FireBlast / Summon 逐技能解析 |
| 7 | 07-投射物与战斗Actor | AuraProjectile、AuraFireBall、MagicCircle、效果物、刷怪 |
| 8 | 08-角色系统 | 角色基类、玩家角色、死亡/溶解/受击、接口实现 |
| 9 | 09-玩家控制器与输入 | 点击移动、光标追踪、自动寻路 Spline、技能输入 |
| 10 | 10-AI与敌人 | AIController、行为树、黑板、敌人实现 |
| 11 | 11-UI与WidgetController | HUD、三种 WidgetController、MVVM 加载界面 |
| 12 | 12-存档系统 | LoadScreenSaveGame、世界状态序列化、检查点 |
| 13 | 13-工具库与杂项 | AuraAbilitySystemLibrary、接口、Niagara 组件、日志 |
| 14 | 14-设计原理-GAS核心 | 为什么这么设计:Tags/EffectContext/AttributeSet/ExecCalc/ASC/数据资产 |
| 15 | 15-设计原理-技能与战斗 | 为什么这么设计:技能继承树/各技能/投射物/战斗 Actor/刷怪 |
| 16 | 16-设计原理-角色玩家与输入 | 为什么这么设计:角色分层/PlayerState 持 ASC/点击移动/输入/AI |
| 17 | 17-设计原理-UI存档与框架 | 为什么这么设计:WidgetController/MVVM/字节存档/检查点/GameMode |
| 18 | 18-设计原理-接口工具与杂项 | 为什么这么设计:接口体系/静态库/Niagara 声明式/全局扩展点 |
| 19 | 19-完整战斗调用链 | FireBolt / 技能装备 / XP升级 / 存档 四条完整调用链 |
| 20 | 20-GAS网络复制与预测 | ASC 位置/初始化时序/PredictionKey/TargetData/RPC 总表 |
| 21 | 21-蓝图与资产依赖图 | GA/GE/DataAsset 映射表与 Blueprint-only 流程 |
| 22 | 22-GAS调试与排错 | 断点清单/观察数据/12 类常见 Bug |
| 23 | 23-GAS关键数据结构 | Spec/EffectSpec/Context/ActorInfo/TargetData/PredictionKey 六问解析 |
分析基线:UPSTREAM.md —— DruidMech/GameplayAbilitySystem_Aura @ cd631e4(UE 5.3)
源码覆盖索引(00)
→ 类/模块文档(01~13)
→ 设计原理(14~18)
→ 系统调用链(19)→ 网络时序(20)→ 资产映射(21)→ 调试排错(22)→ 数据结构(23)
→ 实践 Lab(labs/00~13)
按顺序完成 labs/00 → labs/13,即可从空工程搭建一个最小可运行的 GAS ARPG(含多人测试):
| # | Lab | 目标 |
|---|---|---|
| 00 | 实验环境 | 搭建 UE 5.3 C++ 工程 |
| 01 | 接入GameplayAbilities模块 | 启用 GAS 插件与模块 |
| 02 | ASC与AttributeSet | 挂载并初始化 GAS 组件 |
| 03 | GameplayTag输入 | Tag 驱动的输入绑定 |
| 04 | 第一个GameplayAbility | 输入激活技能 |
| 05 | Cost与Cooldown | 蓝耗与冷却 |
| 06 | 伤害ExecCalc | 最小伤害公式 |
| 07 | Projectile技能 | 服务器生成投射物 |
| 08 | Debuff | 动态构建周期伤害 GE |
| 09 | 技能升级与装备 | 技能状态机 + RPC |
| 10 | WidgetController | UI 数据驱动 |
| 11 | AI调用Ability | 行为树触发技能 |
| 12 | SaveGame | 存档与读档 |
| 13 | DedicatedServer测试 | 多人网络行为验证 |
每个 Lab 使用统一模板:本节目标 / 完成效果 / 前置知识 / 新建类 / 新建资产 / 实现步骤 / 关键代码 / 完整调用链 / 为什么这么设计 / 如何验证 / 常见 Bug / 与 Aura 原版的区别 / 下一步。
- 先读 01-项目架构总览,建立整体认知
- 再按 标签 → 数据资产 → 属性 → 伤害 → 技能 的顺序读 GAS 部分(02~06)
- 然后读战斗 Actor 与角色(07~08)
- 再读输入、AI、UI、存档(09~12)
- 理解"为什么":通读设计原理系列(14~18),每个类/函数的设计动机与取舍
- 串起来:读 19(完整调用链)→ 20(网络)→ 21(蓝图/资产)→ 23(数据结构)
- 动手:按 labs/00~13 从零复刻(每节含验证方法与常见 Bug)
- 完善方案:方案/仓库完善执行方案.md(7 阶段规划与执行状态)
- 文档站点:MkDocs Material 配置(
mkdocs.yml),GitHub Pages 自动构建(.github/workflows/docs.yml:链接检查 + Markdownlint + 构建)
设计原理系列(14~18)逐类回答了:这个类为什么存在?这个函数为什么这么设计?解决了什么问题?权衡了什么?
注意:本文档基于官方仓库
main分支最新提交(cd631e4 Upgrade to 5.3 and fix MVVM compatibility issues)整理。