언리얼 C++ 프로그래밍

[언리얼 C++] 게임 저장하기

언린이 2021. 8. 15. 12:05

1. SaveGame 오브젝트 생성

SaveGame 클래스는 Kismet/GameplayStatics.h에서 선언된 저장 및 로드 함수에 대한 대상으로 사용할 수 있는 오브젝트를 구성합니다.

 

C++ 클래스 마법사를 사용하여 SaveGame을 기반으로 새로운 클래스를 생성할 수 있습니다.

 

클래스를 생성한 후,

UPROPERTY(VisibleAnywhere, Category = Basic)
FString PlayerName;

SaveGame 오브젝트에 대한 헤더 파일에서 저장하고자 하는 변수를 선언하면 됩니다.

 

UCLASS()
class [PROJECTNAME]_API UMySaveGame : public USaveGame
{
    GENERATED_BODY()

public:
    UPROPERTY(VisibleAnywhere, Category = Basic)
    FString PlayerName;

    UPROPERTY(VisibleAnywhere, Category = Basic)
    FString SaveSlotName;

    UPROPERTY(VisibleAnywhere, Category = Basic)
    uint32 UserIndex;

    UMySaveGame();
};

헤더 파일의 전체 모습입니다.

 

이제 소스 파일을 구성해 볼 것인데, 일반적으로 SaveGame 오브젝트의 소스 파일은 세이브 시스템에 구체적인 함수성을 추가하고자 하는 것이 없는 경우, 별다른 코드가 필요하지 않습니다.

 

#include "[ProjectName].h"
#include "MySaveGame.h"

UMySaveGame::UMySaveGame()
{
    SaveSlotName = TEXT("TestSaveSlot");
    UserIndex = 0;
}

위 예제 코드에서는 클래스 생성자에서 SaveSlotName과 UserIndex 값을 정의하여 다른 게임플레이 클래스에서도 읽고 사용할 수 있도록 해주었습니다.

 

#include "MySaveGame.h"
#include "Kismet/GameplayStatics.h"

마지막으로 SaveGame 오브젝트를 사용할 곳에서 SaveGame 오브젝트 접근 및 GameplayStatics에서 생성, 저장, 로드를 사용하기 위해서 위와 같이 헤더 파일들을 포함시켜줘야 합니다.

 

 

2. 변수 저장하기

FString MyPlayerName = TEXT("PlayerOne");
UMySaveGame* SaveGameInstance = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));
SaveGameInstance->PlayerName = MyPlayerName;
UGameplayStatics::SaveGameToSlot(SaveGameInstance, SaveGameInstance->SaveSlotName, SaveGameInstance->UserIndex);

SaveGame 오브젝트에 변수를 저장하려 할때마다 CreateSaveGameObject() 함수를 사용하여 SaveGame 오브젝트의 인스턴스를 생성한 다음 그 안에 변수를 설정해주면 됩니다.

그리고 나서 SaveGameToSlot() 함수를 사용하여 슬롯 이름과 유저 인덱스를 지정하여 설정한 SaveGame 오브젝트의 인스턴스를 저장할 수 있습니다.

 

 

3. 변수 로드하기

UMySaveGame* LoadGameInstance = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));
LoadGameInstance = Cast<UMySaveGame>(UGameplayStatics::LoadGameFromSlot(LoadGameInstance->SaveSlotName, LoadGameInstance->UserIndex));
FString PlayerNameToDisplay = LoadGameInstance->PlayerName;
if (GEngine)
{
    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, PlayerNameToDisplay);
}

변수를 로드하려면 먼저 SaveGame 오브젝트의 인스턴스를 생성한 다음 LoadGameFromSlot() 함수를 사용하여 저장된 SaveGame 오브젝트를 로드하면 됩니다.

SaveGame 오브젝트를 로드할때, 저장할때 사용하였던 슬롯 이름과 유저 인덱스를 사용하여 로드합니다.

이런 식으로 하드 디스크에서 새로운 SaveGame 오브젝트를 로드한 이후에는 거기서 변수 값을 읽어 필요한 액터 또는 클래스에 할당하거나, 위 예제 코드와 같이 직접 사용할 수도 있습니다.