Unreal Engine/기능 구현 / / 2025. 10. 16. 16:44

[Unreal Engine 5] GameplayTag Container(게임플레이 태그 컨테이너)로 상태 관리(State Component)

반응형

# 모듈 : "GameplayTags"

# 헤더 : #include "GameplayTagContainer.h"

 

일반적으로 상태 관리는 enum class를 통해서 관리를 해왔는데,

언리얼 엔진에서는 게임플레이 태그를 통한 강력한 기능들을 지원한다.

게임플레이 태그를 통해 계층 구조를 표현할 수 있고, 게임플레이 태그들을 보관하는 컨테이너를 제공하며 추가, 탐색, 삭제 등 관련 기능들을 함수로 다 제공하고 있다.

 

이를 통해 게임플레이 태그와 컨테이너로 캐릭터의 상태를 관리할 State Component를 만들 수 있다.

 

먼저 이를 사용하기 위해서는 Build.cs 모듈에 GameplayTags 모듈을 추가해야 한다.

 

 

ActorComponent를 상속하여 StateComponent를 만든다.

함수는 기본적으로 단일 게임플레이 태그를 받는 함수와 여러 게임플레이 태그를 받을 GameplayTagContainer를 매개변수로하는 함수로 구분했다.

 

게임플레이 태그를 관리할 때는 TArray를 사용하지 않고 GameplayTag Container를 사용한다. 

 

 

State 컴포넌트는 오직 게임플레이 태그 컨테이너 하나만 프로퍼티로 가지고 있다.

 

 

로직은 간단하다.

태그를 추가하고 싶으면 AddTag

태그를 지우고 싶으면 RemoveTag

 

태그를 검색하고 싶다면 몇가지 조건을 추가해줄 수 있다.

계층이 일치하는지 정도만 탐색하고 싶은지, 아니면 정확한 태그를 찾고 싶은지로 구분할 수 있다.

또한 or, and 기능도 제공하기 때문에 "여러 태그 중 하나라도 있으면", 또는 "해당 태그가 모두 존재하면"으로 구분할 수 있다.

 

검색 함수는 HasTag이며, 정확한 태그를 검색하고 싶으면 Exact를 뒤에 붙여야 한다.

간단한 게임을 제작하고 있으므로 현재는 정확한 태그만 검색한다.

 

만약 컨테이너의 모든 태그를 제거하여 초기 상태로 만들고 싶다면 Reset 함수를 통해 처리할 수 있다.

 

 

사용방법은 다음과 같다.

상태가 추가되는 로직에 AddTag

 

상태가 종료되는 시점에 RemoveTag

 

디버깅 및 확장성을 고려해 별도로 제작한 함수로 래핑을 한번 더 했을 뿐이다.

 

여기서 고려할 점은 상태가 종료되는 시점을 함수로 특정할 수 없는 상황일 때이다.

예를 들어서 키를 입력했을 때는 시작 함수, 키를 뗐을 때 종료 함수가 호출되는 상황은 문제가 없다.

 

그런데, 키를 입력하면 시작 함수가 호출되고 끝나는 타이밍은 이벤트로 처리해야할 때

가령 애니메이션이 끝나면 종료되어야 하는 경우에는 어떻게 처리할까?

 

가장 손쉬운 방법은 AnimNotify를 이용하는 것이다.

애님 노티파이를 통해서 애니메이션이 동작하는 구간에 특정 지점에 이벤트를 발생시켜 함수를 호출할 수 있다.

 

이를 위해 별도의 애님 노티파이 클래스를 생성한다.

애님 노티파이 클래스를 상속하면 Notify 함수를 재정의하여 내가 원하는 로직을 추가할 수 있다.

 

프로퍼티로 GameplayTag Container를 만들어준다.

이렇게 하면 게임플레이 태그를 통해서 

 

애니메이션 몽타주로 가서 직접 만든 애님 노티파이를 추가하고

 

디테일 패널에서 게임플레이 태그를 선택한다.

복수로 선택할 수 있다.

 

 

 

디버깅을 위해 임시로 코드를 작성했고, 테스트를 하면 다음과 같다.

 

 

이제 게임플레이 태그를 추가하는 타이밍은 동작 시작 함수가 호출될 때,

게임 플레이 태그를 삭제할 때는 종료 함수가 명확하면 종료 함수에서, 애니메이션에 의존해야 하면 애님 노티파이를 통해 태그를 삭제할 수 있다.

 

그러면 이제부터 상태를 통해 실행할지 말지를 결정해야 할 때는 태그를 검색해서 태그가 존재하면 모두 함수를 즉시 리턴시키면 된다.

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유