본문 바로가기

프로그래밍

🎮 [언리얼 엔진 5] FGameplayTag에서 특정 단어 포함 여부 확인하는 방법

728x90
728x90

 

언리얼 엔진 5에서 FGameplayTag를 사용할 때, "Character.Status.Dead"와 같은 태그 문자열에서 "Dead"라는 **세그먼트(단어)**가 포함되어 있는지를 확인하고 싶은 경우가 종종 있습니다.

이번 포스팅에서는 Unreal Engine 5에서 FGameplayTag의 내장 함수만을 활용한 방법과, 안전한 문자열 기반 방법까지 두 가지를 소개해드립니다.


✅ 목표

예를 들어, FGameplayTag 값이 다음과 같다고 가정합니다.

Character.Status.Dead
 

이때 "Dead"라는 단어가 이 태그에 포함되어 있는지를 확인하고 싶은 상황입니다.


✅ 방법 1. MatchesTag() 함수 사용 (전제 조건 있음)

FGameplayTag는 자체적으로 계층 구조 기반 비교를 지원합니다.

MatchesTag() 함수를 이용하면, 자식 태그가 부모 태그를 포함하는지를 확인할 수 있습니다.

📌 코드 예시

FGameplayTag FullTag = FGameplayTag::RequestGameplayTag(FName("Character.Status.Dead"));
FGameplayTag WordTag = FGameplayTag::RequestGameplayTag(FName("Dead")); // 확인할 단어

bool bContainsWord = FullTag.MatchesTag(WordTag);
 

✅ 장점

  • FGameplayTag의 내장 함수만 사용함
  • 성능이 뛰어남

⚠️ 단점

  • "Dead"라는 단어가 등록된 GameplayTag여야 함 (DefaultGameplayTags.ini 또는 에디터에서 추가 필요)

✅ 방법 2. 문자열로 분리하여 직접 단어 확인 (보다 유연한 방법)

태그 내부 구조를 문자열로 바꿔서 "." 기준으로 나눈 후, 각 세그먼트(단어)를 직접 비교하는 방식입니다.

📌 코드 예시

bool DoesTagContainWord(const FGameplayTag& Tag, const FString& Word)
{
    TArray<FString> Segments;
    Tag.ToString().ParseIntoArray(Segments, TEXT("."));

    for (const FString& Segment : Segments)
    {
        if (Segment.Equals(Word, ESearchCase::IgnoreCase))
        {
            return true;
        }
    }

    return false;
}
 

✅ 사용 예시

FGameplayTag Tag = FGameplayTag::RequestGameplayTag(FName("Character.Status.Dead"));

if (DoesTagContainWord(Tag, TEXT("Dead")))
{
    UE_LOG(LogTemp, Log, TEXT("태그에 'Dead'가 포함되어 있습니다."));
}
 

✅ 장점

  • "Dead"가 등록된 태그가 아니어도 사용 가능
  • 유연하고 실용적

⚠️ 단점

  • 문자열 변환이 필요하므로 약간의 성능 손실이 있을 수 있음

✅ 최종 정리

방법
장점
단점
MatchesTag()
빠르고, 멤버 함수만 사용
단어가 등록된 태그여야 함
ToString() + 문자열 비교
등록 여부 상관없이 비교 가능
문자열 처리 필요

 


 

✍️ 마무리

FGameplayTag를 사용할 때, 단순한 태그 포함 여부만 확인할 게 아니라 세그먼트 단위의 확인이 필요할 경우도 많습니다. 위 방법 중 상황에 맞게 선택하시면 됩니다.

 

 

728x90
반응형