Unity

【Unity】オブジェクトをJsonにシリアライズしてテキストに保存・読み込みする

ゲームのセーブデータをJsonとしてテキストに保存して読み込むために、その方法を調べたメモとサンプルです。

SaveManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; // UnityJsonを使う場合に必要
using System.IO; // ファイル書き込みに必要

// [Serializable] をつけないとシリアライズできない
[Serializable]
public struct SaveData {
  public int x;
  public int y;

  public void Dump() {
    Debug.Log("x = " + x);
    Debug.Log("y = " + y);
  }
}

/// <summary>
/// セーブデータ管理
/// </summary>
public class SaveManager : MonoBehaviour {

  // 保存するファイル
  const string SAVE_FILE_PATH = "save.txt";

  void Update () {
    if (Input.GetKeyDown (KeyCode.S)) {
      // Sキーでセーブ実行
      var data = new SaveData ();
      data.x = 5;
      data.y = 7;
      // JSONにシリアライズ
      var json = JsonUtility.ToJson (data);
      // Assetsフォルダに保存する
      var path = Application.dataPath + "/" + SAVE_FILE_PATH;
      var writer = new StreamWriter (path, false); // 上書き
      writer.WriteLine (json);
      writer.Flush ();
      writer.Close ();
    } else if (Input.GetKeyDown (KeyCode.L)) {
      // Lキーでロード実行
      // Assetsフォルダからロード
      var info = new FileInfo(Application.dataPath + "/" + SAVE_FILE_PATH);
      var reader = new StreamReader (info.OpenRead ());
      var json = reader.ReadToEnd ();
      var data = JsonUtility.FromJson<SaveData>(json);
      data.Dump();
    }
  }
}

"S"キーを押すと、テキストに保存、"L"キーを押すと、テキストから読み込み、となっています。

"S"キーで保存したテキスト
{"x":5,"y":7}

"L"キーでJsonテキスト読み込み
Unity_2017_1_0f3_Personal__64bit__-_Main_unity_-_UnityRL_-_PC__Mac___Linux_Standalone__Personal___OpenGL_3_3_.png

注意点は

  • using System; しないと UnityJson が使えない([Serializable]も使えない)
  • using System.IO がファイル書き込みに必要

ですね

参考