【发布时间】:2018-10-21 14:21:36
【问题描述】:
在分析 GameplayEffect 修饰符和执行的生命周期期间,我偶然发现了 属性聚合器 或 GameplayEffect 聚合器(这两个术语都在源代码中使用)。这些用于评估修改后的属性值(它们由 GameplayEffects 修改)。
但是,我不明白这些聚合器如何影响附加(作为 AttributeSet 的一部分)到 actor 的实际 GameplayAbilitySystem 属性:
-
属性/GameplayEffect 聚合器
FAggregator是否影响游戏属性的基础值或当前值 em>FGameplayAttributeData? -
attribute/GameplayEffect 聚合器的base value
float FAggregator::BaseValue是否与gameplay 属性的base value 相关float FGameplayAttributeData::BaseValue?
属性/GameplayEffect 聚合器的重要组成部分是
- 所谓的游戏性修改器评估通道
EGameplayModEvaluationChannel,在值评估期间顺序使用(通道0的结果作为基值传递给通道1等) - 在特定通道中存储修饰符(及其幅度、操作、标签和应用GameplayEffect的链接),这些通道定义了实际的数值评估
这些是用来评估的
- 一个最终值
- a base value 通过反向评估最终值,尝试从修饰符中确定 base value(已弃用的 b/c GAS 现在具有基于结构的属性 -根据文档)
- 奖励价值(最终价值 - 基础价值)
(都是函数的返回值,不是聚合器的成员变量)
为了通知其他类的评估(或对聚合器的更改),使用了两种方法
-
a delegate
FOnAggregatorDirty被广播,其中包含对聚合器的引用 - 每个 GameplayEffect,在 AbilitySystemComponent 中注册,通过更新聚合器
FAggregator来更新对其受影响属性的更改(通过FActiveGameplayEffectsContainer::UpdateAggregatorModMagnitudes())对于FAggregator::UpdateAggregatorMod()中的属性(通过FindOrCreateAttributeAggregator()确定或设置)
我不知道这些通知方法中的一种或两种如何更新实际属性值。
(遗憾的是,官方文档/源代码以及出色的 GAS: Comprehensive Analysis 和 GAS and you 并未阐明 GameplayEffect 聚合器。)
【问题讨论】:
标签: unreal-engine4 unreal-gameplay-ability-system