구조체를 통채로 세이브하고 불러왔더니

특정값이 계속 비어있길래 확인해보았다.

 

비어있는 멤버변수만 UPROPERTY()매크로가 없었는데

매크로를 적으니까 세이브가 제대로 되었다.

구조체를 통채로 세이브후 해당 구조체 변경되었다면

로드할 때 값이 제대로 들어가는지 확인해봤는데 잘 된다. 

 

세이브로드의 값은 개발중, 라이브중에서도 계속 변경될 여지가 있으므로

틀을 잘 잡아놔야한다.

1. 데이터테이블 양식에 맞게 구조체를 생성

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "UObject/NoExportTypes.h"
#include "HD_SharedStruct.generated.h"

/**
 * 
 */
UCLASS()
class HDCLIENT_API UHD_SharedStruct : public UObject
{
	GENERATED_BODY()
	
};

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

protected:
	UPROPERTY(EditAnywhere)
		uint8 _stage = 0;
	UPROPERTY(EditAnywhere)
		uint8 _wave = 0;
};

#include "Engine/DataTable.h" 

구조체는 FTableRowBase로부터 상속받았다

 

나는 웨이브와 관련된 데이터테이블을 만들기 위해 이렇게 구조체를 간단하게 짜놨다

 

2. 에디터에서 데이터테이블 생성

우클릭을해서 데이터 테이블을 선택한다

C++에서 만든 구조체를 선택한다

잘 생성된 모습을 확인할 수 있다

 

3. C++에서 생성된 데이터테이블 불러오기

헤더

UCLASS()
class HDCLIENT_API UHD_GI : public UGameInstance
{
	GENERATED_BODY()
	
protected:
	UHD_GI();

private:
	UDataTable* _dt_wave = nullptr;
};

.cpp

UHD_GI::UHD_GI()
{
	static ConstructorHelpers::FObjectFinder<UDataTable> DT_GAME(TEXT("/Game/_HDClient/ReadOnly/Data/HDDT_Wave.HDDT_Wave"));
	if (DT_GAME.Succeeded()) { _dt_wave = DT_GAME.Object; }
}

 

나는 게임인스턴스 생성자에서 불러왔지만

게임모드에서 불러와도 된다.

->게임모드에서 불러와도 되지만 데이터는 레벨이 이동해도 그대로 남아 있어야 하기 때문에 레벨이 이동되면 변경되는 게임모드보다는 게임인스턴스가 더 올바른? 선택이라고 본다

 

-----------------------------------------------------------------------------------------------------------------------------------

1. csv나 json으로 익스포트, 임포트 하는법

만들어진 데이터테이블을 우클릭하면 csv, json으로 익스포트할 수 있음

csv,json파일을 수정해서 데이터테이블에 다시 적용시키기 위해 리임포트로 변경된 데이터를 업데이트

csv, json파일로 새로운 데이터테이블을 생성하려면...

우선 추가하려는 데이터의 구조에 맞게 구조체를 먼저 생성해주고 밑에 스샷처럼 추가하면 된다

 

+ Recent posts