[UE4] Player 상태 별로 몽타주, Enum 자료형→String 문자열 (State Component, Montages Component, DataTable, FTableRowBase, GetAllRows StaticEnum, GetValueAsString)
🗡️ 전투시스템 만들기
플러그인에 대한 공부를 마치고, 이제 C++ 프로젝트를 통한 전투 시스템을 구현해보려 한다.
Player 자체는 이전에도 만들어보았기 때문에 간단했지만, 그때는 Collision과 LineTrace, 델리게이트같은 개념을 이해하기 위한 학습이었기에 Player에 다른 몽타주나 기능은 만들지 않았다.
이번에는 전투시스템을 만들기 때문에 Player에는 다양한 상태와, 애니메이션, 몽타주가 실행되어야 한다.
따라서 이번에는 상태 별 실행될 몽타주를 만들기 위한 내용을 학습해보았다.
🕺🏻 State Component
먼저, 플레이어의 상태를 관리하는 State 컴포넌트를 제작하였다.
플레이어의 상태의 종류를 나타내는 EStateType의 Enum 클래스를 선언하였다.
State Component의 UCLASS 속성으로 들어가있는 meta 키워드(BlueprintSpawnableComponent)는 블루프린트에 함수를 추가할 수 있도록 도와준다.
또한 상태가 변화될 때마다 실행되는 OnStateTypeChanged 함수를 등록시킬 수 있는 FStateTypeChanged의 다이나믹 멀티캐스트 델리게이트를 선언해주었다.
![]() |
![]() |
그밖에 IsIdleMode나 SetIdleMode와 같이 상태를 설정하고 확인하는 함수를 선언하였다.
🕺🏻 Montages Component
다음으로, 몽타주를 실행시키기 위해 필요한 정보들을 Data Table로 저장하기 위해 열 정보를 담고있는 Montages Component를 제작하였다.
"Engine/DataTable.h"의 헤더파일을 추가하고 데이터 테이블의 열 정보를 담고있는 Struct인 FTableRowBase를 상속받았다.
열에는 상태값인 EStateType과, 몽타주객체인 UAnimMontage, 애니메이션의 실행속도를 나타낼 PlayRate 변수를 선언하였고, 이들을 담고있는 FMontagesData라는 구조체를 만들었다.
클래스 안에는 csv파일을 읽어 정보를 저장할 UDataTable 객체와, 읽은 정보들을 토대로 FMontageData 구조체로 내용을 담을 Datas 배열을 선언하였다.
이때 Datas 배열의 크기는 상태 하나 당 하나의 MontagesData가 나오므로 상태값을 담은 Enum의 크기만큼 지정하였다.
📃 CSV 파일 생성
Player의 상태에 따른 몽타주를 담는 DT_Player.csv 파일을 제작하였다.
우선, 기능 구현이 끝난 뒤 다른 몽타주를 담기위해 BackStep 상태만 저장해놓았다.
에디터에 임포트 하였다.
이때 데이터 테이블의 옵션으로 Cpp 클래스로 만들었던 MontagesData를 선택해준다.
📃 CSV 파일 읽어서 저장
Montages Component의 BeginPlay에서는 DataTable클래스의 GetAllRows 함수를 통해 FMontagesData의 모든 행을 가져오도록 했다. 첫번째 매개변수는 RowName이라는건데 신경쓰지 않아도 된다. 뒤에 들어가는 MontagesData 배열을 전달하면 참조형으로 받아서 배열에 Rows 값을 초기화해준다.
이후, 들어온 data값들이 제대로 들어왔는지 확인하기 위해 #if ~ #endif 구문을 이용하였다.
💡 Enum 자료형 → String 문자열
Enum 자료형을 문자열로 바꾸어 출력하기 위해 StaticEnum라는 템플릿을 사용하여 해당 객체의 GetValueAsString 함수를 사용하였다.
컴파일 후 프로그램을 실행시켜보면 Data 정보가 잘 출력되는것을 확인할 수 있었다.
몽타주를 Play 시킬 수 있는 함수로 PlayAnimMontage를 작성하였다.