Help us understand the problem. What is going on with this article?

【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);
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした