人生メモ

試行錯誤したことの備忘録

【Unity】セーブデータをJsonUtilityを使ってJSON形式で保存する

きちぃ(@whitemoon_kitii)さんがこんなこといっているのを見かけたので

自分が使っているJsonUtilityでゲームデータをセーブする方法を簡単に紹介を。

JsonUtility自体はデータをファイルに保存するものではなくて、クラスインスタンスJSON形式の文字列に変換したり、逆にJSON形式の文字列をクラスインスタンスに変換したりするものです。

こんな感じのゲームデータクラスがあって、

using System;

[Serializable]
public class GameData
{
    public string name;
    public int hp;
    public int mp;
}

これをJsonUtilityでJSON化。

var gameData = new GameData();
gameData.name = "オーエー";
gameData.hp = 25;
gameData.mp = 12;
var json = JsonUtility.ToJson(gameData);
Debug.Log(json);
// File.WriteAllText(Path.Combine(Application.persistentDataPath, "SaveData.json"), json);

クラスインスタンスをJSON化して表示

クラスインスタンスを簡単にJSON文字列化できます。

あとは、PlayerPrefsなりFile.WriteAllTextなりでこの文字列をファイルに保存すれば完了です。

JSONをこのままテキスト保存するとユーザーが改変したい放題なので、普通はさらに暗号化処理を加えたり、ハッシュ等で改ざんチェックできるようにする)

逆にJSONからクラスインスタンスを生成したいときは、こうします。

var gameData = new GameData();
gameData.name = "オーエー";
gameData.hp = 25;
gameData.mp = 12;
var json = JsonUtility.ToJson(gameData);

// こっから復元処理
var saveData = JsonUtility.FromJson<GameData>(json);
Debug.Log(saveData.name + ":" + saveData.hp + ":" + saveData.mp);

JSONからクラスインスタンスを復元

JsonUtilityを使えば、PlayerPrefsで1つずつちまちま変数を保存したり取得したりせずに、クラス単位でどかっと1発で保存・取得できるようになって便利。

配列やList、クラスの入れ子も扱えます。

JsonUtilityの詳しい使い方はググればいくらでも出てくるので、以下のサイトとか、ググって参照で。

qiita.com