PreAttributeChange

// AuraAttributeSet.h
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
// AuraAttributeSet.cpp
void UAuraAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
Super::PreAttributeBaseChange(Attribute, NewValue);
if (Attribute == GetHealthAttribute())
{
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxHealth());
}
if (Attribute == GetManaAttribute())
{
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxMana());
}
}
PostGameplayEffectExecute
// AuraAttributeSet.h
virtual void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override;
// AuraAttributeSet.cpp
void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
Super::PostGameplayEffectExecute(Data);
FEffectProperties EffectProperties;
SetEffectProperties(Data, EffectProperties);
}
void UAuraAttributeSet::SetEffectProperties(const FGameplayEffectModCallbackData& Data, FEffectProperties& OutEffectProperties) const
{
OutEffectProperties.EffectContextHandle = Data.EffectSpec.GetContext();
OutEffectProperties.SourceASC = OutEffectProperties.EffectContextHandle.GetOriginalInstigatorAbilitySystemComponent();
if (IsValid(OutEffectProperties.SourceASC) && OutEffectProperties.SourceASC->AbilityActorInfo.IsValid() && OutEffectProperties.SourceASC->AbilityActorInfo->AvatarActor.IsValid())
{
OutEffectProperties.SourceAvatarActor = OutEffectProperties.SourceASC->AbilityActorInfo->AvatarActor.Get();
OutEffectProperties.SourceController = OutEffectProperties.SourceASC->AbilityActorInfo->PlayerController.Get();
if (OutEffectProperties.SourceController == nullptr && OutEffectProperties.SourceAvatarActor != nullptr)
{
if (const APawn* Pawn = Cast<APawn>(OutEffectProperties.SourceAvatarActor))
{
OutEffectProperties.SourceController = Pawn->GetController();
}
}
if (OutEffectProperties.SourceController)
{
OutEffectProperties.SourceCharacter = Cast<ACharacter>(OutEffectProperties.SourceController->GetPawn());
}
}
if (Data.Target.AbilityActorInfo.IsValid() && Data.Target.AbilityActorInfo->AvatarActor.IsValid())
{
OutEffectProperties.TargetAvatarActor = Data.Target.AbilityActorInfo->AvatarActor.Get();
OutEffectProperties.TargetController = Data.Target.AbilityActorInfo->PlayerController.Get();
OutEffectProperties.TargetCharacter = Cast<ACharacter>(OutEffectProperties.TargetAvatarActor);
OutEffectProperties.TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OutEffectProperties.TargetAvatarActor);
}
}
// FEffectProperties (AuraAttributeSet.h에 선언됨)
USTRUCT()
struct FEffectProperties
{
GENERATED_BODY()
FEffectProperties() {}
// Effect Context Handle
FGameplayEffectContextHandle EffectContextHandle;
// Source Info
UPROPERTY()
UAbilitySystemComponent* SourceASC = nullptr;
UPROPERTY()
AActor* SourceAvatarActor = nullptr;
UPROPERTY()
AController* SourceController = nullptr;
UPROPERTY()
ACharacter* SourceCharacter = nullptr;
// Target Info
UPROPERTY()
UAbilitySystemComponent* TargetASC = nullptr;
UPROPERTY()
AActor* TargetAvatarActor = nullptr;
UPROPERTY()
AController* TargetController = nullptr;
UPROPERTY()
ACharacter* TargetCharacter = nullptr;
};Curve Table
```cpp
// ActorLevel이 레벨을 나타내는 매개변수임.
const FGameplayEffectSpecHandle EffectSpecHandle
= TargetASC->MakeOutgoingSpec(GameplayEffectClass, ActorLevel, EffectContextHandle);
```