Во время анализа времени жизни GameplayEffect модификатора и выполнения я наткнулся на агрегаторов атрибутов или GameplayEffect агрегаторов (оба термина используются в исходном коде).Они используются для оценки измененных значений атрибутов (они изменяются с помощью GameplayEffects).
Однако я не понимаю, как эти агрегаторы влияют на фактические атрибуты GameplayAbilitySystem, которые присоединены (как часть AttributeSet) к актеру:
- Влияет ли атрибут / агрегатор GameplayEffect
FAggregator
на базовое значение или текущее значение атрибут игрового процесса FGameplayAttributeData
? - Является ли базовое значение атрибута / агрегат GameplayEffect
float FAggregator::BaseValue
, связанным с базовым значением атрибута игрового процесса float FGameplayAttributeData::BaseValue
?
Важными компонентами атрибута / агрегаторов GameplayEffect являются
- так называемые каналы оценки модификатора игрового процесса
EGameplayModEvaluationChannel
, которые используются последовательно во время оценки значения (результат channel0 передается как базовое значение в channel1 и т. д.) - сохранение модификаторов (с его величиной, операцией, тегами и ссылкой на применение GameplayEffect ) в определенных каналах, которые определяют фактическую числовую оценку
Они используются для оценки
- a конечное значение
- a базовое значение путем оценки конечного значения в обратном порядке, пытаясь определить базовое значение из модификаторов (устаревший b / c GAS теперь имеет атрибуты на основе структуры - согласно документации)
- a бонусное значение (конечное значение - базовое значение)
(все они являются просто возвращаемыми значениями функций и не являются переменными-членами агрегатора)
Для уведомления других классов об оценке (или изменениях агрегатора) используются два метода
- передается делегат
FOnAggregatorDirty
, содержащий ссылку на агрегатор - каждые GameplayEffect , зарегистрированный в AbilitySystemComponent , вверхдатирует изменение соответствующих атрибутов (с помощью
FActiveGameplayEffectsContainer::UpdateAggregatorModMagnitudes()
), обновляя агрегатор FAggregator
для атрибута (который определяется или устанавливается с помощью FindOrCreateAttributeAggregator()
) в FAggregator::UpdateAggregatorMod()
)
Я не вижу, как один или оба из этих методов уведомления обновляют фактические значения атрибутов.
(Официальная документация / исходный код, а также превосходный ГАЗ: комплексный анализ и GAS и вы , к сожалению, не проливают свет на агрегаторы GameplayEffect.)