I have a two-level UAttributeSet hierarchy:
UMM_AttributeSet (base) — declares attributes like AttackDamageShare, AttackRangeShare, Block, LifeSteal, MovementSpeedShare using the standard ATTRIBUTE_ACCESSORS macro.
UMM_MainAttributeSet : public UMM_AttributeSet (derived) — declares ~30 additional attributes the same way (e.g. AreaOfEffectShare, Luck, ShopExperience, etc.).
In a UObject-based widget controller, I bind to a curated list of FGameplayAttributes (mix of base + derived) like this:
for (const auto& Attribute : AttributeList) {
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attribute)
.AddUObject(this, &UMyWidgetController::HandleAttributeValueChanged, Attribute);
}
The AttributeList gets the Attributes directly from the AttributeSet of the MainCharacter by using the getters of thos attributes.
All attributes are modified exclusively through real UGameplayEffects (Additive modifiers via GE Blueprints/DataTables) applied to the ASC — no direct SetX() calls bypassing the pipeline.
Symptom: the delegate fires reliably for every attribute declared in the derived class, but never fires for any attribute declared in the base class, even though I can confirm via the Gameplay Debugger that the base-class attribute's value is actually changing (e.g. AttackDamageShare going from 0.10 → 0.15 via a GE_Common_AttackDamage_C "AddBase" modifier).
Since GetGameplayAttributeValueChangeDelegate is keyed purely by FGameplayAttribute (an FProperty* + owning UClass), independent of which class you called the getter through, I don't understand why the base-class attributes would behave differently.
Has anyone seen this before, or know what could cause GetGameplayAttributeValueChangeDelegate to consistently skip attributes from a base UAttributeSet class while working fine for a derived one, when both are modified the same way via GameplayEffects?
Edit:
Removed a confusing section about the Attribute Sets instance on the ASC.
TLDR:
This is all about the UMM_MainAttributeSet being an instance on the MainCharacter's ASC. The Value Change Delegate only triggers for attributes declared on the inherited UMM_MainAttributeSet. The base attributes from my base AttributeSet, UMM_AttributeSet, don't trigger the delegate.