Gameplay Tag란 무엇인가?

  • FGameplayTags는 'Parent.Child.Grandchild ...' 형태의 계층적 이름으로 구성된 태그입니다.
  • GameplayTagManager에 등록되어 관리됩니다.
  • 객체의 상태, 특성, 기능 등을 분류하고 표현하는 데 유용합니다.
  • 예시:
    • 캐릭터가 기절하면 'State.Debuff.Stun' 태그 부여
    • 공격력 증가 시 'Buff.Damage.Increase' 태그 부여
    • 특정 아이템 사용 가능 시 'Item.Usable.Sword' 태그 부여

Gameplay Tag의 장점

  • 코드의 가독성 향상: 부울, 문자열 대신 의미 있는 태그 사용
  • 유지 관리 용이: 태그 중앙 관리, 변경 시 코드 수정 필요 없음
  • 확장성: 새로운 태그 추가 및 관리 용이
  • 다양한 기능 구현: 태그 기반 필터링, 쿼리, 조건부 실행 등

Gameplay Tag 활용 방법

  • 객체에 태그 부여:
    • ASC가 있다면 ASC 안에 추가
    • UAbilitySystemComponent는 IGameplayTagAssetInterface 구현하여 내부 GameplayTag에 접근 가능
  • 태그 기반 논리:
    • HasTag(), HasMatchingTag() 함수: 태그 존재 여부 판단
    • GameplayTagQuery: 태그 조합 기반 쿼리
    • GameplayTagContainer: 여러 태그 관리 및 조작
  • 데이터 테이블과 연동:
    • GameplayTagDataTable: 태그 정보 및 관련 데이터 저장
    • 태그 기반 데이터 조회 및 활용

FGameplayTagContainer

  • 여러 GameplayTag를 효율적으로 저장하는 용도
  • TArray<FGameplayTag>보다 성능 향상
  • 'Fast Replication' 활성화 시 서버/클라이언트 간 효율적인 복제 가능
  • 순회를 위해 TArray<FGameplayTag> 변환 가능

FGameplayTagCountContainer

    • GameplayTag와 그 부여 횟수를 저장
    • TagMap 속성: 태그 부여 횟수 카운트
    • TagMapCount가 0이면 실제로 태그가 존재하지 않는 것과 동일
    • HasTag(), HasMatchingTag() 함수: TagMapCount 비교하여 태그 존재 여부 판단

 

사전 정의

  • GameplayTags는 DefaultGameplayTags.ini에 미리 정의
  • 언리얼 엔진 에디터: 프로젝트 설정에서 GameplayTag 관리
  • GameplayTag 에디터: 생성, 이름 수정, 레퍼런스 검색, 삭제 가능

 

  • GameplayTag 레퍼런스 검색: 에디터 내에서 GameplayTag의 레퍼런스를 검색하면 'Reference Viewer'에서 해당 태그를 참조하는 에셋 목록이 나옵니다. 하지만, C++ 클래스 내의 레퍼런스는 확인할 수 없습니다.
  • GameplayTag 이름 변경: 이름 변경 시 리디렉션이 생성되어, 이전의 GameplayTag를 참조하는 에셋들이 새로운 GameplayTag를 가리킬 수 있도록 합니다. 하지만 가능한 경우, 리디렉션을 방지하기 위해 새 GameplayTag를 따로 만들고 레퍼런스를 직접 새 태그로 변경한 후에 기존 태그는 삭제하는 방법이 선호됩니다.
  • 추가 최적화 옵션: 'Fast Replication' 외에도 GameplayTag 에디터에는 자주 복제되는 GameplayTag들을 설정하여 추가적인 최적화가 가능합니다.
  • GameplayEffect에 의한 복제: GameplayEffect를 통해 추가된 GameplayTag는 자동으로 복제됩니다. ASC에서 'LooseGameplayTag' 로서 직접 추가하는 태그는 복제되지 않으며 별도로 관리해야합니다. 예시 프로젝트에서는 캐릭터의 체력이 0이 되었을 때 즉각적인 반응을 위해 'State.Dead'를 LooseGameplayTag로 사용합니다. 리스폰 시에는 직접 TagMapCount를 0으로 초기화 합니다. LooseGameplayTag 사용 시에만 TagMapCount를 직접 변경해야 합니다. TagMapCount 변경보다는 UAbilitySystemComponent::AddLooseGameplayTag() 및 UAbilitySystemComponent::RemoveLooseGameplayTag() 함수의 사용이 권장됩니다.

 

 

C++에서 a에 대한 참조 얻기 GameplayTag:

FGameplayTag::RequestGameplayTag(FName("Your.GameplayTag.Name"))

 

블로그 게시글 정리: GameplayTag 고급 활용

1. GameplayTag 고급 관리

  • GameplayTagManager: 부모/자식 GameplayTag 정보 조회 등 고급 기능 제공
  • GameplayTagManager 접근 방법:
    • 'GameplayTagManager.h' 포함
    • UGameplayTagManager::Get().FunctionName 호출
  • GameplayTag 저장 방식: 관계형식의 노드 (부모, 자식 등)
  • 장점: 문자열 처리 및 비교보다 속도 향상

2. 블루프린트 필터링

  • GameplayTag/GameplayTagContainer:
    • UPROPERTY specifier Meta = (Categories = "GameplayCue") 지정
    • 'GameplayCue' 부모 태그만 블루프린트에 표시
    • 해당 변수가 GameplayCue용이라는 것을 명확히 하는 경우 유용
  • FGameplayCueTag:
    • FGameplayTag 내부에 포함
    • 'GameplayCue' 부모 태그만 블루프린트에 표시하도록 자동 필터링

3. 함수 내 필터링

  • GameplayTag 파라미터:
    • UFUNCTION specifier Meta = (GameplayTagFilter = "GameplayCue") 지정
    • 'GameplayCue' 부모 태그만 필터링
  • GameplayTagContainer 파라미터:
    • 기본적으로 필터링 불가능
    • 엔진 내부 코드 수정 필요
    • 참고 파일:
      • 'Engine\Plugins\Editor\GameplayTagsEditor\Source\GameplayTagsEditor\Private\SGameplayTagGraphPin.cpp'
      • SGameplayTagGraphPin::ParseDefaultValueData()
      • UGameplayTagsManager::Get().GetCategoriesMetaFromField(PinStructType); 호출
      • FilterString SGameplayTagGraphPin::GetListContent() SGameplayTagWidget에 전달
  • GameplayTagContainer 버전:
    • Engine\Plugins\Editor\GameplayTagsEditor\Source\GameplayTagsEditor\Private\SGameplayTagContainerGraphPin.cpp
    • 메타 필드 확인하지 않아 필터 전달 불가

4. 추가 정보 및 참고

  • 예시 프로젝트: GameplayTag 다양한 활용 사례 참고 가능
  • 블로그 게시글 작성 시:
    • 위 내용 참고
    • 추가 팁, 예시, 이미지, 코드 예시 활용
    • GameplayTag 활용 사례 소개
    • 궁금한 점이나 구체적인 예시 필요 시 언제든지 질문

'개발일지(Unreal5) > GAS[Gameplay Ability System]' 카테고리의 다른 글

AGameplayAbilityWorldReticle  (0) 2025.03.01
Unreal Engine GAS - Gameplay Cue  (0) 2025.02.14
FGameplayAbilityTargetData  (0) 2025.02.14
4.5 게임플레이 이펙트  (0) 2024.02.21
#1. 어빌리티 컴포넌트  (0) 2024.02.20

+ Recent posts