【Unity】データの保存方法
ゲームを開発する時に、データを保存するためにはどうすればいいか悩んだので、調べた結果をまとめます。結論、JsonUtilityがメンテナンス性、拡張性、データの読み出し書き出し高速化の観点において良さそうです。
1.PlayerPrefsを利用する
1.1 実装方法
float 型、int 型、string 型しかサポートしていないセーブ方法です。実装する時は次のようなかたちで行います。
public void SavePrefs()
{
PlayerPrefs.SetInt("Volume", 50);
PlayerPrefs.Save();
}
public void LoadPrefs()
{
int volume = PlayerPrefs.GetInt("Volume", 0);
}
1.2デバイスごとのデータ保存場所
デバイスによって異なります。
他にもLinuxやWebGLなどの詳細はこちらに書いてあります。
2.【API】JsonUtilityを利用する
1.1 実装方法
JSONファイルを利用した保存方法で実装する時は次のようなかたちで行います。
//データの定義
[System.Serializable]
public class Data
{
public int hp;
public int attack;
public int defense;
}
//データの設定
Data player = new Data();
player.hp = 100;
player.attack = 20;
player.defense = 7;
string jsonstr = JsonUtility.ToJson(player);
Debug.Log(jsonstr);
//データの読み出し
Player player2 = JsonUtility.FromJson<Player>(jsonstr);
Debug.Log(player2.hp);
Debug.Log(player2.attack);
Debug.Log(player2.defense);
1.2デバイスごとのデータ保存場所
アプリ内部に保存されます。
開発中はApplication.persistentDataPathというフィールドが提供され、そこに保存されます。これは「永続的な」ディレクトリで、プロジェクトの開始時に設定され、スクリプト コンポーネント内のメソッドAwake()またはStart()で利用できます。
1.3 JsonUtilityとEditorJsonUtilityの違い
JsonUtilityに関連してEditorJsonUtilityというAPIもあり、これらは3点違いがあります。
1点目にEditorJsonUtilityはUnityEngine.Objectがシリアライズできます。つまりUnity のエンジン型に対応しているのです。
2点目の違いがバックグランドスレッドです。EditorJsonUtilityはバックグランドスレッドでは利用できません。(並列処理では使えないということです。)
最後の3点目の違いはインターフェイスに関してです。インターフェイスではJsonUtilityではオブジェクトを返すものと、オーバーライドして返すものの2種類のインターフェイスがあります。対してEditorJsonUtilityはオーバライドしかありません。
個人的にはバックグランドスレッド処理できるという点でJsonUtilityの方が汎用性は高いように思えました。
3.無料アセットを利用する
3.1 EasySaveを利用する
3.2 JSON.NETを利用する
他にもXMLファイルを利用する方法やライブラリBinaryFormatterを利用する方法がありますが、ここでは割愛します。参考にしたサイトはこちらです。