虚幻GAS:GameplayEffect聚合器对游戏属性值的影响

时间:2018-10-21 14:21:37

标签: unreal-engine4 unreal-gameplay-ability-system

在分析GameplayEffect修饰符和执行的生命周期期间,我偶然发现了属性聚合器 GameplayEffect聚合器(这两个术语都在源代码中使用) )。这些用于评估修改后的属性值(它们由GameplayEffects修改)。

但是,我不明白这些聚合器如何影响实际的GameplayAbilitySystem属性,这些属性附加到参与者(作为AttributeSet的一部分):

  1. 属性/游戏效果聚合器 FAggregator是否会影响游戏属性的基本值当前值 FGameplayAttributeData
  2. 属性/ GameplayEffect聚合器 float FAggregator::BaseValue基本值游戏的基本值相关吗属性 float FGameplayAttributeData::BaseValue

属性/ GameplayEffect聚合器的重要组成部分是

  • 所谓的游戏修饰符评估通道 EGameplayModEvaluationChannel,它们在值评估期间顺序使用(通道0的结果作为基值传递到通道1等)
  • 在某些渠道中
  • 存储修饰符(及其大小,操作,标签以及与应用 GameplayEffect 的链接),这些通道定义了实际的数字评估

用于评估

  • 一个最终值
  • 通过反向评估最终值来
  • 一个基本值,尝试通过修饰符确定基本值(已弃用的b / c GAS现在具有基于结构的属性-根据文档)
  • 奖励价值(最终价值-基础价值)

(它们都是函数的返回值,而不是聚合器的成员变量)

要向其他类别通知评估(或对聚合器进行更改),使用了两种方法

  1. a delegate FOnAggregatorDirty被广播,其中包含对聚合器的引用
  2. AbilitySystemComponent 中注册的
  3. 每个 GameplayEffect ,都通过更新聚合器{,通过FActiveGameplayEffectsContainer::UpdateAggregatorModMagnitudes()将更改更改为受影响的属性(通过FAggregator) (在FindOrCreateAttributeAggregator()中通过属性{1}}(由FAggregator::UpdateAggregatorMod()确定或设置)

我不知道这些通知方法中的一种或两种如何更新实际属性值。

(不幸的是,官方文档/源代码以及出色的GAS: Comprehensive AnalysisGAS and you并未揭示GameplayEffect聚合器。)

1 个答案:

答案 0 :(得分:0)

  1. 属性/游戏玩法效果聚合器影响游戏玩法属性当前值
  2. 部分可以。它们在一个方向上相关:游戏属性 的基本值用于设置 attribute / GameplayEffect聚合器的基本值,反之则不然。 聚合器不会更改属性基值

(1)的解释

通过查看通知方法,我处在正确的轨道上。实际上,二者都在更新游戏属性

  1. FActiveGameplayEffectsContainer::FindOrCreateAttributeAggregator()UAbilitySystemComponent::OnAttributeAggregatorDirty()应用于OnDirty委托(当聚合器按问题中的说明更改时,将执行委托。)
  2. OnAttributeAggregatorDirty()呼叫FActiveGameplayEffectsContainer::InternalUpdateNumericalAttribute(),该呼叫
  3. UAbilitySystemComponent::SetNumericAttribute_Internal(),它会调用
  4. FGameplayAttribute::SetNumericValueChecked()。设置游戏属性的当前值

(2)的解释

属性/ GameplayEffect聚合器的基本值仅在以下位置使用 gameplay属性的基本值FGameplayAttributeData::BaseValue设置:

  • FActiveGameplayEffectsContainer::OnAttributeAggregatorDirty()
  • FActiveGameplayEffectsContainer::SetAttributeBaseValue()

游戏设置属性的基本值是通过以下方式设置的:

  • UAttributeSet::InitFromMetaDataTable()
  • FActiveGameplayEffectsContainer::SetAttributeBaseValue()

在这两个函数中,属性基值与聚​​合器的基值无关。