0. 개요
스펠 메뉴의 각 어빌리티가 잠금 / 획득 가능 / 해금됨 등의 상태를 가지게 된다.
해당 상태에 따라 UI를 표시하고 어빌리티를 습득하게 한다.
1. 어빌리티 상태(Ability Status)
- 어빌리티 상태 : 각 어빌리티의 활성화 여부(잠금/획득 가능/해금됨)
- 어빌리티 상태 태그 : 각 어빌리티의 활성화 여부에 따르는 게임플레이 태그
- 어빌리티 타입 태그 : 각 어빌리티의 타입을 판단하는 게임플레이 태그(액티브/패시브/이외)
- 어빌리티 타입 태그의 Abilities.Type.None에 해당하는 것은 공격, 피격반응, 사망 등 액티브 스펠 또는 패시브 스펠이 아닌 것을 말한다.
2. 게임플레이 태그 추가
(1) 피격 반응, 어빌리티 상태, 어빌리티 타입
FGameplayTag Abilities_HitReact;
// 어빌리티 상태
FGameplayTag Abilities_Status_Locked;
FGameplayTag Abilities_Status_Eligible;
FGameplayTag Abilities_Status_Unlocked;
FGameplayTag Abilities_Status_Equipped;
// 어빌리티 타입
FGameplayTag Abilities_Type_Offensive;
FGameplayTag Abilities_Type_Passive;
FGameplayTag Abilities_Type_None;
GameplayTags.Abilities_HitReact = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.HitReact"),
FString("HitReact Ability")
);
/*
/ 어빌리티 상태
*/
GameplayTags.Abilities_Status_Locked = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Status.Locked"),
FString("Ability Status Locked")
);
GameplayTags.Abilities_Status_Eligible = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Status.Eligible"),
FString("Ability Status Eligible")
);
GameplayTags.Abilities_Status_Unlocked = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Status.UnLocked"),
FString("Ability Status UnLocked")
);
GameplayTags.Abilities_Status_Equipped = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Status.Equipped"),
FString("Ability Status Equipped")
);
/*
/ 어빌리티 타입
*/
GameplayTags.Abilities_Type_Offensive = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Type.Offensive"),
FString("Offensive Abilities")
);
GameplayTags.Abilities_Type_Passive = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Type.Passive"),
FString("Passive Abilities")
);
GameplayTags.Abilities_Type_None = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Type.None"),
FString("None Abilities")
);
(2) 어빌리티를 부여할때 어빌리티 상태 부여하기
각 캐릭터에 어빌리티를 부여하는 것은 어빌리티 시스템 컴포넌트(ASC)의 AddCharacterAbilities 함수에서 이루어지고 있다.
void UAuraAbilitySystemComponent::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
for (TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
{
// 게임플레이 어빌리티 스펙 생성
FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
// 어빌리티에 입력 태그를 부여
if (const UAuraGameplayAbility* AuraAbility = Cast<UAuraGameplayAbility>(AbilitySpec.Ability))
{
AbilitySpec.DynamicAbilityTags.AddTag(AuraAbility->StartupInputTag);
AbilitySpec.DynamicAbilityTags.AddTag(FAuraGameplayTags::Get().Abilities_Status_Equipped);
GiveAbility(AbilitySpec);
어빌리티에 입력 태그를 부여하며 장착됨 상태를 부여한다.
(2-1) 어빌리티의 상태를 가져오는 getter 함수
static FGameplayTag GetStatusFromSpec(const FGameplayAbilitySpec& AbilitySpec);
FGameplayTag UAuraAbilitySystemComponent::GetStatusFromSpec(const FGameplayAbilitySpec& AbilitySpec)
{
for (FGameplayTag Tag : AbilitySpec.DynamicAbilityTags)
{
if (Tag.MatchesTag(FGameplayTag::RequestGameplayTag(FName("Abilities.Status"))))
{
return Tag;
}
}
return FGameplayTag();
}
게임플레이 스펙을 순회하여 어빌리티 상태에 해당하는 태그를 찾는 Getter 함수이다.
(3) 어빌리티 상태 덧씌우기
어빌리티의 상태가 갱신되면 기존 어빌리티 상태의 게임플레이 태그를 덮어씌우는 작업이 필요하다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
22-10. 스펠 메뉴 UI - (10) 어빌리티 레벨 요구 사항, 새로운 전기(Lightning) 스펠, 스펠 메뉴에 어빌리티 상태 변경 (0) | 2025.02.05 |
---|---|
22-9. 스펠 메뉴 UI - (9) 스펠 트리에 어빌리티 표시하기 (0) | 2025.02.05 |
22-7. 스펠 메뉴 UI - (7) 스펠이 장착된 버튼 (0) | 2025.02.04 |
22-6. 스펠 메뉴 UI - (6) 스펠 메뉴 위젯 컨트롤러와 Getter, meta = DefaultToSelf (0) | 2025.01.23 |
22-5. 스펠 메뉴 UI - (5) 스펠 장착 버튼, 위젯 컨트롤러 리펙토링 (0) | 2025.01.23 |