https://waterglass0105.tistory.com/110
유니티와 마찬가지로, 언리얼의 태그도 게임 내에서 개체(Actor, Component 등)에 태그를 부여하여 특정 속성이나 상태를 나타내고, 이를 기반으로 게임 로직을 처리할 수 있게 하는 시스템이다. 이 시스템은 특히 게임플레이의 복잡성을 줄이고 코드의 가독성을 높이며, 재사용 가능한 로직을 작성하는 데 유용하다.
GamePlay Tag는 크게 3가지로 볼 수 있다.
1. Gameplay Tag
- 간단한 문자열 기반의 태그다.
예: Character.Status.Stunned, Weapon.Type.Ranged, Item.Category.Consumable - 점(.)으로 구분된 계층적 구조를 가지며, 이를 통해 태그를 체계적으로 관리할 수 있다.
2. Gameplay Tag Container
- 태그의 집합으로, 하나의 개체가 여러 태그를 가질 수 있도록 지원한다.
- FGameplayTag: 단일 태그
- FGameplayTagContainer: 다수의 태그 집합
3. Tag Query
- 태그 조건을 정의하고, 태그가 특정 조건에 부합하는지 확인할 수 있다.
- 논리 연산자(AND, OR, NOT)를 조합하여 태그 조건을 설정할 수 있다.
예를 들어, "캐릭터가 Character.Status.Stunned 태그를 가지고 있으며, Character.Team.Red 태그를 포함하지 않는 경우"와 같은 복잡한 조건을 처리할 수 있다.
Gameply Tag는 주로 다음과 같은 목적으로 사용한다.
- 상태 관리
- 캐릭터의 상태를 태그로 관리할 수 있다.
- 예: Character.Status.Poisoned, Character.Status.Invincible
- 클래스 분류
- 아이템, 무기, 능력 등을 태그로 분류하고 조건부 처리를 할 수 있다.
- 예: Item.Type.HealthPotion, Weapon.Type.Melee
- 게임 로직 간소화
- 태그 기반으로 조건을 확인하거나 이벤트를 실행하여 코드 복잡도를 줄인다.
- 데이터 주도형 설계
- 태그는 에디터에서 쉽게 관리할 수 있으므로, 코드 수정 없이 태그를 통해 다양한 게임플레이 시나리오를 설정할 수 있다.
사용 방법
1. Gameplay Tag Editor
- 프로젝트 세팅에서 GameplayTags 섹션에서 태그를 관리할 수 있다.
- 이때, 계층 구조로 태그를 생성, 삭제, 정렬할 수 있다.
- 이러한 Tag 정보는 Config 파일로 저장되어 다른 프로젝트에서도 쉽게 사용이 가능하며, 협업에도 유리하다.
이러한 방식으로 Tag 생성이 가능하다.
만일, 별도의 ini 파일을 구성하고, 태그를 관리하고 싶다면 다음과 같이 New Tag Source의 Add new Gameplay Tag source를 통해 ini 파일을 추가할 수 있다.
이렇게 추가된 ini 파일을 보면, (안보일 경우, IDE에서 모든 파일 보기 옵션을 켜야한다.) 내부에는 경로와 추가된 태그(내가 생성 후 개별적으로 추가하였다.)가 뜨게 된다.
이를 응용하여, 프로젝트를 진행하며 태그를 유동적으로 생성하고 부여하고자 한다면, 다음과 같이 작성할 수 있다.
// Tag 생성 및 사용
#include "GameplayTagContainer.h"
// 태그 정의
FGameplayTag MyTag = FGameplayTag::RequestGameplayTag(FName("Character.Status.Stunned"));
// 태그 비교
if (Character->Tags.HasTag(MyTag))
{
UE_LOG(LogTemp, Warning, TEXT("Character is stunned!"));
}
또한, 태그 컨테이너를 사용하고 싶다면, 다음과 같이 작성할 수 있다.
FGameplayTagContainer MyTags;
MyTags.AddTag(FGameplayTag::RequestGameplayTag(FName("Character.Status.Invincible")));
MyTags.AddTag(FGameplayTag::RequestGameplayTag(FName("Character.Team.Blue")));
// 태그 포함 여부 확인
if (MyTags.HasTag(FGameplayTag::RequestGameplayTag(FName("Character.Status.Invincible"))))
{
UE_LOG(LogTemp, Warning, TEXT("Character is invincible!"));
}
'Study > Unreal Engine' 카테고리의 다른 글
[Unreal] AssetBundle (0) | 2025.01.19 |
---|---|
[Unreal] Socket Attach/Detach (0) | 2025.01.17 |
[Unreal] PDA, Bundle (0) | 2025.01.14 |
[Unreal] 언리얼 엔진과 네트워크 (0) | 2024.11.28 |
[Tip] 파일의 이름 길이 (0) | 2024.10.20 |