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 |