Unreal GAS (14) - GameplayTags
2025 / 10 / 13
- GameplayTags
- FGameplayTag 구조체로 이뤄지며, GameplayTagManager에 등록됨.
- 기본적으론 FName 타입임.
(FGameplayTag 구조체 내의 TagName이라는 이름의 FName 타입 변수로 존재)
Parent.Child.GrandChild와 같은 식으로 ‘.’을 통해 구분되는 계층 구조를 지님
- 액터나 컴포넌트에 태그를 부여할 수 있음.
- AbilitySystemComponent는 IGameplayTagAssetInterface를 구현함.
IGameplayTagAssetInterface는 아래 4가지의 함수를 선언하는 인터페이스임.
- GetOwnedGameplayTags
- HasMatchingGameplayTags
- HasAllMatchingGameplayTags
- HasAnyMatchingGameplayTags
- 액터나 컴포넌트는 여러 개의 GameplayTag를 지닐 수 있는데, 이 때 이를 저장하는 컨테이너는 TArray같은 타입이 아닌, GameplayTag 전용의 FGameplayTagContainer를 사용함.
- FGameplayTagContainer는 TagMapCount를 통해 동일한 GameplayTag도 여러 개 저장할 수 있는 것처럼 작동할 수 있음.
TagMapCount가 0인 채로 FGameplayTagContainer에는 존재할 수 있으므로 GameplayTag 뿐만 아니라 Count도 신경써야 함.
- 입력, Ability(GameplayAbility), Attribute, 각종 데미지 타입이나 버프/디버프, 메세지, 데이터를 표현하는 데에 광범위하게 사용될 수 있음.
- GameplayTag 추가
- 에디터에서 추가하기
- 에디터의 프로젝트 세팅에서 GameplayTags를 클릭.
- 에디터 내에서 각종 GameplayTag를 추가할 수 있으며,
기본 경로라면 프로젝트 폴더 내에 Config/DefaultGameplayTags.ini가 생성됨.
- DataTable로 추가하기
- 에디터에서 GameplayTagTableRow를 상속하는 DataTable을 생성함.
- 테이블에서 FName(GameplayTag), Comment를 포함하는 태그를 원하는 만큼 생성함.
’.’을 통해 태그의 계층 구조를 구분해주어야 하며, 오탈자에 매우 유의해야 함.
- 에디터의 프로젝트 세팅에서 GameplayTagTableList에 생성한 테이블을 등록함.
- GameplayEffect에서 GameplayTag 등록
- GameplayEffect의 클래스 디폴트의 Tags 드롭다운에서 관리할 수 있음.
- GameplayEffectAssetTag:
GameplayEffect 자체가 소유하며, 다른 액터나 컴포넌트에 적용하지 않음.
- GrantedTags:
GameplayEffect가 적용되는 액터에게 부여되는 GameplayTag.
GameplayEffect의 효과가 종료되면 부여된 GameplayTag도 사라짐.
(따라서 Duration Policy가 Has Duration/Infinite인 경우에만 유의미함)
- 각 드롭다운 항목에 대한 설명
- Combined Tags: 부모 클래스가 존재한다면 해당 클래스에 설정된 GameplayTag를 기준으로, Added, Removed에 설정된 GameplayTag들을 종합하여 최종적으로 설정되는 GameplayTags을 보여줌. (컴파일 시 목록에 반영됨)
- Added: 추가되는 GameplayTag들을 설정함.
- Removed: 부모 클래스에는 존재하나, 제거하고자 하는 GameplayTag들을 설정함.
- GameplayEffect의 Stacking과 GameplayTag의 관계
- GameplayEffect가 스택이 가능한 경우, 효과를 여러 번 적용하여 스택이 된 경우에도 GameplayTag의 TagCount는 증가하지 않음.
- 반대로, GameplayEffect의 Stacking Type이 None으로 설정된 경우, 지속 효과를 한 번에 여러 개 획득하는 경우, 모두 동시에 적용되므로 GameplayTag의 TagCount가 증가함.
- 즉, GameplayTag의 TagCount는 현재 ‘동시에’ 적용되고 있는 효과의 수를 의미하며,
Stack과 같은 방식으로 효과를 누적시키더라도 한 번에 적용되는 효과는 1개이므로 TagCount는 1로 유지되는 것임.