Unreal

데이터 테이블 - Unreal Engine

workbench34 2025. 2. 11. 19:57

 JSON 또는 CSV 를 사용해 본적 있는가? 이 둘의 공통점으로는 데이터 테이블로 사용이 가능하다는 점이다. 언리얼 엔진에도 이와 비슷한 역할을 수행하는 구조체를 만들 수 있다. 그 전에 데이터 테이블이 무엇인가?

 

데이터 테이블이란?

 데이터 테이블은 데이터를 행과 열로 구성하여 정리한 표 형태의 자료 구조이다. 주로 데이터베이스, 스프레드 시트, 통계 분석 프로그램 등 다양한 분야에서 데이터를 효율적으로 관리하고 분석하기 위해 사용된다. (우리가 자주 쓰는 엑셀, 즉 CSV 같은 느낌이라고 생각하자.)

 

 구성 요소로는 행 (Row), 열 (Column), 셀 (Cell) 로 나누어져 있다. 간단한 예시를 통해 보여주겠다.

 

  상품명 연도 판매량
1 초코바 2023 120
2 아이스크림 2023 80
3 아이스크림 2021 160
4 과자 2023 140
5 초코바 2022 110
6 과자 2021 210
7 사탕 2020 220
8 과자 2022 180

 

 행 (Row) : 개별 데이터 항목 또는 레코드를 나타낸다. 위의 표에서는 초코바, 2023, 120 등의 가로줄 이다.

 

 열 (Column) : 데이터의 특정 속성 또는 변수를 나타낸다. 위의 표에서는 상품명, 연도, 판매량 등의 세로줄 이다.

 

 셀 (Cell) : 행과 열이 교차하는 지점으로 , 개별 데이터 값을 저장한다. 만약 (3, 연도) 의 셀을 찾는다 하면 그 답은 2021이 되겠다.

 

위와 같은 요소들로 데이터 테이블은 이루어 진다. 데이터 테이블의 특징으로는 구조화된 데이터, 다양한 데이터 유형 저장, 데이터 분석 용이, 데이터 공유 및 협업을 도와준다. 그렇기에 아이템을 관리하거나 플레이어의 정보를 관리할 때에는 이런 데이터 테이블을 만들어 기획자나 디자이너도 이런 데이터 테이블을 이용해 숫자만 바꾸면 되게 만들어 관리한다.

 

 일단 데이터 테이블이 뭔지는 알겠는데 이게 언리얼 엔진에 사용이 되는가? 당연히 된다. 특히 아이템에 대한 관리 (드랍률 등)에 탁월한 성능을 보여준다. 직접 만들면서 보여주겠다.

 

 우리는 약 4개의 아이템이 있다 가정하고 여기서 확률을 통해 맵에 랜덤 스폰하게 만들 것이다. 여기서 데이터 테이블을 사용하는 부분은 4개의 아이템을 확률에 따라 스폰하게 만드는 것이다. 우선, 데이트 테이블을 사용하기 위해서는 "행(Row)" 를 C++ 구조체로 매핑해야 한다. 언리얼 엔진에서는 FTableRowBase 라는 기본 구조체를 제공하며, 이를 상속한 구조체를 만들면, 각 CSV(또는 JSON) 행을 FItemSpawnRow 구조체에서 정해준 형태로 받아올 수 있게 된다. 우린 CSV 나 JSON 이 아닌 언리얼 엔진 안의 기능인 Data Table 을 사용할 것이다.

 

 우선 C++ 구조체를 만들어 주자. 먼저 새로운 C++  클래스 파일을 생성해 준 뒤 None 을 선택해 준뒤 이름을 ItemSpawnRow 로 붙여준다. 여기서 클래스 파일을 생성하는 이유는 언리얼 엔진에서 C++ 파일을 만들기 위해서는 이 방식을 통해 만들 수 밖에 없기 때문이다. 이렇게 되면 일반적인 형태의 클래스 파일이 완성된다. Cpp 파일과 헤더 파일 두개가 생성되는데 우리는 Cpp 파일을 사용하지 않기 때문에 Cpp 파일 안의 내용은 #include 만 남기고 다 지워주자. 그 뒤 헤더파일로 이동한다.

 

 아래는 헤더파일의 코드이다.

#pragma once

#include "CoreMinimal.h"
#include "ItemSpawnRow.generated.h"

USTRUCT(BlueprintType)
struct FItemSpawnRow : public FTableRowBase
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FName ItemName;
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TSubclassOf<AActor> ItemClass;
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float Spawnchance;
};

 

보면 include 밑에 UCLASS() 가 아닌 USTRUCT(BlueprintType) 이 있는 것을 볼 수 있다. 이는 이 파일이 CLASS 의 구조를 가진게 아닌 구조체 임을 명시해준다. BlueprintType 는 블루프린트에서 인식해야 이 파일을 사용할 수 있기에 붙여준다. 또한 구조체는 Actor 가 아니기에 F 를 앞에 붙여 FItemSpawnRow 라 이름을 붙여주겠다. FTableRowBase 를 상속 받아야만 이 구조체를 DataTable 의 열과 행으로 사용할 수 있게 된다.

 

 열의 구성은 ItemName (아이템 이름), ItemClass (아이템의 클래스), SpawnChance (아이템의 스폰 확률) 로 나눌 것 이기에 이렇게 세개의 변수를 만들어 주었다. 모두 언리얼 엔진에 리플렉션이 되어야 하기에 UPROPERTY 를 붙여준다. 이렇게 되면 구조체의 완성은 끝이 났다. 이제 이걸 통해 데이터 테이블을 만들어보자.

 

 언리얼 에디터로 돌아가 콘텐츠 브라우저에서 우클릭을 해준다. 그 뒤 Miscellaneous (기타) 를 선택 한 뒤 안의 Data Table 을 생성해 준다.

 

 데이터 테이블을 누르면 다음과 같이 행 구조 선택 (Pick Row Structure) 이 보일 것 이다. 우리는 위에서 만든 구조체를 사용하기에 만들어준 이름인 ItemSpawnRow 를 선택한 뒤 확인을 눌러준다. 그 뒤 들어가보면 다음과 같이 보일 것이다.

 

 보면 우리가 만들어준 변수들이 확인 된다. (Item Name, Item Class, SpawnChacne 등) 위의 추가 버튼을 눌러 행을 하나씩 만들어 줄 수 있다. 내가 만든 아이템은 총 4개니 4개의 행을 만들고 각각의 스폰 확률을 임의로 줘 보겠다.

 

 이제 데이터 테이블의 내용이 채워졌다. 과연 이 채워진 데이터 테이블로는 무엇을 할 수 있는가? 우리는 여기서 SpawnChance 라는 float 형 변수를 만들어 채웠다. 그렇다면 C++ 파일 또는 블루프린트에서 이 확률을 불러와 적용 시킬 수 있다는 것이다. 이 내용은 나중에 다시 적어 채워보겠다.

 

 이렇게 오늘은 언리얼 엔진 내에서 구조체 C++을 만들어 그 토대로 데이터 테이블을 만드는 방법을 알아보았다. 다음에는 이 데이터 테이블을 이용해 코드에 적용시켜보는 시간을 가지도록 하겠다.