AbilitySystemComponent(技能系统组件)
你可以到这里更深入的了解技能系统组件。
技能系统组件,是自带的AbilitySystemComponent的拓展,它非常轻量。
任意Actor只需要添加GGA_AbilitySystemComponent,就可以驱动GameplayAbility。你不需要在C++为角色定义该组件。

默认参数
该组件可以配置多个技能集(见下文),同时还可以指定GameplayEffects的同步模式。

AbilityTagRelationshipMapping(技能Tag关系映射)
该组件还可以指定一个类型为GGA_AbilityTagRelationshipMapping数据资产,用于定义不同的技能之间的阻挡、打断,以及激活需求关系。该映射简称为TRM
这能够允许你在一个地方管理多个技能之间的各种关系,而不是在多个分散中的技能中去分别定义它与其他技能的关系。这个能极大地简化你的管理工作,尤其是在你有上百个GameplayAbilities的时候。

同时,你还可以在运行时切换到不同的关系映射,从而轻松地对游戏机制进行动态修改。

举个例子:在上面的TRM示例中,Roll的时候阻挡了Step,万一你的设计师要求你Step后紧跟Roll呢?这时候动态切换TRM就派上了用场。
初始化
参考这里查看C++的设置方式。 https://github.com/tranek/GASDocumentation?tab=readme-ov-file#412-setup-and-initialization
而你可以通过下面的函数初始化挂载到Pawn的AbilitySystem组件。它内部会调用InitAbilityActorInfo并赋予默认技能集(它内部会检查只在服务端给予技能。)

这个函数与原始C++文档是等价的:

对于客户端初始化,你也可以通过RPC告诉客户端执行同样的代码。

理解AvatarActor和OwnerActor
通常,AbilitySysytem组件被挂载到哪个Actor,那个Actor就是OwnerActor,而用于表现AbilitySystem组件的具备物理实体的Actor一般就是AvatarActor。OwnerActor和AvatarActor可以一样,也可以不一样。
遵循UE的Gameplay框架来看,Pawn代表着肉体,Controller代表着灵魂;换到GAS的框架中来看,AvatarActor是肉体,OwnerActor是灵魂。
如果你是GAS新手,或者对UE的网络框架不熟悉,我建议你先不要学习专家们把灵魂和肉体分开。先在肉体和灵魂一致(将OwnerActor和AvatarActor保持一样)的情况下学会GAS。
大多数情况下,在你的游戏代码中,你也是通过获取AvatarActor的引用并执行相关的逻辑。你可以在上手后,再去探索OwnerActor和AvatarActor不一样的情况。
赋予技能,属性,效果
AbilitySet是一个数据资产,用于配置一系列需要被赋予到角色上的GameplayAbility,GameplayEffect,以及AttributeSet。AbilitySet在游戏中,给予角色能力,效果的主要方式。
创建技能集
你通过创建类型为GGA_AbilitySet的数据资产,即可创建新的技能集。

通常在游戏中,一个角色会有默认的技能集,也会在游戏运行时根据其它游戏机制(如装备变化,武器切换)而替换或者新增技能集。
同时,也建议你划分不同的技能、效果到不同的技能集,以处理优先级问题,同时方便管理。
在运行时添加/移除技能集
除了在技能系统组件的默认值上添加可用的AbilitySet,你也可以在运行时添加/移除AbilitySet。

在我的战斗系统中,我会在武器实例中,根据武器激活与否,从而给予角色对应的AbilitySet。
在赋予技能集时的注意事项
通常,我会准备两套技能集。所有这些技能集都将按顺序添加到能力系统组件中。因此,你应该仔细考虑依赖顺序。
例如:你不应该在实际添加属性集之前,先添加游戏效果来修改属性,因为这时候属性并不存在。

一个是用于配置必须的东西,例如角色要使用的属性集,我会在这个能力集上添加 “Required ”作为后缀。

然后,我会用另一个技能集,它将赋予游戏效果来初始化我的属性,我通常会在这个技能集上添加 “Defaults ”作为后缀。

请注意修改器的顺序,“最大属性”放在当前属性的前面。
Ability System Globals
GGA 还提供了自定义版本的 AbilitySystemGlobals
类。
它提供了额外的功能,允许您对能力系统内发生的某些全局事件做出响应。
同时暴露了更多API到蓝图,允许你更容易地使用AttributeInitter等功能。
Global Event Receiver(全局事件接收器)
在原本的AbilitySystemGlobals中,有一些事件非常有用,但没有暴露在 BP 中,即使在 C++ 中也不容易使用。
比如这个:

实现接口
幸运的是,有了 GGA,你可以让你的 Actor/Component 实现一个名为 “IGGA_AbilitySystemGlobalsEventReceiver ”的接口。
让你的类实现这个接口。在开始/结束游戏时,您可以注册该组件来接收来自能力系统全局的事件。

实现案例
在重写 PreGameplayEffectSpecApply 时,您可以根据游戏逻辑注入一些标签,这些标签将影响后续的游戏效果应用流程。

例如,您可以通过判断 SourceTags 是否包含某些标签,在修改器幅度计算(Modifier Magnitude Calculation)或游戏效果执行计算(Gameplay Effect Execution Calculation)中执行不同的伤害计算流程。
只有当 SourceTags 包含 Impact.ResultBlock 时,才会启用与体力相关的计算,并应用体力伤害。
这就是我实现 “闪避”、“躲避”、“弹反”等多种战斗计算流程的方法。
全局Ability系统(Global Ability System)
这是一个名为 "GGA_GlobalAbilitySystem"的世界子系统,如果你想为当前游戏世界中的所有AbilitySystemComponent进行变更,那么这将非常有用。
这个系统需要你使用 GGA_AbilitySystemComponent, 每一个这个组件都会在初始化时注册到这个全局Ability系统。

举例: 如果你正在制作一款多人射击游戏,可以在比赛开始前的热身阶段为所有玩家分配 GE_DamageImmune。
不要把它和AbilitySystemGlobals搞混淆, AbilitySystemGlobals只是GAS内部使用的一个单例。
蓝图节点拓展
GGA对GAS进行了大量的拓展,很多API可以在蓝图中的ContextActionList中能够找到,你可以敲入“GGA|”以过滤出所有属于GGA的可用操作。

请查看蓝图节点一览获取更多细节。