游戏性属性基础

GameplayAttributes(游戏性属性)

基础知识

到这里 https://github.com/tranek/GASDocumentation?tab=readme-ov-file#concepts-ge 了解游戏属性的基础知识。

GGA中的Gameplay属性

GGA的GenericGameplayAttributes模块提供了GGA_AttributeSystemComponent组件,该组件本质上是所有AttributeSet的代理,AttributeSet内部发生的很多事件都会通过该组件告知外部。

GGA提供了代码生成器用于生成AttributeSet,并且你基本上不需要修改生成的AttributeSet,生成的AttributeSet会将内部事件通过GGA_AttributeSystemComponent告知外部,这样你就可以在蓝图/C++中进行属性处理。

如果你的AttributeSet不是GGA生成的,你也可以参考内置的AttributeSet,手动调用属性系统组件上的几个函数即可。

在AttributeSet外部(比如蓝图)处理属性变更,这种方式不仅可行,而且非常好用!我痛恨在AttributeSet里写一堆的逻辑。

到这里游戏属性系统了解更多信息,包括如何通过代码生成器生成属性集。

初始化游戏属性

当你已经定义/生成了AttributeSet代码,并通过AbilitySet将AttributeSet添加到AbilitySystemComponent后,你还需要为其初始化。

除了通过添加游戏效果来初始化属性以外,你还可以通过曲线表初始化属性。

准备曲线表

在引擎外部创建.csv结尾的文件,并确保你的表结构如下:

gga guide 15

你可以用任意文本编辑软件在外部编辑你的.csv曲线表,并将其导入到虚幻引擎中。我这里使用的是VSCode+“Edit CSV拓展”

其中行名使用此规则:“组名.属性集类名.属性名”。且确保等级从1开始

其中组名你还可以通过“->”符号来创建二级分类,比如:Main->Generic.AS_Health.Health 或者Test->Generic.AS_Health.Health。二级分类能允许你在曲线表中更轻松地对属性进行分类。

添加曲线表

将.csv文件直接拖拽进引擎ContentBrowser内即可导入。

gga guide 16

右键选择文件,点击CopyReference即可获取文件在引擎内路径,然后将其填入DefaultGame.ini中的如下部分:

在UE5.5及以上版本,你可以在项目设置中,通过图形化的方式添加曲线表。

gga guide 17

通过AbilitySystem组件初始化

你可以在GGA_AbilitySystemComponent上配置属性初始化组名以及等级。在InitializeAbilitySystem调用时会通过上面配置的曲线表对所有相关属性集进行初始化。

gga guide 18
GGA采用自定义的FGGA_AttributeGroupName结构体,会自动填充所有配置在AbilitySystemGlobals中的曲线表的行名,并智能地提取组名信息(通过“->”启用的二级分类是可选的。)。
属性初始化发生在DefaultAbilitySets应用后,所以请提前确保将所需的AttributeSet配置到DefaultAbilitySets中。

通过API初始化

你也可以通过蓝图节点调用如下函数进行初始化。

gga guide 18

响应和处理属性变化

通过属性系统组件事件

首先你要为角色挂载GGA_AttributeSystemComponent组件。

gga guide 20

其中,Payload包含了GameplayEffect执行流程中用到的所有数据。

通过属性系统组件内部

除此之外,你也可以新建一个蓝图继承自GGA_AttributeSystemComponent,并重写HandlePoseGameplayEffectExecute函数。如下图所示:

gga guide 21
Bouns: 你也可以将属性变更的事件交由外部系统处理,下图就是我将属性变更交由战斗系统处理的案例。
gga guide 21.5

通过异步节点

通常你可以在UI中使用如下节点去响应属性的变化。

gga guide 22
尽可能避免从UI的外部(比如Pawn)去更新UI上的数据,而是UI自己从外部获取相关的信息,并自行更新。
一个好的开发实践就是:不要让你的游戏逻辑和具体的UI表现捆绑在一起。