まるコットでメモ的な何か

Unityでシーン遷移時にデータを受け渡したいしセーブロードもしたい

  • 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()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です