【问题标题】:Unreal GAS: Influence of the GameplayEffect aggregator on gameplay attribute valuesUnreal GAS:GameplayEffect 聚合器对游戏属性值的影响
【发布时间】:2018-10-21 14:21:36
【问题描述】:

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

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

  1. 属性/GameplayEffect 聚合器FAggregator 是否影响游戏属性的基础值当前值 em> FGameplayAttributeData?
  2. attribute/GameplayEffect 聚合器的base valuefloat FAggregator::BaseValue 是否与gameplay 属性的base value 相关 float FGameplayAttributeData::BaseValue?

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

  • 所谓的游戏性修改器评估通道EGameplayModEvaluationChannel,在值评估期间顺序使用(通道0的结果作为基值传递给通道1等)
  • 在特定通道中存储修饰符(及其幅度、操作、标签和应用GameplayEffect的链接),这些通道定义了实际的数值评估

这些是用来评估的

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

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

为了通知其他类的评估(或对聚合器的更改),使用了两种方法

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

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

(遗憾的是,官方文档/源代码以及出色的 GAS: Comprehensive AnalysisGAS and you 并未阐明 GameplayEffect 聚合器。)

【问题讨论】:

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


    【解决方案1】:
    1. 属性/GameplayEffect 聚合器会影响游戏属性当前值
    2. 部分是的。它们在一个方向上相关:gameplay 属性 的基值用于设置attribute/GameplayEffect 聚合器 的基值,但反之则不然。 聚合器不会更改属性基值

    (1)的说明

    通过查看通知方法,我走上了正确的道路。事实上,两者结合在一起都在更新 gameplay 属性

    1. FActiveGameplayEffectsContainer::FindOrCreateAttributeAggregator()UAbilitySystemComponent::OnAttributeAggregatorDirty() 应用于 OnDirty 委托(该委托在聚合器按照问题中所述发生更改时执行)。
    2. OnAttributeAggregatorDirty() 调用 FActiveGameplayEffectsContainer::InternalUpdateNumericalAttribute(),后者调用
    3. UAbilitySystemComponent::SetNumericAttribute_Internal(),它调用
    4. FGameplayAttribute::SetNumericValueChecked()。这会设置游戏属性的当前值

    (2)的说明

    attribute/GameplayEffect 聚合器的基值仅使用 gameplay 属性基值FGameplayAttributeData::BaseValue 设置:

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

    gameplay 属性的基值设置如下:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多