トーフメモ

主にゲーム制作

【Unity】データセーブロードをするためにJsonUtilityを使ってみた

f:id:tofgame:20190428235628j:plain

Unityでのセーブロードの話
今まではcsvファイルにデータを読み書きしていました。
でもcsvだとなんか重い・・・?
というわけで、Jsonファイルに読み書きをしようと思い試してみました。

DataManager.cs

using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class DataManager : SingletonMonoBehaviour<DataManager> {
  //=============================================================
  [System.Serializable]
  public class Data {
    public List<int> HiScore = new List<int>();
  }

  public Data RunningData;

  private string dataFilePath;

  //=============================================================
  private void Init () {
    //Instance化をすでにしてるなら
    if(this != Instance) {
      Destroy(this);
      return;
    }

    DontDestroyOnLoad(this.gameObject);
  }

  private void Awake () {
    Init();
    dataFilePath = Application.persistentDataPath + "/Data.json";

    RunningData = LoadData();
    if(RunningData == null) {
      RunningData = CreateData();
      SaveData(ConvertDataToJson(RunningData));
    }
  }

  //=============================================================
  /// <summary>
  /// セーブデータの作成
  /// </summary>
  public Data CreateData () {
    Data data = new Data();
    data.HiScore.Add(0);

    return data;
  }

  //=============================================================
  /// <summary>
  /// セーブデータをjsonに変換
  /// </summary>
  public string ConvertDataToJson (Data data) {
    return JsonUtility.ToJson(data);
  }

  //=============================================================
  /// <summary>
  /// データをセーブ
  /// </summary>
  public void SaveData (string jsonData) {
    using(var file = new FileStream(dataFilePath,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite)) {
      byte[] bytes = System.Text.Encoding.UTF8.GetBytes(jsonData);

      file.Write(bytes,0,bytes.Length);
    }
  }

  //=============================================================
  /// <summary>
  /// データをロード
  /// </summary>
  public Data LoadData () {
    using(var file = new FileStream(dataFilePath,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite)) {
      byte[] bytes = new byte[file.Length];

      file.Read(bytes,0,bytes.Length);
      string jsonData = System.Text.Encoding.UTF8.GetString(bytes);

      return JsonUtility.FromJson<Data>(jsonData);
      }
    }
  }

終わりに

データを使いたいシーンにこれをアタッチしたオブジェクトを配置して使います。
まだまだ改良していきます。

参考にしたページ

[Unity]セーブデータにJSONを使う | スマホRPG「RogueLive」公式ブログ
[Unity]シングルトンを使ってみよう - Qiita