출처:
https://docs.unrealengine.com/4.26/ko/InteractiveExperiences/SaveGame/
https://docs.unrealengine.com/4.26/ko/InteractiveExperiences/SaveGame/Code/
게임 저장 및 로드 구성을 위한 방법으로 SaveGame 오브젝트 사용이 있다.
SaveGame오브젝트를 여러 부속으로 된 박스로 생각하고,
각 부분마다 변수를 만들어 일정량의 정보를 저장하도록 설정할 수 있다.
여러 다름 클래스에서 SaveGame오브젝트로 정보를 전달할 수 있다.
그러기 위해서 먼저 SaveGame오브젝트의 인스턴스를 생성하거나, 복사해야 한다.
이후 다른 클래스에서 저장할 값을 SaveGame 오브젝트 내 일치하는 변수에 저장하면 된다.
이제 SaveGame오브젝트는 이 변수 값을 하드디스크에 저장할 때 까지 유지한다.
이제 SaveGameToSlot을 사용해서 SaveGame오브젝트를 하드디스크 상의 파일에 저장한다.
다른 프로그램에서 새 문서를 저장하는것처럼, SaveGameToSlot에 파일명을 지어준다.
기본적으로 SaveGame은 Saved\SaveGames 폴더에 .sav파일로 저장된다.
SaveGameToSlot에 사용자 ID도 주어야 나중에 로드할 정보를 찾아보는 데 도움이 된다.
로드는 저장의 반대로 이루어진다.
LoadGameFromSlot을 사용하여 입력에서 파일명과 사용자 ID를 받는다.
LoadGameFromSlot에서 하드디스크의 정보를 로드하면 SaveGame 오브젝트의 복사본이 생성된다.
생성된 SaveGame의 정보를 사용할 액터에게 복사할 수 있다.
SaveGame을 상속받아 클래스를 만든 후,
저장할 변수들을 헤더파일에 작성한다.
(주의)
UPROPERTY를 붙이지 않으면 저장에 실패한다.
class ASSETTEST_API UMySaveGame : public USaveGame
{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, Category = Basic)
FString PlayerName;
UPROPERTY(VisibleAnywhere, Category = Basic)
FString SaveSlotName;
UPROPERTY(VisibleAnywhere, Category = Basic)
int32 UserIndex;
UMySaveGame();
};
일반적으로 SaveGame오브젝트의 소스파일은
시스템에 구체적인 함수성을 추가하고자 하지 않을때는 cpp에 별다른 코드가 필요치 않다.
이 예제에선 클래스 생성자에서 일부 값을 정의하여 다른 GamePlay클래스에서 읽고 쓸 수 있도록 한다.
UMySaveGame::UMySaveGame()
{
SaveSlotName = TEXT("TestSaveSlot");
UserIndex = 0;
}
SaveGame오브젝트
SaveGame 오브젝트 접근 및 GameplayStatics 에서 함수의 생성, 저장, 로드를 쉽게 하기 위해서는,
게임 모듈의 헤더 파일의 다른 #include 문 아래 #include "Kismet/GameplayStatics.h"를 추가하자.
#include "Engine.h문 위에 다른 헤더파일을 작성하면 컴파일 오류가 발생한다.
SaveGame오브젝트에 변수를 저장하려 할때마다,
SaveGame오브젝트의 인스턴스를 생성한 후 그 안에 변수를 설정해줘야 한다.
void AAssetTestCharacter::SaveGame()
{
FString PlayerName = TEXT("MOORY");
UMySaveGame* SaveGameInstance = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));
SaveGameInstance->PlayerName = PlayerName;
UGameplayStatics::SaveGameToSlot(SaveGameInstance,SaveGameInstance->SaveSlotName, SaveGameInstance->UserIndex);
}
void AAssetTestCharacter::LoadGame()
{
UMySaveGame* LoadGameInstance = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));
LoadGameInstance = Cast<UMySaveGame>(UGameplayStatics::LoadGameFromSlot(LoadGameInstance->SaveSlotName, LoadGameInstance->UserIndex));
FString LoadedPlayerName = LoadGameInstance->PlayerName;
UE_LOG(LogTemp,Warning,TEXT("%s"),*LoadedPlayerName);
}
변수를 로드하려면 먼저 UGameplayStatics::LoadGameFromSlot 를 사용하여
SaveGame 오브젝트를 로드해야 한다. 그러면 SaveGame 오브젝트의 인스턴스가 새로 생긴다
먼저 빈 SaveGame 오브젝트를 생성하여 거기서 SaveSlotName 및 UserIndex 기본값을 읽을 수 있도록 한다.
이 부분은 옵션으로, 모든 게임 구현에서 적용할 필요는 없다
하드 디스크에서 새로운 SaveGame 오브젝트를 로드한 이후에는 거기서 변수 값을 읽어
필요한 액터 또는 클래스에 할당하거나, 다음과 같이 직접 사용할 수도 있다.