セーブ・ロードの機能についてはオフライン(サーバーを利用しない)で、スマホの場合であれば端末内にセーブデータを保持するようにします。
この機能は
Unity の用意している PlayerPrefs(プレイヤープレフス) クラスを利用することで実装を行います。
ゲームにおいては様々な部分でセーブとロードを実行することが想定されますので、そういった場合に備えて
PlayerPrefs クラスの機能をさらに
自分のゲーム用にカスタマイズして、
ゲーム内容に即した1つの新しいクラスを作成しておく設計にします。
このようにしておくことにより、
ゲーム内のセーブ・ロードに関しては、このクラスを利用すればよい状態を作り出すことが出来ます。
PlayerPrefs クラスでは、3つの型の情報をセーブすることが出来ます。int 型、float 型、string 型になります。
ただし、
自作したクラスそのものであったり、あるいは時間のデータである
DateTime(デイトタイム) 構造体などは上記のいずれの型にも当てはまりません。
そのため、今のままでは PlayerPrefs の用意している型と異なってしまって、セーブ・ロードが行えません。
このようなときにはいくつかの方法が考えられますが、今回は、まず保存用のクラスを作成し、その中にセーブ・ロードして利用したい情報をまとめるようにします。
主にはユーザーの情報になりますが、その場合、スコア、お金などの int 型の情報、bool 型の情報、
そして自作クラス内の情報などであっても、保存用のクラスの中に一括でまとめるようにします。
そして、その保存用のクラスのデータの型の作りを PlayerPrefs でのセーブ・ロードが行える string 型に変更してから、セーブ・ロードを行うようにします。
<イメージ>
UserData.cs(セーブしたいクラス その1)
public class UserData : MonoBehaviour {
public int score; // 保存したい情報
public int money; // 保存したい情報
public bool isFirstMission; // 保存したい情報
以下には、セーブしなくてもよい情報(変数やメソッド)があるとします。
}
ItemInvenrty.cs(セーブしたいクラス その2)
public class ItemInvenrty : MonoBehaviour {
public class ItemInvenrtyData {
public int itemId;
public string itemName;
}
public List<ItemInventryData> itemInventryDataList = new(); // 保存したい情報
以下には、セーブしなくてもよい情報(変数やメソッド)があるとします。
}
上記のような構造になっている2つのクラスの内容をセーブ・ロードしたい、と考えた場合には、
各変数ごとに1つずつセーブ・ロードさせるのではなく、
別の保存用のクラスを用意し、そちらにセーブ・ロードしたい情報を各クラスからピックアップしてまとめておき、それをセーブ・ロードさせるという形にします。
↓
SaveData.cs(上記の2つのクラス内から、セーブしたい情報をまとめたクラス)
public class SaveData {
public int score; // 保存したい情報
public int money; // 保存したい情報
public bool isFirstMission; // 保存したい情報
public List<ItemInventryData> itemInventryDataList = new(); // 保存したい情報
// 他にもあれば追加していく
}
このようにすることで、セーブ・ロードに必要な情報をまとめて管理出来ます。
上記の場合、SaveData クラスは自作クラスになるため、型としては SaveData 型となり、そのままでは PlayerPrefs クラスではセーブ・ロードが行えません。
こちらを string 型の情報へと変換し、その後、PlayerPrefs の機能を利用して string 型でセーブ・ロードを行うようにします。
Unity の用意している機能の1つに
JsonUtility(ジェイソン・ユーティリティ) クラスがあります。
このユーティリティクラスを利用すると、
指定した型の情報を Json 形式と呼ばれる種類の string 型の文字に変換することが出来ます。
また JsonUtility クラスでは、
string 型の情報を元のクラスの情報に戻す処理も実行することが出来ます。
このように、
情報を書き換えてあげることで、PlayerPrefs クラスのセーブ・ロードができる string 型になりますので、
セーブを行う際に string 型にして保存し、
ロードを行う際にはこの string 型でロードして、その情報を元の型の情報に戻すことで、
PlayerPrefs クラスを利用してセーブとロードが行えるようにします。
処理の流れをまとめます。
<セーブするとき>
・セーブしたい情報(クラス・型)が PlayerPrefs クラスに対応している型ではないため、そのままでは自作クラスや、時間の情報などをセーブできない。
↓
・セーブしたい情報がクラスの場合、JsonUtility クラスの ToJson メソッドを利用して、セーブしたい情報(クラス・型)を string 型(Json 形式)に変換する。
セーブしたい情報が時間(DateTime 構造体)の場合、ToString メソッドを利用して、string 型に変換する。
↓
・この string 型の情報を PlayerPrefs クラスの SetString メソッドと Save メソッドを利用してセーブする。
<ロードするとき>
・string 型でセーブしてある情報を PlayerPrefs クラスの GetString メソッドを利用してロードをする。
↓
・ロードした情報(クラス・型)が string 型のため、そのままではセーブする前のクラスの情報として活用できない。
↓
・ロードした情報がクラスの場合、JsonUtility クラスの FromJson メソッドを利用して、string 型(Json 形式)をロードしたい情報(クラス・型)に変換して復元する。
これは、セーブした際の情報の型とロードする際の情報の型が同じもの同士で処理が行える。
ロードした情報が時間(DateTime 構造体)の場合、DateTime 構造体の持つメソッドを利用して変換して復元する。
↓
・セーブする際の情報(クラス)に復元されるので、この情報をまたゲームで利用する
簡単な処理ではありませんので、しっかりと処理の流れを把握してください。
JSON(JavaScript Object Notation)とは「JavaScriptのオブジェクト記法を用いたデータ交換フォーマット」です。
様々な言語でサポートされているため、この情報を活用することにより、他の言語間のデータの受け渡しを簡単にするための機能ですが、
今回の場合は、string 型の情報になり、その後、クラスとして復元できる部分に活用しています。