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结尾的文件,并确保你的表结构如下:

你可以用任意文本编辑软件在外部编辑你的.csv曲线表,并将其导入到虚幻引擎中。我这里使用的是VSCode+“Edit CSV拓展”
其中行名使用此规则:“组名.属性集类名.属性名”。且确保等级从1开始。
其中组名你还可以通过“->”符号来创建二级分类,比如:Main->Generic.AS_Health.Health 或者Test->Generic.AS_Health.Health。二级分类能允许你在曲线表中更轻松地对属性进行分类。
添加曲线表
将.csv文件直接拖拽进引擎ContentBrowser内即可导入。

右键选择文件,点击CopyReference即可获取文件在引擎内路径,然后将其填入DefaultGame.ini中的如下部分:
在UE5.5及以上版本,你可以在项目设置中,通过图形化的方式添加曲线表。

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

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

响应和处理属性变化
通过属性系统组件事件
首先你要为角色挂载GGA_AttributeSystemComponent
组件。

其中,Payload包含了GameplayEffect执行流程中用到的所有数据。
通过属性系统组件内部
除此之外,你也可以新建一个蓝图继承自GGA_AttributeSystemComponent,并重写HandlePoseGameplayEffectExecute函数。如下图所示:

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

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

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