Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
65
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@Ijoru

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

!!注!! 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
65
Help us understand the problem. What are the problem?