본문 바로가기

게임프로그래밍/실습2

[실습2] 26. 게임 플레이 이펙트에 게임플레이 태그 적용하고 태그 출력하기

1. 게임 플레이 이펙트에 태그 추가하기

 

게임플레이 이펙트 클래스로 들어가자

 

컴포넌트를 추가하면 다양한 기능을 추가할 수 있는데 이 중에서 태그를 추가하는 기능은 Grant Tags to Target Actor와 Tags This Effect Has 가 있다.

 

각각의 차이는 이름 그대로 이다. 태그를 타겟에게 설정하거나 아니면 게임플레이 이펙트 자체에 태그를 추가하는 것이다.

 

Grant Tags는 지속시간이 있는 효과에만 적용된다. 즉 인피니트나 듀래이션 이펙트에서는 작동을 하지만 인스턴트 이펙트에서는 대상 액터에게 태그를 줄 수 없다.

 

이제 이런 태그를 C++에서 식별하는 방법을 알아보자.


2. 게임플레이 이펙트에 영향을 받으면 델리게이트 호출하기

 

어빌리티 컴포넌트 클래스에는 게임플레이 효과가 발생하면 호출되는 델리게이트들이 존재한다. 이를 이용하면 게임플레이 이펙트가 적용 받을때 해당 이펙트가 가지고 있는 태그들을 알아볼 수 있다.

 

커스텀 어빌리티시스템 컴포넌트 클래스로 가자.

 

void EffectApplied(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEFfectHandle);

 

이제 이 함수를 델리게이트와 바인딩하면 된다.

 

바인딩을 어느 시점에서 해야할지 생각해야할 문제일 것이다. ASC가 구성이 완료되면 바인딩할 수 있는 것이 좋을 것이다. 그리고 구성이 언제 완료되었는지는 캐릭터 클래스에서 알 수 있다.

 

캐릭터 클래스에서는 ASC가 완성된 시점을 알 수 있기 때문에 그 시점에 특정 함수를 호출할 것이다.

 

class PRACTICE2_API UAuraAbilitySystemComponent : public UAbilitySystemComponent
{
    GENERATED_BODY()

public:
    void AbilityActorInforSet();

 

캐릭터 클래스로 가자.

void AAuraCharacter::InitAbilityActorInfo()
{
    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);
    AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);
    
    Cast<UAuraAbilitySystemComponent>(AuraPlayerState->GetAbilitySystemComponent())->AbilityActorInforSet();
    
    // 이하 생략

 

이렇게 커스텀ASC로 캐스팅하고 함수를 호출하면 된다. 이 시점에서 ASC는 구성이 완료되어 있을 것이다.

 

에너미에도 같은 작업을 해주면 된다. 이제 이 작업을 하므로써 캐릭터 클래스는 ASC 클래스에 의존성이 생기게 된다.

 

어쨌든 이렇게 적절한 시점에 함수 호출하는데 성공했으니 함수를 구현하기만 하면 된다.

 

void UAuraAbilitySystemComponent::AbilityActorInforSet()
{
    OnGameplayEffectAppliedDelegateToSelf.AddUObject(this, &UAuraAbilitySystemComponent::EffectApplied);
}

 

OnGameplayEffectAppliedDelegateToSelf

 

해당 델리게이트는 효과가 자신(ASC)에 적용되면 호출된다. 콜백함수의 시그네쳐는 다음과 같다.

void EffectApplied(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle);

 

이제 간단하게 로그 메세지를 남겨 작동이 잘 되나 확인해보자.

 

확인한 결과 아주 잘 나오는 것을 볼 수 있다. 이제 바인딩이 정상적으로 되었기 때문에 여기서 태그를 알아보면 된다.


3. 태그를 이용해서 메세지 추가하기

 

현재 EffectApplied() 함수에서 할 작업은 태그를 받아와 그것을 HUD에 표시하는 작업을 할 것이다. 그렇게 하기 위해서는 HUD에 어떠한 정보가 가야한다. 다만 HUD에 종속성을 주기는 싫다. 그렇기에 델리게이트를 이용하여 브로드 캐스트를 할 것이다.

FGameplayEffectSpec 구조체에는 태그의 정보 또한 가지고 있다. 현재 기능을 구현하기에 앞서 우리가 한 기능이 잘 작동되는지 점검하자.
태그의 이름을 화면에 출력하는 일을 할 것이다.

 

void UAuraAbilitySystemComponent::EffectApplied(UAbilitySystemComponent* AbilitySystemComponent,
                                                const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle)
{
    FGameplayTagContainer TagContainer;
    EffectSpec.GetAllAssetTags(TagContainer);

    for (const FGameplayTag& Tag : TagContainer)
    {
       const FString Msg = FString::Printf(TEXT("Tag Name : %s"), *Tag.ToString());
       GEngine->AddOnScreenDebugMessage(-1, 8.f, FColor::Blue, Msg);
    }
}

 

물론 이를 확인하기 위해서는 게임플레이 이펙트에 태그를 추가해야 할 것이다.

 

 

태그들이 정상적으로 출력되는 것을 볼 수 있다.