데이터 테이블은 유용한 방식으로 짜여진 표를 의미한다.
.CSV파일을 임포트하기 위해 데이터를 엔진이 인식할 수 있게 Row컨테이너를 만들어
엔진에 데이터 해석방식을 알려줘야 한다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Engine/DataTable.h"
#include "CustomDataTables.generated.h"
//컨테이너로 사용하는 구조체는 FTableRowBase를 상속받아 만든다.
//구조체를 전처리기와 클래스 선언 사이에 선언해주자
USTRUCT(BlueprintType)
struct FLevelUpTableRow : public FTableRowBase
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "LevelUp")
int32 ExpToNextLevel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "LevelUp")
int32 TotalExp;
};
UCLASS()
class DATATABLETEST_API ACustomDataTables : public AActor
{
GENERATED_BODY()
};
이후 빌드한 후 에디터에서 데이터 테이블을 만들고, 드롭다운을 눌러보면
우리가 만든 데이터 테이블 행 유형을 선택할 수 있다.
private:
class UDataTable* LevelUpDataTable;
사용할 클래스에서 UDataTable*형 변수를 선언해준다.
#include "CustomDataTables.h"
#include "UObject/ConstructorHelpers.h"
사용할 클래스의 cpp파일에 사용할 데이터 타입의 전처리기를 추가한다.
ADataTableTestGameModeBase::ADataTableTestGameModeBase()
{
static ConstructorHelpers::FObjectFinder<UDataTable> DataTable(TEXT("/Game/LevelUpTable"));
if (DataTable.Succeeded())
{
LevelUpDataTable = DataTable.Object;
}
}
void ADataTableTestGameModeBase::BeginPlay()
{
Super::BeginPlay();
if (LevelUpDataTable != nullptr)
{
for (int32 i = 1; i <= 10; i++)
{
FLevelUpTableRow* LevelUpTableRow =
LevelUpDataTable->FindRow<FLevelUpTableRow>(FName(*(FString::FormatAsNumber(i))), FString(""));
UE_LOG(LogTemp, Log,
TEXT("Lv.%d :: ExpToNextLevel(%d) TotalExp(%d)"), i, (*LevelUpTableRow).ExpToNextLevel, (*LevelUpTableRow).TotalExp);
}
}
}
FindRow 함수를 사용해 행을 찾는다.
FObjectFinder은 반드시 생성자에서 사용해야 한다.