0. 개요
기존의 스펠 메뉴 내의 스펠 설명에는 스펠의 기본 데미지만 가져와 표시하도록 되어 있었다.
이제 마법 공격력이 도입되었으므로 마법 공격력이 추가된 스펠의 데미지를 표시하도록 설정한다.
1. 태그를 이용하여 속성 값 가져오기
(1) AuraAbilitySystemLibrary에서 속성 값 가져오는 함수 선언
// 속성 값 가져오기
UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|GameplayMechanics")
static float GetAttributeValue(const UObject* WorldContextObject, const FGameplayTag& AttributeTag);
WorldContextObject로 부터 0번 컨트롤러를 가져와 속성에 접근할 것이다.
- 이렇게 접근하는 이유
스펠 메뉴 내의 각 스펠은 ASC와 속성 세트(Attribute Set), ActorInfo가 Null인 상태이다.
따라서 this, GetAvatarActorFromActorInfo 등을 사용할 수 없다.
float UAuraAbilitySystemLibrary::GetAttributeValue(const UObject* WorldContextObject, const FGameplayTag& AttributeTag)
{
float Value = 0.f;
if (APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0))
{
// PS, ASC, AS 가져오기
AAuraPlayerState* AuraPS = PC->GetPlayerState<AAuraPlayerState>();
if (AuraPS == nullptr)
return Value;
UAuraAbilitySystemComponent* AuraASC = Cast<UAuraAbilitySystemComponent>(AuraPS->GetAbilitySystemComponent());
UAuraAttributeSet* AuraAttributeSet = Cast<UAuraAttributeSet>(AuraPS->GetAttributeSet());
if (AuraASC && AuraAttributeSet)
{
if (AuraAttributeSet && AuraAttributeSet->TagsToAttributes.Contains(AttributeTag))
{
FGameplayAttribute Attribute = AuraAttributeSet->TagsToAttributes[AttributeTag]();
Value = AuraASC->GetNumericAttributeChecked(Attribute);
}
}
}
return Value;
}
플레이어 컨트롤러를 통해 플레이어 상태를 가져온다.
플레이어 상태를 이용하여 ASC와 속성 세트에 접근한다.
Aura Attribute Set에는 태그와 속성을 연결하는 맵인 TagsToAttributes가 있으므로 해당 맵을 이용해 속성을 꺼내오고, 속성으로부터 값을 추출한다.
(2) AuraGameplayAbility의 스펠 설명 얻기 함수 수정
virtual FString GetDescription(int32 Level, const UObject* WorldContextObject);
virtual FString GetNextLevelDescription(int32 Level, const UObject* WorldContextObject);
이 함수들이 이제 WorldContextObject를 사용하도록 수정한다.
(3) AuraASC의 태그를 이용하여 설명 가져오기 함수 수정
bool UAuraAbilitySystemComponent::GetDescriptionsByAbilityTag(const FGameplayTag& AbilityTag, FString& OutDescription, FString& OutNextLevelDescription)
{
// 어빌리티 상태 - 해금 가능(Eligible), 해금(Unlocked), 장착(Equipped)
if (const FGameplayAbilitySpec* AbilitySpec = GetSpecFromAbilityTag(AbilityTag))
{
if (UAuraGameplayAbility* AuraAbility = Cast<UAuraGameplayAbility>(AbilitySpec->Ability))
{
OutDescription = AuraAbility->GetDescription(AbilitySpec->Level, this);
OutNextLevelDescription = AuraAbility->GetNextLevelDescription(AbilitySpec->Level + 1, this);
return true;
}
}
각 설명들이 Aura ASC를 WorldContextObject로 넘기도록 수정한다.
(4) 모든 어빌리티의 설명 함수 수정
이제 모든 어빌리티에 대해 설명 함수가 WorldContextObject를 넘겨받도록 수정하고 그를 이용하여 마법 공격력을 가져오게 한다.
FString UArcaneShards::GetDescription(int32 Level, const UObject* WorldContextObject)
{
const int32 ScaledDamage = Damage.GetValueAtLevel(Level);
const float ManaCost = FMath::Abs(GetManaCost(Level));
const float Cooldown = GetCoolDown(Level);
float MagicAttackPower = UAuraAbilitySystemLibrary::GetAttributeValue(WorldContextObject, FAuraGameplayTags::Get().Attributes_Secondary_MagicAttackPower);
const int32 MagicPowerDamage = MagicAttackPower * MagicPowerCoefficient.GetValue();
return FString::Printf(TEXT(
"<Title>아케인 파편</>\n<Small>레벨 </><Level>%d</>\n<Small>마나 </><ManaCost>%.1f</>\n<Small>쿨타임 </><Cooldown>%.1f</>\n<Default>지정한 범위 중심에 최대 </><Damage>%d</><Default>의 피해를 입히는 아케인 파편 기둥을 %d개 소환합니다. 데미지는 대상과 각 기둥 사이의 거리에 비례합니다.</>"),
Level,
ManaCost,
Cooldown,
ScaledDamage + MagicPowerDamage,
Level
);
}
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
31-11. MVC 모델 - 게임 오버 UI (0) | 2025.05.16 |
---|---|
31-10. 스펠 계열화 (0) | 2025.05.13 |
31-8. ExecCalc 계산식 수정 - 속성 재조정, 마법 공격력, 어빌리티 마법 공격력 계수 (0) | 2025.04.30 |
31-7. UI - 속성 메뉴 한글화 (0) | 2025.04.30 |
31-6. 캐릭터에 체력/마나 재생 적용 (0) | 2025.04.30 |