Unreal

[Unreal C++] 게임 데이터 저장과 로딩

푸쿠이 2021. 5. 24. 00:12
참고 문서

책 '이득우의 언리얼 C++ 게임 개발의 정석' Chapter 15

 

게임 데이터 저장과 로딩

언리얼은 게임의 데이터를 저장하고 불러들이는 기능을 제공해준다.

이 기능을 사용하면 각 플랫폼별로 알맞은 최적의 장소에 데이터가 저장된다.

 

언리얼 에디터에서 게임 데이터를 저장하는 경우 프로젝트의 Saved 폴더에 있는 SaveGames 폴더에 저장된다.

 

구현해보기

SaveGame을 상속받아 ABSaveGame 클래스를 생성한다.

#pragma once

#include "ArenaBattle.h"
#include "GameFramework/SaveGame.h"
#include "ABSaveGame.generated.h"

UCLASS()
class ARENABATTLE_API UABSaveGame : public USaveGame
{
	GENERATED_BODY()
	
public:
	UABSaveGame();

public:
	UPROPERTY()
	int32 Level;
	
	UPROPERTY()
	int32 Exp;

	UPROPERTY()
	FString PlayerName;

	UPROPERTY()
	int32 HighScore;
};

 

플레이어의 정보를 저장하는 PlayerState에 기능 구현.

데이터 불러오기.

데이터 저장하기.

데이터가 변경될 때마다 저장하기.

public:
	int32 GetGameHighScore() const;
	FString SaveSlotName;

protected:
	UPROPERTY(Transient)
	int32 GameHighScore;
#include "ABSaveGame.h"

AABPlayerState::AABPlayerState()
{
	GameHighScore = 0;
	SaveSlotName = TEXT("Player1");
}

int32 AABPlayerState::GetGameHighScore() const
{
	return GameHighScore;
}

// 데이터 불러오기.
void AABPlayerState::InitPlayerData()
{
	UABSaveGame* ABSaveGame = Cast<UABSaveGame>(UGameplayStatics::LoadGameFromSlot(SaveSlotName, 0));
	if (nullptr == ABSaveGame)
	{
		ABSaveGame = GetMutableDefault<UABSaveGame>(); // Gets the mutable default object of a class.
	}

	SetPlayerName(ABSaveGame->PlayerName);
	SetCharacterLevel(ABSaveGame->Level);
	GameHighScore = ABSaveGame->HighScore;
	Exp = ABSaveGame->Exp;
    
	SavePlayerData();
}

// 데이터 저장하기.
void AABPlayerState::SavePlayerData()
{
	// SpawnActor도 결국엔 NewObject를 사용한다.
	UABSaveGame* NewPlayerData = NewObject<UABSaveGame>(); // 가비지 컬렉터 덕분에 Delete 안써도 됨.
	NewPlayerData->PlayerName = GetPlayerName();
	NewPlayerData->Level = CharacterLevel;
	NewPlayerData->Exp = Exp;
	NewPlayerData->HighScore = GameHighScore;

	if (false == UGameplayStatics::SaveGameToSlot(NewPlayerData, SaveSlotName, 0))
	{
		UE_LOG(LogClass, Warning, TEXT("SaveGame Error!"));
	}
}

bool AABPlayerState::AddExp(int32 IncomeExp)
{
	// 다른 코드는 생략.
	// 데이터가 변할 때마다 저장.
	SavePlayerData();
}


void AABPlayerState::AddGameScore()
{
	// 최고 점수가 바뀌면 교체하기.
	GameScore++;
	if (GameScore >= GameHighScore)
	{
		GameHighScore = GameScore;
	}
	// 데이터가 변할 때마다 저장.
	SavePlayerData();
}

 

잘 동작하는 지 확인하기

프로젝트의 Saved 폴더 내에 세이브 파일이 생겨있다.

지정했던 SlotName으로 파일명이 만들어져있다.

 

어떻게 저장되어있는지 궁금해서 열어봤더니, 암호화가 되어있나보다.

몇개는 알아볼 수 있겠다. ㅋㅋ

 

세이브 파일을 지우고 싶으면 파일을 지우면 된다.