0. 개요

이전 포스트에서 캐릭터에 부여된 어빌리티에 태그를 설정했다.

이제 태그를 이용하여 버튼의 눌림 상태에 따라 어빌리티를 활성화/취소 시키는 방법을 알아본다.

 

 

1. 시작 어빌리티에 태그 부여하기

(1) 시작 어빌리티에 대응하는 태그 정의 - AuraGameplayAbility

public:
	// 시작 어빌리티 일 경우 부여할 때 한 번만 확인하기
	UPROPERTY(EditDefaultsOnly, Category="Input")
	FGameplayTag StartupInputTag;
};

시작에 부여되는 어빌리티에 태그를 부여할 것이다.

 

 

(2) 시작 어빌리티에 태그 부여 - AuraASC의 AddCharacterAbilites 함수

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);
            GiveAbility(AbilitySpec);
        }
    }
}

기존에 초기 어빌리티를 가져와서 한 번 활성화하던 함수를 수정하여

커스텀 게임플레이 어빌리티에서 초기 입력 태그를 가져와 어빌리티에 추가하도록 한다.

 

 

2. 버튼 누름 상태에 따른 능력 제어하기

(1) AuraAbilitySystemComponent를 변수로 저장하기 - AuraPlayerController

	UPROPERTY()
	TObjectPtr<UAuraAbilitySystemComponent> AuraAbilitySystemComponent;

	UAuraAbilitySystemComponent* GetASC();
};
UAuraAbilitySystemComponent* AAuraPlayerController::GetASC()
{
    if (AuraAbilitySystemComponent == nullptr)
    {
        AuraAbilitySystemComponent = Cast<UAuraAbilitySystemComponent>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetPawn<APawn>()));
    }

    return AuraAbilitySystemComponent;    
}

입력 상태에 따라 커스텀 ASC의 함수를 발동할 것이므로 커스텀 ASC를 변수로 저장하고 있는 것이 편하다.

어빌리티 시스템 블루프린트 라이브러리를 이용하면 쉽게 ASC를 가져올 수 있다.

 

 

(2) 버튼 누름 상태에 따라 능력 발동 - AuraAbilitySystemComponent

	void AbilityInputTagHeld(const FGameplayTag& InputTag);
	void AbilityInputTagReleased(const FGameplayTag& InputTag);
void UAuraAbilitySystemComponent::AbilityInputTagHeld(const FGameplayTag& InputTag)
{
    // 입력 태그가 유효하지 않으면 종료
    if (!InputTag.IsValid())
        return;

    for (auto& AbilitySpec : GetActivatableAbilities())
    {
        // 태그 컨테이너를 순회하여 입력 태그와 일치하는 어빌리티 스펙을 찾음
        if (AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))
        {
            // 입력 확인
            AbilitySpecInputPressed(AbilitySpec);

            // 활성화 되어 있지 않으면 활성화
            if (!AbilitySpec.IsActive())
            {
                TryActivateAbility(AbilitySpec.Handle);
            }
        }
    }
}

void UAuraAbilitySystemComponent::AbilityInputTagReleased(const FGameplayTag& InputTag)
{
    // 버튼을 땠을 때 종료되거나, 계속 유지됨
    
    // 입력 태그가 유효하지 않으면 종료
    if (!InputTag.IsValid())
        return;

    for (auto& AbilitySpec : GetActivatableAbilities())
    {
        // 태그 컨테이너를 순회하여 입력 태그와 일치하는 어빌리티 스펙을 찾음
        if (AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))
        {
            // 입력 확인
            AbilitySpecInputReleased(AbilitySpec);
        }
    }
}

버튼을 누르고 있거나 땐 상태를 판정하여 능력의 발동과 취소를 제어한다.

AbilitySpecInputPressed 함수는 어빌리티 스펙을 가져와 어빌리티를 활성화한다.

해당 함수 내의 InputPressed 함수는 abstract 이므로 오버라이드하여 원하는 대로 변경할 수 있다.

 

 

(3) 테스트 - GA_TestGameplayAbility

이제 테스트 어빌리티에 좌클릭을 할당하여 어빌리티를 발동하도록 설정한다.