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으로 파일명이 만들어져있다.
어떻게 저장되어있는지 궁금해서 열어봤더니, 암호화가 되어있나보다.
몇개는 알아볼 수 있겠다. ㅋㅋ
세이브 파일을 지우고 싶으면 파일을 지우면 된다.