본문 바로가기

Unreal

[UE4] Json 읽기(Json Reder)

간단하게 특정 경로의 Json 파일을 읽어와서 게임에 적용 시키는 것을 해봅시다.


먼저 코드를 작성하기전에 언리얼에서 Json을 사용하려면 모듈 Json이 필요합니다.

(프로젝트명).Build.cs 에 꼭 Json 을 추가하세요.

using UnrealBuildTool;

public class SimpleTest : ModuleRules
{
	public SimpleTest(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

		PublicDependencyModuleNames.AddRange(new string[] 
		{ 
			"Core", 
			"CoreUObject", 
			"Engine", 
			"InputCore", 
			"HeadMountedDisplay",
			"Json"
		});
	}
}

 

그리고 임의로 Json 데이터를 하나 생성해 줍시다. 

{
  "name": "Jeylee",
  "level": 10,
  "gold": 5000,
  "experience": 20000,
  "helth": 300,
  "mana": 100
}

필자는 프로젝트 폴더 경로에 data 폴더를 하나 만들고 폴더안에 Simple.json이라는 파일을 생성하였습니다.

 


 

CJsonReder.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CJsonReder.generated.h"

USTRUCT(BlueprintType)
struct SIMPLETEST_API FJsonData
{
	GENERATED_USTRUCT_BODY()

	FString name;
	int32	level;
	int32	gold;
	int32	experience;

	int32	helth;
	int32	mana;
};

UCLASS()
class SIMPLETEST_API ACJsonReder : public AActor
{
	GENERATED_BODY()

public:
	ACJsonReder();

protected:
	virtual void BeginPlay() override;

private:
	UFUNCTION()
		void OnJsonReder();

private:
	FJsonData m_JsonData;

};

CJsonReder.cpp

#include "CJsonReder.h"

ACJsonReder::ACJsonReder()
{
}

void ACJsonReder::BeginPlay()
{
	Super::BeginPlay();
	OnJsonReder();
}

void ACJsonReder::OnJsonReder()
{
	FString path = FPaths::ProjectDir() + "/../data/Simple.json";

	FString jsonstr;
	FFileHelper::LoadFileToString(jsonstr, *path);
	if (jsonstr == "") // dada/Simple.json 없다면
		return;

	TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);
	TSharedPtr<FJsonObject> jsonObj = MakeShareable(new FJsonObject());

	m_JsonData = {};
	if (FJsonSerializer::Deserialize(reader, jsonObj) && jsonObj.IsValid())
	{
		m_JsonData.name			= *jsonObj->GetStringField(L"name");
		m_JsonData.level		= jsonObj->GetIntegerField(L"level");
		m_JsonData.gold			= jsonObj->GetIntegerField(L"gold");
		m_JsonData.experience	= jsonObj->GetIntegerField(L"experience");
		m_JsonData.helth		= jsonObj->GetIntegerField(L"helth");
		m_JsonData.mana			= jsonObj->GetIntegerField(L"mana");
	}
	UE_LOG(LogTemp, Log, L"[name				] : %s", *m_JsonData.name);
	UE_LOG(LogTemp, Log, L"[level				] : %d", m_JsonData.level);
	UE_LOG(LogTemp, Log, L"[gold				] : %d", m_JsonData.gold);
	UE_LOG(LogTemp, Log, L"[experience			] : %d", m_JsonData.experience);
	UE_LOG(LogTemp, Log, L"[helth				] : %d", m_JsonData.helth);
	UE_LOG(LogTemp, Log, L"[mana				] : %d", m_JsonData.mana);
}

 

Fstring path에 Json 데이터 경로를 넣어주고 자식 블프를 하나 생성하여 프로젝트를 실행시키면 

 

로그에 저장한 데이터가 출력 되는것을 확인 할 수 있습니다.

 


위 방법을 통해 다양한 데이터를 Json으로 저장 시킨뒤 Json 데이터만 변경하여 테스트 하거나 많은 데이터를 관리하는데 사용하면 좋을 것 같습니다.