見出し画像

Unityでjsonを使ったセーブ・ロード

Unityのセーブ機能はいくつかあるが、その中でも、多くの型をセーブすることができるjsonをつかったセーブについて、色々調べて、できたので書く

<環境>
macOS Catalina  10.15.3
Unity2019.3.6f1

コード

using UnityEngine;
using System.IO;

public class SaveSystem
{
   //セーブ
   public static void Save(object instance, string PATH, bool overWrite = false) {
       string jsonstr = JsonUtility.ToJson(instance);
       var writer = new StreamWriter(PATH, overWrite);
       writer.Write(jsonstr);
       writer.Flush();
       writer.Close();
       Debug.Log("Saved!");
   }

   //ロード
   public static string Load(string PATH) {
       var reader = new StreamReader(PATH);
       string json = reader.ReadToEnd();
       reader.Close();
       Debug.Log("Loaded!");
       return json;
   }
}

説明

セーブ機能
     ー 第1引数 セーブしたいインスタンス、
     ー 第2引数 保存するファイルのパス
     ー 第3引数 上書きする(false)、続けて書く(true) 省略化(falseになる)
     ー 返り値 void

ロード機能 
     ー 第1引数 セーブしたいファイルのパス、
     ー 返り値 string (jsonデータが格納されている)

使い方

・Assetフォルダに新しくSaveDataというフォルダをつくる
・上のコードをAssetフォルダ以下のどこかに置く
・以下のように使う

using UnityEngine;

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

}


public class Check_Save : MonoBehaviour
{
   //保存するファイルのパス
   private string PATH;

   void Start() {
       //SAVE_FILE_NAMEは "hoge.json" のようなファイル名
       PATH = Application.dataPath + "/SaveData/" + SAVE_FILE_NAME;
   }

   //セーブしたいクラス or 構造体 をインスタンス化
   SaveData saveData = new SaveData();

   void Update() {
       //Sキーをおしてセーブ    
       if(Input.GetKeyDown(KeyCode.S)) {
           saveData.x = 10;
           saveData.y = "test";
           saveData.z = true;

           SaveSystem.Save(saveData, PATH);

     //Lキーをおしてロード
       } else if(Input.GetKeyDown(KeyCode.L)) {
           var Data
             = JsonUtility.FromJson<SaveData>(SaveSystem.Load(PATH));

           Debug.Log(Data.x);    //10
           Debug.Log(Data.y);    //test
           Debug.Log(Data.z);    //true
       }
   }
}

セーブは
SaveSystem.Save(インスタンス , パス)
ロードは
var インスタンス = JsonUtility.FromJson<SaveData>(SaveSystem.Load(パス));

上記のコードはhoge.json(hogeは任意の名前)がassetフォルダ下のSaveaDataファイルに保存される

まとめ・反省

セーブ・ロードを1行で書くことができるようになった。
しかし、ロードが少しめんどくさい書き方をする必要があるので、改善が必要と思う

「Unityでjsonを使ったセーブ・ロード」終

この記事が気に入ったらサポートをしてみませんか?