
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を使ったセーブ・ロード」終