69
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-13

!!注!! 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);
69
66
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?