在分析GameplayEffect修饰符和执行的生命周期期间,我偶然发现了属性聚合器或 GameplayEffect聚合器(这两个术语都在源代码中使用) )。这些用于评估修改后的属性值(它们由GameplayEffects修改)。
但是,我不明白这些聚合器如何影响实际的GameplayAbilitySystem属性,这些属性附加到参与者(作为AttributeSet的一部分):
FAggregator
是否会影响游戏属性的基本值或当前值 FGameplayAttributeData
?float FAggregator::BaseValue
的基本值与游戏的基本值相关吗属性 float FGameplayAttributeData::BaseValue
?属性/ GameplayEffect聚合器的重要组成部分是
EGameplayModEvaluationChannel
,它们在值评估期间顺序使用(通道0的结果作为基值传递到通道1等)用于评估
(它们都是函数的返回值,而不是聚合器的成员变量)
要向其他类别通知评估(或对聚合器进行更改),使用了两种方法
FOnAggregatorDirty
被广播,其中包含对聚合器的引用FActiveGameplayEffectsContainer::UpdateAggregatorModMagnitudes()
将更改更改为受影响的属性(通过FAggregator
) (在FindOrCreateAttributeAggregator()
中通过属性{1}}(由FAggregator::UpdateAggregatorMod()
确定或设置)我不知道这些通知方法中的一种或两种如何更新实际属性值。
(不幸的是,官方文档/源代码以及出色的GAS: Comprehensive Analysis和GAS and you并未揭示GameplayEffect聚合器。)
答案 0 :(得分:0)
通过查看通知方法,我处在正确的轨道上。实际上,二者都在更新游戏属性 :
FActiveGameplayEffectsContainer::FindOrCreateAttributeAggregator()
将UAbilitySystemComponent::OnAttributeAggregatorDirty()
应用于OnDirty
委托(当聚合器按问题中的说明更改时,将执行委托。)OnAttributeAggregatorDirty()
呼叫FActiveGameplayEffectsContainer::InternalUpdateNumericalAttribute()
,该呼叫UAbilitySystemComponent::SetNumericAttribute_Internal()
,它会调用FGameplayAttribute::SetNumericValueChecked()
。设置游戏属性的当前值。 属性/ GameplayEffect聚合器的基本值仅在以下位置使用 gameplay属性的基本值FGameplayAttributeData::BaseValue
设置:
FActiveGameplayEffectsContainer::OnAttributeAggregatorDirty()
FActiveGameplayEffectsContainer::SetAttributeBaseValue()
游戏设置属性的基本值是通过以下方式设置的:
UAttributeSet::InitFromMetaDataTable()
FActiveGameplayEffectsContainer::SetAttributeBaseValue()
在这两个函数中,属性基值与聚合器的基值无关。