Unity

【Unity】LitJsonを使用してデータを超カンタンにセーブする

More than 1 year has passed since last update.

!!注!! https://qiita.com/Ijoru/items/b68692fe4c8065041a86 にJsonUtility版の記事をアップしました。

今後は↑を使用していただいた方が、きっと幸せになれます。


LitJsonとはC#で使えるJSONライブラリで、Unityでも使用可能です。

ライセンスはパブリックドメインなので、いつでもどこでも気軽に使えます。

今回は、こちらを使用してUnityでデータを超カンタンにセーブする方法をご紹介します。


LitJsonのダウンロード

まずはLitJsonをダウンロードします。

http://lbv.github.io/litjson/


LitJsonをUnityに放り込む

LitJson.dllをUnityにドラッグ&ドロップするだけです。

ラクチン。


セーブ用の基底クラスの準備

もちろんLitJsonを使って直接JSONを読み書きしても構いませんが、今回は超カンタンということでセーブ用基底クラスを準備します。


C#

using UnityEngine;

using System;
using System.Collections;

abstract public class SavableSingleton<T> where T : SavableSingleton<T>, new()
{
private static T instance;

public static T Instance
{
get
{
if (null == instance)
{
LitJson.JsonMapper.RegisterExporter<float>((obj, writer) => writer.Write(Convert.ToDouble(obj)));
LitJson.JsonMapper.RegisterExporter<decimal>((obj, writer) => writer.Write(Convert.ToString(obj)));
LitJson.JsonMapper.RegisterImporter<double, float>(input => Convert.ToSingle(input));
LitJson.JsonMapper.RegisterImporter<int, long>(input => Convert.ToInt64(input));
LitJson.JsonMapper.RegisterImporter<string, decimal>(input => Convert.ToDecimal(input));
var json = PlayerPrefs.GetString(GetSaveKey());
if (json.Length > 0)
{
instance = LitJson.JsonMapper.ToObject<T>(json);
}
else
{
instance = new T();
}
}
return instance;
}
}

public void Save()
{
PlayerPrefs.SetString(GetSaveKey(), LitJson.JsonMapper.ToJson(this));
PlayerPrefs.Save();
}

public void Reset()
{
PlayerPrefs.DeleteKey(GetSaveKey());
instance = null;
}

private static string GetSaveKey()
{
return typeof(T).FullName;
}
}


インスタンス生成時にJSONからデータを自動ロード、Save()メソッドでJSONにデータを保存します。

PlayerPrefs以外にJSONを保存したい場合は適当にいじっちゃってください。


使ってみよう

では実際に使ってみましょう。

まずはデータを格納するクラスを準備します。

(このクラスのプロパティがセーブされます


C#

using UnityEngine;

using System.Collections;
using System.Collections.Generic;

public class TestSaveData : SavableSingleton<TestSaveData>
{
public enum ItemNames {
Hoge,
Fuga
}

public string playerName = "";
public int experience = 0;
public List<Names> items = new List<Names>();
}


ちなみに、LitJsonではlong、floatは使えません。(ロード時に型変換に失敗してコケます)

int、double、stringなどを使いましょう。


(2015/04/15追記) LitJsonでのlong、floatの扱い方をご教授いただいたため、long、floatも扱えるようSavableSingletonを改良しました!ついでにdecimalが桁落ちするようでしたので、併せて修正しました。

また、上記ルールに添っていれば配列やオブジェクトもそのまま保存/復元が可能なので超便利です。

そして、下記でセーブ実行。


C#

TestSaveData.Instance.playerName = "Cat";

TestSaveData.Instance.experience = 10;
TestSaveData.Instance.items.Add(TestSaveData.ItemNames.Hoge);
TestSaveData.Instance.items.Add(TestSaveData.ItemNames.Fuga);
TestSaveData.Instance.Save();

セーブしたデータはTestSaveData.Instanceを初めて呼び出した際に勝手にロードされます。

例えば次回のゲーム起動時に下記コードを実行すると、「Cat」と出力されるワケです。


C#

Debug.Log(TestSaveData.Instance.playerName);