!!注!! 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を読み書きしても構いませんが、今回は超カンタンということでセーブ用基底クラスを準備します。
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を保存したい場合は適当にいじっちゃってください。
使ってみよう
では実際に使ってみましょう。
まずはデータを格納するクラスを準備します。
(このクラスのプロパティがセーブされます
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が桁落ちするようでしたので、併せて修正しました。
また、上記ルールに添っていれば配列やオブジェクトもそのまま保存/復元が可能なので超便利です。
そして、下記でセーブ実行。
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」と出力されるワケです。
Debug.Log(TestSaveData.Instance.playerName);