見出し画像

【TIPS】セーブの基礎

どのプロジェクトでも頻繁に使用するものの、一度作るとあまり作り直さない忘れがちなセーブ機能について基礎をまとめておきます。

セーブのよくある流れ

(読み込み処理)
①セーブデータがあるかどうかを確認する
②セーブデータがなければ、セーブデータを作成
(セーブ用のデフォルト値を取得・保存する)
③セーブデータがあれば、それを読み込んで変数に入れる(読み込み)

(書き込み処理)
①セーブデータを呼び出す
②セーブ用の情報を入れ替える(セットする)
③セーブ保存する

セーブ処理はどこに処理を書く?

ブループリント関数内(Blueprint Function)か、
ゲームインスタンス内(Game Instance) がオススメ。

使用する主なノード

Does save Game Exist:
セーブデータがあるかを確認する。

画像2

Load Game from Slot:
指定のセーブデータを読み込む。
データが欲しい時はその後、対象のセーブデータにCastする。

画像3

Save Game to Slot:
データをセーブする。事前にキャストしたセーブデータ内の変数に対して上書き(セット)しておく必要がある。

画像4


準備:SaveGameクラスの作成

情報を保存するSaveGameクラスを作成します。

画像4

Save Game を開き、保存したい変数を作成します。

画像5

デフォルト値などをいれておくかどうかは作り次第です。
図では、Text型の変数を作成しています。

セーブ用のブループリント関数を作成する

今回はブループリント関数で作成します。

画像8

ロード用関数「Load Save Data」

まずはロード用の関数から作成します。図は全体像です。
分けて説明します。

画像6

1) セーブデータが存在するか確認する
「Does Save Game Exist」で指定の(Slot Nameの)セーブデータが存在するかを確認します。

画像7

2) セーブデータをロードして返す。

1がTrueの場合はセーブデータが存在するということですので、
「Load Game from Slot」でセーブデータを取得します。

どのセーブデータかを指定するため、作成したSaveGameにCastします。
Cast 成功したことを確認したら、そこから必要な変数をゲットしてリターンノードから返します。

自分はよくリターンで受け取った値を Game Instanceなどの変数に格納しています。ゲーム上で使用する変数の場合ブループリント関数上で直接セットするのはおすすめしません。

画像9

3) セーブデータが無い場合は新たに作成してデフォルト値を返す

1がFalseの場合はセーブデータが存在しないということですので、
「Create Save Game Object」でSave Game Objectを作成し、デフォルト値をそのまま「Save Game to Slot」で保存します。保存は保存の処理でのみ行いたいというときは、ここを省いても構いません。

「Create Save Game Object」で指定するのは最初に準備で作成したSave Game クラスです。ここを引数にしても良いと思います。

保存したらそこから再度ロードして(Load Game from Slot)、基本値をゲットして返します。

画像10

セーブ用関数「Save Save Data」

セーブ用の関数「Save Save Data」を作成します。名前は適当です。

画像12

1)セーブデータがあるか確認。

ロード時と同様です。
作り的に、まず間違いなく存在するのですが念のため。

2)セーブデータの変数を上書きしてセーブ実行

セーブデータをロードします。そこからCastして、セーブしたい変数にセットします。図ではGame Instance上の変数で上書きする設定ですが、引数として関数呼び出し時に指定する方法でも良いかと思います。

最後に「Save Game to Slot」を実行します。
これを実行しないとせっかく変数を上書きしてもそれが保存されません。

Create Save Game Object からセットしても良いと思いますが、自分はロードからキャストするやり方にしています。

セーブデータロード(読み込み)処理呼び出し例

図ではGame Instance上の「Init」イベントでロード処理を実行しています。

ゲーム起動時にGame Instance上の変数を上書きするようになっています。
画像11

ちなみに、Bool値「Load Complete」は、ロードが完了したことを明示するために作成しています。読み込み順に確信があるのでしたら不要なのですが、自分はよくロード処理が完了しているか(データが読み込めるか)の確認をするときに、これで判断するようにしています(下図を参照)

画像13


制作例は以上です!
マケプレのプラグインなどを使ったほうがラクかも、とも思いますが
ひとまず基礎ということで。

#UE4_TIPS

この記事が気に入ったらサポートをしてみませんか?