0. 개요
상위 스펠을 습득하기 위해 캐릭터의 레벨 뿐 아니라 하위 스펠, 즉 스펠 트리 상 하위 어빌리티의 레벨을 체크하게 한다.
1. 계열화
화염계열 마법을 예로, FireBlast 스펠을 배우기 위해, 일정 레벨 이상의 FireBolt를 요구하도록 수정할 것이다.
(1) 현 구조
지금은 ASC가 초기화 된 이후에 캐릭터가 레벨업 할 때마다 AuraCharacter의 AddToPlayerLevel 함수에서 스펠 트리 내의 어빌리티의 각 상태를 변경하고 있다.
void AAuraCharacter::AddToPlayerLevel_Implementation(int32 InLevel)
{
AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
check(AuraPlayerState);
AuraPlayerState->AddToLevel(InLevel);
if (UAuraAbilitySystemComponent* AuraASC = Cast<UAuraAbilitySystemComponent>(GetAbilitySystemComponent()))
{
AuraASC->UpdateAbilityStatus(AuraPlayerState->GetCharacterLevel());
}
}
그런데 하위 어빌리티의 레벨을 체크하도록 바꾸게 되면, 캐릭터 레벨은 충족하지만 하위 어빌리티 레벨에 미충족할 경우, 하위 어빌리티의 레벨을 올릴 때 어빌리티의 상태를 한 번 더 바꿔줄 필요가 있다.
즉, 스펠 메뉴 UI에서 레벨업 버튼을 누를 때, ASC의 UpdateAbilityStatus 함수를 호출하게 해야 한다.
(2) 어빌리티 정보 - AbilityInfo 수정
// 하위 어빌리티의 레벨 요구량 체크
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FGameplayTag RequireAbilityTag;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
int32 RequireAbilityLevel = 1;
어빌리티를 습득하기 위해 하위 어빌리티의 태그와 레벨을 이용한다.
(3) AuraASC의 어빌리티 상태 변경 함수 수정
void UAuraAbilitySystemComponent::UpdateAbilityStatus(int32 Level)
{
UAbilityInfo* AbilityInfo = UAuraAbilitySystemLibrary::GetAbilityInfo(GetAvatarActor());
for (const FAuraAbilityInfo& Info : AbilityInfo->AbilityInformation)
{
if (Info.AbilityTag.IsValid() == false)
continue;
// 레벨 요구량보다 레벨이 낮으면 넘김
if (Level < Info.LevelRequirement)
continue;
// 하위 스펠 습득 확인
if (FGameplayAbilitySpec* Spec = GetSpecFromAbilityTag(Info.RequireAbilityTag))
{
int32 RequireAbilityLevel = Info.RequireAbilityLevel;
int32 AbilityLevel = Spec->Level;
// 하위 스펠의 레벨 요구량보다 하위 스펠의 레벨이 낮으면 넘김
if (AbilityLevel < RequireAbilityLevel)
continue;
}
이제 어빌리티 정보가 하위 어빌리티의 태그를 가지고 있다면, 하위 어빌리티의 레벨을 비교하여 어빌리티를 습득하게 한다.
(4) SpellMenu의 SpendPoint 버튼을 누를 때 AuraASC의 UpdateAbilityStatus 함수 호출
스펠 메뉴의 위젯 컨트롤러 클래스를 살펴본다.
void USpellMenuWidgetController::SpendPointButtonPressed()
{
if (UAuraAbilitySystemComponent* AuraASC = GetAuraASC())
{
AuraASC->ServerSpendSpellPoint(SelectedAbility.Ability);
}
}
콜백 함수에서 AuraASC의 SpendSpellPoint 함수를 호출하고 있다.
UpdateAbilityStatus(AbilitySpec->Level);
// 클라이언트로 브로드캐스트
ClientUpdateAbilityStatus(AbilityTag, Status, AbilitySpec->Level);
MarkAbilitySpecDirty(*AbilitySpec);
}
}
이 함수에서 습득한 어빌리티에 어빌리티 상태 태그를 붙이는 작업 이후에 어빌리티 상태를 업데이트 하도록 한다.
(5) DA_AbilityInfo 수정

위의 FireBlast 어빌리티를 예로 들면 이 스펠을 배우기 위해서는 캐릭터 2레벨, FireBolt 스펠 3레벨이 필요하다.
상위 스펠이 하위 스펠에 종속적이게 설정하기 위해서는 반드시 하위 어빌리티의 태그인 Require Ability Tag를 설정해야 한다.
2. 스펠 설명 수정
(1) AuraGameplayAbility의 GetLockedDescription 함수 수정
static FString GetLockedDescription(int32 Level, int32 InferiorAbilityLevel = 0);
잠김 상태의 어빌리티 설명을 가져오는 함수의 매개 변수로 하위 어빌리티의 레벨을 받도록 수정한다.
(2) AuraASC의 GetDescriptionsByAbilityTag 함수 수정
// 어빌리티 상태 - 잠김(Locked)
UAbilityInfo* AbilityInfo = UAuraAbilitySystemLibrary::GetAbilityInfo(GetAvatarActor());
if (AbilityTag.IsValid() == false || AbilityTag.MatchesTagExact(FAuraGameplayTags::Get().Abilities_None))
{
OutDescription = FString();
}
else
{
// 이 어빌리티
FAuraAbilityInfo Info = AbilityInfo->FindAbilityInfoForTag(AbilityTag);
int32 CharacterLevelRequirement = Info.LevelRequirement;
// 이 어빌리티의 하위 어빌리티
int32 RequireInferiorAbilityLevel = Info.RequireInferiorAbilityLevel;
OutDescription = UAuraGameplayAbility::GetLockedDescription(CharacterLevelRequirement, RequireInferiorAbilityLevel);
}
(3) AuraGameplayAbility의 GetLockedDescription 함수 수정
FString UAuraGameplayAbility::GetLockedDescription(int32 Level, int32 InferiorAbilityLevel)
{
if (InferiorAbilityLevel > 0)
return FString::Printf(TEXT("<Default>캐릭터 레벨 </><Level>%d</><Default>부터 습득 가능.</>\n<Default>하위 스펠 레벨 </><Level>%d</><Default>부터 습득 가능.</>"), Level, InferiorAbilityLevel);
return FString::Printf(TEXT("<Default>캐릭터 레벨 </><Level>%d</><Default>부터 습득 가능.</>"), Level);
}
하위 스펠의 레벨 요구량이 0이 아닐 때 다른 설명을 출력하게 한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
| 31-12. 레벨 디자인 - 맵 이동 제어 - 레벨 블루프린트 (0) | 2025.05.20 |
|---|---|
| 31-11. MVC 모델 - 게임 오버 UI (0) | 2025.05.16 |
| 31-9. UI - 스펠 메뉴 - 마법 공격력 적용 데미지 출력하기 - 태그로 속성 값 가져오기 (0) | 2025.05.02 |
| 31-8. ExecCalc 계산식 수정 - 속성 재조정, 마법 공격력, 어빌리티 마법 공격력 계수 (0) | 2025.04.30 |
| 31-7. UI - 속성 메뉴 한글화 (0) | 2025.04.30 |
