복잡한 게임일 수록 데이터가 많아져 일일히 관리하기가 힘들어진다.
그럼 어떻게 관리해야할까?
데이터를 모아서 한꺼번에 지정해주기 쉽게 하기 위해선 데이터테이블을 사용할 수 있다!
C++로 데이터테이블을 만들어보자
임의로 레벨의 정보를 전달하는 데이터테이블을 만들어보겠다.
1. DataTable Row 생성
데이터테이블을 만들기 위해선 Row 구조체가 필요하다.

에디터의 좌측 상단에서 새로운 C++ 클래스를 만들어주자

TableRow에 대한 부모는 따로 없으므로 없음을 선택하고 다음을 눌러준다.


.h와 .cpp의 내용을 모두 지워주고
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "MapInfoRow.generated.h"
enum class EMapName : uint8;
USTRUCT(BlueprintType)
struct FMapInfoRow : public FTableRowBase
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName MapName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
EMapName MapEnum;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
uint8 Id;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FText MapDescription;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TObjectPtr<UTexture2D> MapThumbnail;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
uint8 bIsUnlocked : 1;
};
헤더파일에 필요한 데이터 타입을 채워준다.
2. 블루프린트에서 데이터테이블 생성

visual studio 빌드를 진행한 후
언리얼 에디터의 콘텐츠 브라우저에서 마우스 우클릭으로 메뉴를 열고 기타 > 데이터 테이블을 눌러준다.

여기서 c++로 만들어준 MapInfoRow구조체를 선택해준다.

그럼 이렇게 생성되고 접두사는 보통 DT를 붙여준다.

해당 파일을 열면 위와 같은 창이 뜬다.
상단에 추가 버튼을 눌러서 열을 추가해주자.

그럼 열이 추가되고 아래 열 에디터에서 옵션을 설정할 수 있다.
다음과 같이 선언해주면 에디터를 통해 위에서 설정한 데이터테이블을 설정해 줄 수 있다.
UPROPERTY(EditDefaultsOnly, Category = "ADGameInstance", meta = (RequiredAssetDataTags = "RowStructure=/Script/AbyssDiverUnderWorld.MapDepthRow"))
TObjectPtr<UDataTable> MapInfoTable;

3. 데이터테이블 정보 사용하기
3-1. C++
C++에서는 다음과 같이 함수를 통해 이름으로 열을 반환하거나 전체 열을 반환할 수 있다.
FName MapName = "맵 이름";
static const FString Context(TEXT("MapInfoDataTable"));
/*이름으로 열 찾기*/
FMapInfoRow* MapInfo = MapInfoTable->FindRow<FMapInfoRow>(MapName, Context);
FMapInfoRow* MapInfo = MapInfoTable->FindRow<FMapInfoRow>(MapName, Text("MapInfoDataTable");
/*전체 열 가져오기*/
TArray<FMapInfoRow*> MapInfoArray;
MapInfoTable->GetAllRow<FMapInfoRow>(TEXT("MapInfoTable"), MapInfoArray);
/*전체 열 순회*/
for(FMapInfoRow* Row : MapInfoArray)
{
//열의 데이터 사용
}
/*전체 열 배열로 캐시하기(단, Row 구조체에 Id 변수가 있어야 함)*/
TArray<FMapInfoRow*> MapInfoArray;
MapInfoTable->GetAllRow<FMapInfoRow>(TEXT("MapInfoTable"), MapInfoArray);
Algo::Sort(MapInfoArray, [](const FMapInfoRow* A, const FMapInfoRow* B)
{
return A->Id < B->Id;
}); //Id를 통해 배열 정렬
전체 열을 배열로 캐시해서 데이터테이블에서 설정한 Id 기준으로 정렬을 할 경우
인덱스를 인자로 받아 열을 반환하는 get 함수도 만들어줄 수 있을 것이다.
3-2. 블루프린트

블루프린트에서는 전체 열을 바로 가져오는 함수는 없고
데이터테이블의 열 이름들 배열을 가져와서 순회 노드를 통해
RowName으로 열을 찾아 반환하여 사용할 수 있다.
맨 위에서 만들어주었던 MapInfoRow 구조체 배열 변수에 해당 열들을 추가하여 주었다.
이는 열을 이름이 아닌 인덱스 번호로 사용하기 위함이다.

다음과 같이 LevelIndex를 받아 해당하는 Map Info Row를 가져오고
구조체 핀 분할을 통해 필요한 정보들을 Set Level Info의 인자로 넘겨주었다.
'Unreal' 카테고리의 다른 글
| Unreal5 드래그 앤 드랍 구현 (0) | 2025.06.02 |
|---|---|
| Unreal5 위젯 NativeOn 함수 (0) | 2025.06.02 |
| Unreal5 AI제작3_AI NPC에 감각 부여하기 (0) | 2025.04.25 |
| Unreal5 AI제작3_AI NPC에 행동 부여하기 (0) | 2025.04.23 |
| Unreal5 AI 제작2_상태 머신을 활용한 AI 행동 패턴 설계 (0) | 2025.04.22 |