세이브 시스템

MoOrY·2023년 2월 21일
0

언리얼 엔진

목록 보기
11/41

출처:
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 오브젝트 내 일치하는 변수에 저장하면 된다.
이제 SaveGame오브젝트는 이 변수 값을 하드디스크에 저장할 때 까지 유지한다.

SaveGameToSlot

이제 SaveGameToSlot을 사용해서 SaveGame오브젝트를 하드디스크 상의 파일에 저장한다.
다른 프로그램에서 새 문서를 저장하는것처럼, SaveGameToSlot에 파일명을 지어준다.
기본적으로 SaveGame은 Saved\SaveGames 폴더에 .sav파일로 저장된다.
SaveGameToSlot에 사용자 ID도 주어야 나중에 로드할 정보를 찾아보는 데 도움이 된다.

LoadGameFromSlot

로드는 저장의 반대로 이루어진다.
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 오브젝트를 로드한 이후에는 거기서 변수 값을 읽어
필요한 액터 또는 클래스에 할당하거나, 다음과 같이 직접 사용할 수도 있다.

profile
필기용 블로그입니다.

0개의 댓글