ゲームを C++ で保存する

C++ でゲームを保存およびロードする方法

Windows
MacOS
Linux

SaveGame オブジェクトの作成

SaveGame クラスは、 Kismet/GameplayStatics.h に宣言される関数の保存およびロードのためにターゲットとして使用されるオブジェクトを設定します。

C++ クラス ウィザード を使って SaveGame をもとに新規クラスを作成することができます。

SaveGameCode.png

このサンプルでは、新規の SaveGame クラスは「MySaveGame」と呼びます。

ヘッダ

SaveGame オブジェクトのヘッダファイルの中では、 SaveGame を格納するためのどんな変数でも宣言することができます。

UPROPERTY(VisibleAnywhere, Category = Basic)
FString PlayerName;

このサンプルでは、SaveSlotName と UserIndex に対するデフォルト値の保存の宣言に使用する変数もあるので、 この SaveGame オブジェクトに保存される各クラスには、これらの変数を個別に設定する必要はありません。ここの部分はオプションですので、デフォルト値が変更されない場合は上書される保存スロットは 1 つになります。

MySaveGame.h

// Copyright 1998-2018 Epic Games, Inc.All Rights Reserved.

#pragma once

#include "GameFramework/SaveGame.h"
#include "MySaveGame.generated.h"

/**
 * 
 */
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 オブジェクトのソースファイルは関数に対して特定のコードを必要としません。

このサンプルでは、クラス コンストラクタで SaveSlotNameUserIndex の値を定義するので、ゲームプレイ クラスによる読み取りと使用が可能です。

MySaveGame.cpp

// Copyright 1998-2018 Epic Games, Inc.All Rights Reserved.

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

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

モジュール ヘッダ ファイル

SaveGame オブジェクトにへアクセスし、GameplayStatics から関数の作成、保存、ロードを簡単に行うために、 ゲーム モジュールのヘッダファイル内の他のすべての #include ステートメントの位置に以下の行を追加してください。モジュール ヘッダー ファイル名は 「[ProjectName].h」 となります。

MyProject.h

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

これらの #include ステートメントは必ず #include "Engine.h" の後に追加するようにしてください。そうでない場合、コンパイルが失敗します。

変数の保存

変数を SaveGame オブジェクトに保存したい場合は、SaveGame オブジェクトのインスタンスを作成して、その中に変数を設定しなければなりません。

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

変数のロード

変数をロードするには、まず UGameplayStatics::LoadGameFromSlotSaveGame オブジェクトをロードしなければなりません。これにより、SaveGame オブジェクトのインスタンスが新規作成されます。

ここでも、まず空の SaveGame オブジェクトを作成し、そこからデフォルトの SaveSlotNameUserIndex を読み取れるようにします。このステップは任意であり、全てのゲームの実装に適用するわけではありません。

新規の SaveGame オブジェクトがハードドライブからロードされれば、変数値をそこから読み取り、必要なアクタまたはクラスへ割り当てたり、以下のように直接しようすることができます。

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);
}
Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信