0. 개요
로그 라이크 시스템을 도입한 이후, 게임플레이 어빌리티의 각 멤버 변수를 수정할 수 있도록 변경한다.

1. 게임플레이 어빌리티 수정
(1) AuraGameplayAbility에서 함수 선언
public:
UFUNCTION(BlueprintCallable)
virtual bool CheckAbilityUpgrades(FGameplayTag AbilityTag) { return false; }
UFUNCTION(BlueprintCallable)
static TArray<FAuraAbilityUpgradeInfo> GetAbilityUpgradeForTag(AActor* AvatarActor, FGameplayTag AbilityTag);
UFUNCTION(BlueprintPure, Category = "GameplayAbility|Upgrades")
static bool HasUpgradeTag(AActor* AvatarActor, FGameplayTag Tag);
UFUNCTION(BlueprintPure, Category = "GameplayAbility|Upgrades")
static int32 GetUpgradeStackCount(AActor* AvatarActor, FGameplayTag Tag);
(1-1) 업그레이드 태그 검증 함수
각 어빌리티에서 태그를 검증하도록 하기 위해 가상 함수를 선언한다.
(1-2) 태그를 이용해 업그레이드 정보를 가져오는 함수
TArray<FAuraAbilityUpgradeInfo> UAuraGameplayAbility::GetAbilityUpgradeForTag(AActor* AvatarActor, FGameplayTag AbilityTag)
{
auto* AllUpgradeInfos = UAuraAbilitySystemLibrary::GetAbilityUpgradeInfo(AvatarActor);
if (AllUpgradeInfos == nullptr)
return TArray<FAuraAbilityUpgradeInfo>();
auto UpgradeArray = AllUpgradeInfos->GetUpgradesForAbility(AbilityTag);
TArray<FAuraAbilityUpgradeInfo> AbilityUpgradeInfos = UpgradeArray.UpgradeInfos;
if (AbilityUpgradeInfos.IsEmpty())
return TArray<FAuraAbilityUpgradeInfo>();
return AbilityUpgradeInfos;
}
업그레이드 정보에서 어빌리티 태그와 맞는 정보들을 가져와 내보낸다.
(1-3) 업그레이드 태그를 보유하고 있는지 검증하는 함수
bool UAuraGameplayAbility::HasUpgradeTag(AActor* AvatarActor, FGameplayTag Tag)
{
if (!AvatarActor)
return false;
UAbilitySystemComponent* ASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(AvatarActor);
if (!ASC)
return false;
return ASC->HasMatchingGameplayTag(Tag);
}
플레이어 캐릭터의 ASC에 해당하는 태그가 있는지 검증한다.
(1-4) 태그 중첩 갯수를 반환하는 함수
int32 UAuraGameplayAbility::GetUpgradeStackCount(AActor* AvatarActor,FGameplayTag Tag)
{
if (!Tag.IsValid() || !AvatarActor)
return 0;
UAbilitySystemComponent* ASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(AvatarActor);
if (ASC)
return ASC->GetTagCount(Tag);
return 0;
}
(2) 파이어볼트의 멤버 변수 수정
protected:
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
int32 NumProjectiles = 1;
업그레이드 중 하나로 파이어볼트의 투사체 갯수를 증가시키는 업그레이드가 있다.
게임플레이 어빌리티 블루프린트의 이벤트 그래프 로직에 따르면 기존에는 레벨에 따라 투사체의 갯수가 상승하도록 되어있었으나, 업그레이드를 통해서도 투사체의 갯수를 증가시킬 수 있도록 하기 위해 수정이 필요하다.
(3) 어빌리티 업그레이드 검증 함수 오버라이드
virtual bool CheckAbilityUpgrades(FGameplayTag AbilityTag) override;
bool UAuraFirebolt::CheckAbilityUpgrades(FGameplayTag AbilityTag)
{
bool bUpgradesApplied = false;
TArray<FAuraAbilityUpgradeInfo> Upgrades = GetAbilityUpgradeForTag(GetAvatarActorFromActorInfo(), AbilityTag);
if (Upgrades.IsEmpty())
return false;
const auto& Tags = FAuraGameplayTags::Get();
for (const auto& Upgrade : Upgrades)
{
// 업그레이드 태그 검증
if (HasUpgradeTag(GetAvatarActorFromActorInfo(), Tags.Upgrades_Fire_FireBolt_IncreaseNum))
{
// 투사체 갯수 증가
int32 StackCount = GetUpgradeStackCount(GetAvatarActorFromActorInfo(), Upgrade.UpgradeEffectTag);
NumProjectiles += StackCount;
bUpgradesApplied = true;
}
}
return bUpgradesApplied;
}
업그레이드 태그를 검증하여 존재하다면 업그레이드 로직을 적용하는 코드를 작성한다.
(4) 파이어볼트 어빌리티의 투사체 소환 함수 수정
void UAuraFirebolt::SpawnProjectiles(const FVector& ProjectileTargetLocation, const FGameplayTag& SocketTag, bool bOverridePitch, float PitchOverride, AActor* HomingTarget)
{
// 서버 상에 있는지 확인
const bool bIsServer = GetAvatarActorFromActorInfo()->HasAuthority();
if (!bIsServer)
return;
// 무기의 소켓 위치 가져오기
const FVector SocketLocation = ICombatInterface::Execute_GetCombatSocketLocation(
GetAvatarActorFromActorInfo(),
SocketTag);
// 피치 오버라이드
FRotator Rotation = (ProjectileTargetLocation - SocketLocation).Rotation();
if (bOverridePitch)
Rotation.Pitch = PitchOverride;
/*
* 다수의 투사체 퍼트리기
*/
const FVector Forward = Rotation.Vector();
const int32 EffectiveNumProjectiles = FMath::Min(MaxNumProjectiles, NumProjectiles);
이제 EffectiveNumProjectiles 변수는 레벨과 NumProjectiles를 비교하지 않고, 최대치와 NumProjectiles를 비교하게 한다.
(5) 파이어볼트 어빌리티 블루프린트 수정

어빌리티 발동 초기에 업그레이드 태그를 검증하고 적용하는 노드를 배치한다.
이와 같은 방식으로 텔레포트와 아케인 파편 스펠도 수정한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
| 32-7. 로그 라이크 - (3) 게임플레이 어빌리티 - (3) PlayerState에서 업그레이드 태그 관리 (0) | 2025.06.10 |
|---|---|
| 32-6. 로그 라이크 - (2) MVVM - (3) 뷰에 뷰 모델 바인딩 이후에 특정 함수 호출하기 (0) | 2025.06.09 |
| 32-4. 로그 라이크 - (2) MVVM - (2) 뷰 생성 및 초기화, UI와 게임 연동 (0) | 2025.06.09 |
| 32-3. 로그 라이크 - (2) MVVM - (1) 업그레이드 카드, 카드 선택 UI (0) | 2025.06.09 |
| 32-2. 로그 라이크 - (1) 데이터 에셋 - (2) 데이터 에셋 블루프린트 생성 및 사용 (0) | 2025.06.09 |
