데이터 테이블

MoOrY·2023년 1월 29일
0

언리얼 엔진

목록 보기
6/41

출처: https://wergia.tistory.com/154

데이터 테이블

데이터 테이블은 유용한 방식으로 짜여진 표를 의미한다.
.CSV파일을 임포트하기 위해 데이터를 엔진이 인식할 수 있게 Row컨테이너를 만들어
엔진에 데이터 해석방식을 알려줘야 한다.

  • 데이터 테이블은 정적이며 BP에서 읽기 전용이다.
    값을 바꿔가며 쓰는 용도로는 부적합하다.

데이터 컨테이너 만들기

#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은 반드시 생성자에서 사용해야 한다.

profile
필기용 블로그입니다.

0개의 댓글