GameplayTagC++ Native Tag로 만드는 방법은 두가지이다.

  • UE_DECLARE_GAMEPLAY_TAG_EXTERN + UE_DEFINE_GAMEPLAY_TAG
  • UE_DEFINE_GAMEPLAY_TAG_STATIC

→ 여러 cpp에서 같은 GameplayTag를 써야 한다
이 경우는 EXTERN 방식이 맞음

→ 특정 cpp 안에서만 쓴다
이 경우는 STATIC 방식이 맞음

  1. 같은 모듈 내부의 특정 cpp에서만 쓰는 tag : STATIC
    1. 대신 namespace를 통해 redefined 컴파일 에러를 막아야함.
  2. 모듈 밖에서도 써야하는 tag : EXTERN

같은 모듈에서 Extern 두고 사용할 경우

// LyraGameplayTags.h
namespace LyraGameplayTags
{    
    UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_IsDead);    
    UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Cooldown);    
    UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Move);
    UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Jump);
    UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_Death);    
    UE_DECLARE_GAMEPLAY_TAG_EXTERN(Status_Crouching);    
    // ...
}

이 헤더를 cpp#include하면, 헤더 변경 시 cpp들이 다시 컴파일 해야한다.
재 컴파일 범위가 늘어남

STATIC으로 하게 되면 컴파일 의존성이 감소한다.

그럼 Static으로 전부다?

Lyra에서는 전부 UE_DEFINE_GAMEPLAY_TAG_STATIC으로 두고 사용하고 있다.
하지만 이 방식의 문제점은 번거롭다는 점이다.

같은 태그를 어디서 정의했는지 찾기 어려움

namespace FTWeaponTags
{
    UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_Weapon_Rifle, "Weapon.Rifle");
}
namespace FTUITags
{
    UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_Weapon_Rifle, "Weapon.Rifle");
}

태그 문자열 리네이밍이 불편함

namespace를 통해 같은 tag로 다른 cpp에 만들어져 있으니
문자열이 바뀌면 전부다 찾아서 직접 바꿔줘야 한다.

namespace 작명이 겹치면 안됨

말 그대로 namespace로 구분하고 있기 때문에 겹치기라도 하면 redefined 컴파일 에러가 발생한다.

사용 추천

  1. EXTERN으로 사용하지만 tag를 기능 단위로 분리해 다른 헤더에 담아 재 컴파일 범위를 줄이기.
  2. (namespace + STATIC) + EXTERN 혼용하기. 공용 tag만 EXTERN으로 승격
반응형

'Unreal Engine' 카테고리의 다른 글

UE Input 2  (0) 2026.06.24
UE Input 1  (0) 2026.06.23
AssetManager  (0) 2026.06.19
UE Game play Framework 2  (0) 2026.06.18
UE Game play Framework 1  (0) 2026.06.17