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

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Unityでゲーム内データをJson形式にして保存する

More than 1 year has passed since last update.

こんにちは、現在個人でゲームを作っているのですが
その中で実装したセーブデータの保存・読み込みについて書かせていただきます。

用意するもの

Json.NET  = クラスをJSON化するために必要
参考にさせていただいたサイト
http://spi8823.hatenablog.com/entry/2016/04/16/001641

のみです。

コード

通常であればサーバーなどに保存したりしますが今回サンプルとして保存先はPlayerPrefsとします。(用途に合わせて保存場所は変えてください)
PlayerPrefsは簡単に中身の書き換えや見ることが可能なので本来はセーブデータを保存するのには向きません。
(私はゲームの設定などの保存などにPlayerPrefsを使っています)

SaveLoad.cs
using UnityEngine;
using Newtonsoft.Json;

class SaveLoad: MonoBehaviour {
    public class CharacterData //キャラクターデータクラス
    {
        public string userName = "デザートイーグル";
        public int userLV = 50;
        public int birthdayYear = 1979;
        public string comment = "中二病の象徴";
    }

    CharacterData chara = new CharacterData();

    /// <summary>
    /// データの保存を行う
    /// </summary>
    public void Save()
    {
        if (chara != null)//キャラデータがない場合不具合が発生している場合があるのでLogErrorとして通知しておく
        {
            string jsonStr = JsonConvert.SerializeObject(chara); //クラスをJson化
            PlayerPrefs.SetString("playerData", jsonStr); //PlayerPrefsにデータを保存  第1引数は任意
        }
        else
        {
            Debug.LogError("キャラクターデータがないよ!");
        }
    }

    /// <summary>
    /// データのロードを行う
    /// </summary>
    public void Load()
    {
        string loadJsonStr = PlayerPrefs.GetString("playerData", ""); //データのロード 第2引数は設定されていなかった場合の空データ設定
        if (string.IsNullOrEmpty(loadJsonStr)) //セーブデータがない場合無駄な処理を行わないためのif文
        {
            Debug.Log("セーブデータはないよ!");
        }
        else
        {
            CharacterData loadClass = JsonUtility.FromJson<CharacterData>(loadJsonStr);
        }

    }
}

変換処理が両方とも1行で済むのがいいですね。

string jsonStr = JsonConvert.SerializeObject(chara);

今回の肝となるのがこのコードでCharacterDataクラスをJson(string)に変換しています。
このコードでは下記のように変換されます。
{"userName":"デザートイーグル","userLV":50,"birthdayYear":1979,"comment":"中二病の象徴"}

nullチェックを行っているのはもし何かしらの不具合でキャラデータが消えてしまった場合、
nullの状態でセーブされてしまうのでセーブデータが壊れたり消えたりしてしまうのを避けるためです。

string jsonStr = JsonConvert.SerializeObject(null); 

とやった場合jsonStrはnullとなります。

もう一つの肝となるのは下記のコードです。

CharacterData loadClass = JsonUtility.FromJson<CharacterData>(loadJsonStr);

JsonUtility  ※こちらはUnity機能です。
https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html

こちらはJson形式の文字列をCharacterData型に変換しています。
上記によりloadClassの中身は
無題1111.png
となります。

実際のゲームを作る際に暗号化などの問題も出ますが今回は省かせていただきました。

ryouhei_de
デザートイーグルが大好きです 気の弱いboyです
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