Unreal GAS: влияние агрегатора GameplayEffect на значения атрибутов игрового процесса - PullRequest
0 голосов
/ 21 октября 2018

Во время анализа времени жизни GameplayEffect модификатора и выполнения я наткнулся на агрегаторов атрибутов или GameplayEffect агрегаторов (оба термина используются в исходном коде).Они используются для оценки измененных значений атрибутов (они изменяются с помощью GameplayEffects).

Однако я не понимаю, как эти агрегаторы влияют на фактические атрибуты GameplayAbilitySystem, которые присоединены (как часть AttributeSet) к актеру:

  1. Влияет ли атрибут / агрегатор GameplayEffect FAggregator на базовое значение или текущее значение атрибут игрового процесса FGameplayAttributeData?
  2. Является ли базовое значение атрибута / агрегат GameplayEffect float FAggregator::BaseValue, связанным с базовым значением атрибута игрового процесса float FGameplayAttributeData::BaseValue?

Важными компонентами атрибута / агрегаторов GameplayEffect являются

  • так называемые каналы оценки модификатора игрового процесса EGameplayModEvaluationChannel, которые используются последовательно во время оценки значения (результат channel0 передается как базовое значение в channel1 и т. д.)
  • сохранение модификаторов (с его величиной, операцией, тегами и ссылкой на применение GameplayEffect ) в определенных каналах, которые определяют фактическую числовую оценку

Они используются для оценки

  • a конечное значение
  • a базовое значение путем оценки конечного значения в обратном порядке, пытаясь определить базовое значение из модификаторов (устаревший b / c GAS теперь имеет атрибуты на основе структуры - согласно документации)
  • a бонусное значение (конечное значение - базовое значение)

(все они являются просто возвращаемыми значениями функций и не являются переменными-членами агрегатора)

Для уведомления других классов об оценке (или изменениях агрегатора) используются два метода

  1. передается делегат FOnAggregatorDirty, содержащий ссылку на агрегатор
  2. каждые GameplayEffect , зарегистрированный в AbilitySystemComponent , вверхдатирует изменение соответствующих атрибутов (с помощью FActiveGameplayEffectsContainer::UpdateAggregatorModMagnitudes()), обновляя агрегатор FAggregator для атрибута (который определяется или устанавливается с помощью FindOrCreateAttributeAggregator()) в FAggregator::UpdateAggregatorMod())

Я не вижу, как один или оба из этих методов уведомления обновляют фактические значения атрибутов.

(Официальная документация / исходный код, а также превосходный ГАЗ: комплексный анализ и GAS и вы , к сожалению, не проливают свет на агрегаторы GameplayEffect.)

1 Ответ

0 голосов
/ 21 октября 2018
  1. Атрибут / агрегатор GameplayEffect влияет на текущее значение атрибута геймплея .
  2. Частично да.Они связаны в одном направлении: базовое значение атрибута игрового процесса используется для установки базового значения атрибута / агрегатора GameplayEffect , но не наоборот. Агрегатор не изменяет базовое значение атрибута .

Пояснение к (1)

Я был на правильном пути, посмотрев на методы уведомления.Фактически, оба вместе обновляют атрибут игрового процесса :

  1. FActiveGameplayEffectsContainer::FindOrCreateAttributeAggregator() применяет UAbilitySystemComponent::OnAttributeAggregatorDirty() к делегату OnDirty (этот делегат выполняется, когда агрегатор изменяется какнаписано в вопросе).
  2. OnAttributeAggregatorDirty() звонит FActiveGameplayEffectsContainer::InternalUpdateNumericalAttribute(), что звонит
  3. UAbilitySystemComponent::SetNumericAttribute_Internal(), звонит
  4. FGameplayAttribute::SetNumericValueChecked().Это устанавливает текущее значение атрибута игрового процесса.

Объяснение для (2)

Базовое значение атрибута / агрегатора GameplayEffect устанавливается только с использованием атрибута игрового процесса базовое значение FGameplayAttributeData::BaseValue в:

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

Базовое значение атрибута игрового процесса устанавливается с помощью:

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

В обоихфункции, базовое значение атрибута не имеет отношения к базовому значению агрегатора.

...