UE4

[UE4] CSV 데이터 불러오기

Honey Badger 2022. 11. 11. 17:29

  엑셀에 저장돼 있는 캐릭터의 스탯 데이터 테이블을 언리얼 엔진에 불러들여보자. 캐릭터 스탯 데이터는 게임의 기반을 이루는 변하지 않는 데이터이므로 보통 게임 앱이 초기화될 때 불러들인다. 언리얼 엔진은 게임 앱을 관리하기 위한 용도로 GameInstance라는 언리얼 오브젝트를 제공한다. 이 인스턴스가 캐릭터의 스탯을 관리하도록 설계하면 게임 앱이 초기화될 때 캐릭터 스탯 데이터를 불러들이고, 앱이 종료할 때까지 스탯 데이터는 보존된다.  GameInstance 클래스를 부모로 하는 클래스를 제작 후 프로젝트 세팅의 맵&모드로 들어가서 GameInstance항목을 우리가 만든 것으로 바꿔주면 게임 앱을 관리할 수 있다. 

 

 

 다음으로 원하는 캐릭터 스탯 데이터를 엑셀에 작성 후 CSV파일 형식으로 저장해준다.

 

 

  이 파일을 언리얼 엔진에서 불러들이기 위해 테이블 데이터의 각 열의 이름과 유형이 동일한 구조체를 선언해야 한다. 언리얼에서 제공하는 FTableRowBase 구조체를 상속받은 FMyCharacterData라는 이름의 구조체를 게임 인스턴스의 헤더에 선언한다. 

 

 

구조체 선언

구조체를 생성할 땐 언리얼이 정한 규칙에 따라줘야 에디터 인터페이스에서 연동해 사용할 수 있다. 

1. USTRUCT매크로를 구조체 선언 윗줄에 넣는다.

2. 구조체 내부에는 GENERATED_BODY() 매크로를 선언한다.

3. CSV 파일의 각 열의 이름과 동일한 멤버 변수를 타입에 맞춰 선언한다.

4. 테이블의 첫 번째 열데이터는 언리얼 엔진에서 자동으로 Key 값으로 사용하므로 선언에서 제외한다.

 

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

public : 
	FMyCharacterData() : Level(1), MaxHP(100.0f), AttackPower(10.0f), NextExp(30) {}

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
	int32 Level;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
	float MaxHP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
	float AttackPower;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
	int32 NextExp;
};

 

 

CSV 파일 임포트

이제 에디터에서 임포트를 클릭하고 아까 만들어둔 CSV파일을 선택한다. 그러면 데이터테이블 옵션 다이얼로그가 생성되는데, 데이터 테이블 행 유형 선택의 드롭다운 목록에서 우리가 선언한 MyCharacterData로 설정하자. 

 

 

CSV 파일이 성공적으로 임포트 된 결과 화면

 

 

데이터 테이블 로딩

 

  언리얼은 해당 테이블 데이터를 관리하도록 DataTable이라는 언리얼 오브젝트를 제공한다. DataTable을 게임 인스턴스의 멤버 변수로 선언하고, 위의 임포트 데이터의 레퍼런스를 복사한 후 데이터를 불러들여보자.

 

public:
	FMyCharacterData* GetMyCharacterData(int32 Level); //레벨에 따른 구조체 데이터 반환.

private:
	UPROPERTY()
	class UDataTable* MyCharacterTable; //CSV파일과 연동하여 데이터 불러들이기.

멤버 변수를 다음과 같이 선언하고,

 

UMyGameInstance::UMyGameInstance()
{
	FString CharacterDataPath = TEXT("DataTable'/Game/GameData/MyCharacterData.MyCharacterData'");
	static ConstructorHelpers::FObjectFinder<UDataTable> DT_MYCHARACTER(*CharacterDataPath);
	if (DT_MYCHARACTER.Succeeded())
	{
		MyCharacterTable = DT_MYCHARACTER.Object;
	}
}

위에서 임포트한 CSV파일을 가져와 MyCharacterTable에 저장시켜준다.  

 

void UMyGameInstance::Init()
{
	Super::Init();
	float temp = GetMyCharacterData(20)->MaxHP; //20레벨의 최대체력 데이터 가져와 temp에 저장.
}

FMyCharacterData* UMyGameInstance::GetMyCharacterData(int32 Level)
{
	//CSV임포트 데이터에서 내가 제작한 구조체의 행 데이터 찾아 반환.
	return MyCharacterTable->FindRow<FMyCharacterData>(*FString::FromInt(Level), TEXT(""));
}

다음과 같이 데이터가 로딩되는 것을 확인할 수 있다. 

'UE4' 카테고리의 다른 글

[UE4] Unrecognized type Error 해결법  (0) 2022.11.12
[UE4] 캐릭터 스텟 컴포넌트 만들기  (0) 2022.11.12
[UE4] 이펙트 구현하기  (0) 2022.11.11
[UE4] 아이템 상자 제작  (0) 2022.11.11
[UE4] 무기 액터 제작  (0) 2022.11.09