Edited at

Unityでゲーム内データをJson形式にして保存する

More than 1 year has passed since last update.

こんにちは、現在個人でゲームを作っているのですが

その中で実装したセーブデータの保存・読み込みについて書かせていただきます。


用意するもの

Json.NET  = クラスをJSON化するために必要

参考にさせていただいたサイト

http://spi8823.hatenablog.com/entry/2016/04/16/001641

のみです。


コード

通常であればサーバーなどに保存したりしますが今回サンプルとして保存先はPlayerPrefsとします。(用途に合わせて保存場所は変えてください)

PlayerPrefsは簡単に中身の書き換えや見ることが可能なので本来はセーブデータを保存するのには向きません。

(私はゲームの設定などの保存などにPlayerPrefsを使っています)


SaveLoad.cs


using UnityEngine;
using Newtonsoft.Json;

class SaveLoad: MonoBehaviour {
public class CharacterData //キャラクターデータクラス
{
public string userName = "デザートイーグル";
public int userLV = 50;
public int birthdayYear = 1979;
public string comment = "中二病の象徴";
}

CharacterData chara = new CharacterData();

/// <summary>
/// データの保存を行う
/// </summary>
public void Save()
{
if (chara != null)//キャラデータがない場合不具合が発生している場合があるのでLogErrorとして通知しておく
{
string jsonStr = JsonConvert.SerializeObject(chara); //クラスをJson化
PlayerPrefs.SetString("playerData", jsonStr); //PlayerPrefsにデータを保存  第1引数は任意
}
else
{
Debug.LogError("キャラクターデータがないよ!");
}
}

/// <summary>
/// データのロードを行う
/// </summary>
public void Load()
{
string loadJsonStr = PlayerPrefs.GetString("playerData", ""); //データのロード 第2引数は設定されていなかった場合の空データ設定
if (string.IsNullOrEmpty(loadJsonStr)) //セーブデータがない場合無駄な処理を行わないためのif文
{
Debug.Log("セーブデータはないよ!");
}
else
{
CharacterData loadClass = JsonUtility.FromJson<CharacterData>(loadJsonStr);
}

}
}


変換処理が両方とも1行で済むのがいいですね。

string jsonStr = JsonConvert.SerializeObject(chara);

今回の肝となるのがこのコードでCharacterDataクラスをJson(string)に変換しています。

このコードでは下記のように変換されます。

{"userName":"デザートイーグル","userLV":50,"birthdayYear":1979,"comment":"中二病の象徴"}

nullチェックを行っているのはもし何かしらの不具合でキャラデータが消えてしまった場合、

nullの状態でセーブされてしまうのでセーブデータが壊れたり消えたりしてしまうのを避けるためです。

string jsonStr = JsonConvert.SerializeObject(null); 

とやった場合jsonStrはnullとなります。

もう一つの肝となるのは下記のコードです。

CharacterData loadClass = JsonUtility.FromJson<CharacterData>(loadJsonStr);

JsonUtility  ※こちらはUnity機能です。

https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html

こちらはJson形式の文字列をCharacterData型に変換しています。

上記によりloadClassの中身は



となります。

実際のゲームを作る際に暗号化などの問題も出ますが今回は省かせていただきました。