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) 어빌리티 상태 덧씌우기

어빌리티의 상태가 갱신되면 기존 어빌리티 상태의 게임플레이 태그를 덮어씌우는 작업이 필요하다.