技能系统组件

AbilitySystemComponent(技能系统组件)

你可以到这里更深入的了解技能系统组件。

技能系统组件,是自带的AbilitySystemComponent的拓展,它非常轻量。

任意Actor只需要添加GGA_AbilitySystemComponent,就可以驱动GameplayAbility。你不需要在C++为角色定义该组件。

gga guide 3

默认参数

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

gga guide 4

AbilityTagRelationshipMapping(技能Tag关系映射)

该组件还可以指定一个类型为GGA_AbilityTagRelationshipMapping数据资产,用于定义不同的技能之间的阻挡、打断,以及激活需求关系。该映射简称为TRM

这能够允许你在一个地方管理多个技能之间的各种关系,而不是在多个分散中的技能中去分别定义它与其他技能的关系。这个能极大地简化你的管理工作,尤其是在你有上百个GameplayAbilities的时候。

gga guide 5

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

gga guide 6
举个例子:在上面的TRM示例中,Roll的时候阻挡了Step,万一你的设计师要求你Step后紧跟Roll呢?这时候动态切换TRM就派上了用场。

初始化

参考这里查看C++的设置方式。 https://github.com/tranek/GASDocumentation?tab=readme-ov-file#412-setup-and-initialization

而你可以通过下面的函数初始化挂载到Pawn的AbilitySystem组件。它内部会调用InitAbilityActorInfo并赋予默认技能集(它内部会检查只在服务端给予技能。)

gga guide 7

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

gga guide 8

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

gga guide 9

理解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数据资产,即可创建新的技能集。

gga guide 10
通常在游戏中,一个角色会有默认的技能集,也会在游戏运行时根据其它游戏机制(如装备变化,武器切换)而替换或者新增技能集。
同时,也建议你划分不同的技能、效果到不同的技能集,以处理优先级问题,同时方便管理。

在运行时添加/移除技能集

除了在技能系统组件的默认值上添加可用的AbilitySet,你也可以在运行时添加/移除AbilitySet。

gga guide 11
在我的战斗系统中,我会在武器实例中,根据武器激活与否,从而给予角色对应的AbilitySet。

在赋予技能集时的注意事项

通常,我会准备两套技能集。所有这些技能集都将按顺序添加到能力系统组件中。因此,你应该仔细考虑依赖顺序。

例如:你不应该在实际添加属性集之前,先添加游戏效果来修改属性,因为这时候属性并不存在。
gga guide 12

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


gga guide 13

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

gga guide 14
请注意修改器的顺序,“最大属性”放在当前属性的前面。

Ability System Globals

GGA 还提供了自定义版本的 AbilitySystemGlobals类。

它提供了额外的功能,允许您对能力系统内发生的某些全局事件做出响应。

同时暴露了更多API到蓝图,允许你更容易地使用AttributeInitter等功能。

Global Event Receiver(全局事件接收器)

在原本的AbilitySystemGlobals中,有一些事件非常有用,但没有暴露在 BP 中,即使在 C++ 中也不容易使用。

比如这个:

gga guide 38

实现接口

幸运的是,有了 GGA,你可以让你的 Actor/Component 实现一个名为 “IGGA_AbilitySystemGlobalsEventReceiver ”的接口。

让你的类实现这个接口。在开始/结束游戏时,您可以注册该组件来接收来自能力系统全局的事件。

gga guide 39

实现案例

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

gga guide 40

例如,您可以通过判断 SourceTags 是否包含某些标签,在修改器幅度计算(Modifier Magnitude Calculation)或游戏效果执行计算(Gameplay Effect Execution Calculation)中执行不同的伤害计算流程。

只有当 SourceTags 包含 Impact.ResultBlock 时,才会启用与体力相关的计算,并应用体力伤害。

这就是我实现 “闪避”、“躲避”、“弹反”等多种战斗计算流程的方法。

全局Ability系统(Global Ability System)

这是一个名为 "GGA_GlobalAbilitySystem"的世界子系统,如果你想为当前游戏世界中的所有AbilitySystemComponent进行变更,那么这将非常有用。

这个系统需要你使用 GGA_AbilitySystemComponent, 每一个这个组件都会在初始化时注册到这个全局Ability系统。

gga guide 41

举例: 如果你正在制作一款多人射击游戏,可以在比赛开始前的热身阶段为所有玩家分配 GE_DamageImmune。

不要把它和AbilitySystemGlobals搞混淆, AbilitySystemGlobals只是GAS内部使用的一个单例。

蓝图节点拓展

GGA对GAS进行了大量的拓展,很多API可以在蓝图中的ContextActionList中能够找到,你可以敲入“GGA|”以过滤出所有属于GGA的可用操作。

gga guide 42

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