- PlayerPrefsは使わない、セーブでレジストリ汚さないようにしたい
- DontDestroyObjectは非推奨らしいし別の方法でデータ受け渡ししたい
- データ受け渡しの処理を書く労力をなるべく減らしてシーン間を低依存にしたい
今のところ色々調べた結果の机上の空論的な実装案が↓
Awake()
→ScriptableObjectをInstantiate?(Valueは初期値)
→セーブ用JSONから値をロード
→ScriptableObjectに値を展開
→各GameObjectのStart()でScriptableObjectの値を見て初期化
→ゲームの進行に合わせて適宜ScriptableObjectを更新
→ScriptableObjectの値でJSONを更新してセーブ
いちおうセーブクラスこんな感じでできた。
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
public class SaveManager : MonoBehaviour
{
public string filePath;
public SaveDataScriptableObject saveDataValues;
private void Awake() {
filePath = Application.persistentDataPath + "/" + ".savedata.json";
Load();
}
public void Save() {
byte[] saveDataBinary = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(saveDataValues));
File.WriteAllBytes(filePath, saveDataBinary);
Debug.Log("Save as: " + filePath);
}
public void Load() {
string saveDataJson = System.Text.Encoding.UTF8.GetString(File.ReadAllBytes(filePath));
JsonUtility.FromJsonOverwrite(saveDataJson, saveDataValues);
Debug.Log("Load from: " + filePath);
}
}
実際には以下のように制御する想定。
タイトルシーン
→Load()
→ゲームシーン遷移↔ScriptableObjectの値を読み書き
→Save()