ScriptableObjectのデータ保存
今回のお仕事で管理画面での設定データをScriptableObjectに保存。今回はResourcesフォルダに保存してシングルトンとしてデータを書き換えられるようにした。ScriptableObjectはUnityEditor上では再生時に値を書き換えたりしても値が戻らないけど、書き出した時は話が別。
(UnityEditor上でもビルドとかすると値が戻ったりするけど)
そこで、Jsonで保存/リストアができるように。
ScriptableObjectからへのエンコードにはJsonUtilityを使用。JsonUtilityって外部APIから持ってきたJsonを扱うには変な感じだなと思ってたけど、UnityでのSerializableなオブジェクトを扱う用のものなんですね。
using UnityEngine; using UnityEngine.UI; public class Main : MonoBehaviour { /// <summary> /// 設定ファイルで設定したenemyNumの表示用。 /// </summary> [SerializeField] Text enemyNumTxt; /// <summary> /// Awake. /// </summary> void Awake() { ++Settings.Instance.enemyNum; enemyNumTxt.text = Settings.Instance.enemyNum.ToString(); Settings.Instance.Save(); } }
using UnityEngine; /// <summary> /// クラスメイト同名のアセットからScriptableObjectをシングルトンとして扱う。 /// </summary> public abstract class SingletonScriptableObjectFromResources<T> : ScriptableObject where T : ScriptableObject { /// <summary> /// シングルトン。 /// </summary> static T instance = null; public static T Instance { get { if (!instance) instance = Resources.Load<T>(typeof(T).Name); return instance; } } }
using System; using System.IO; using UnityEngine; [CreateAssetMenu(menuName = "Settings/Create Settings", fileName = "Settings")] public class Settings : SingletonScriptableObjectFromResources<Settings> { /// <summary> /// Jsonを保存するパス。 /// </summary> public static string JsonPath { get { return Application.persistentDataPath + "/" + "Settings.json"; } } /// <summary> /// 敵の数。 /// </summary> public int enemyNum; /// <summary> /// 制限時間。 /// </summary> public float timeLimit; /// <summary> /// ステージにあるアイテム。 /// </summary> public Item[] item; /// <summary> /// OnEnable. /// </summary> public void OnEnable() { this.Restore(); } /// <summary> /// データを復元。 /// </summary> public void Restore() { #if !UNITY_EDITOR if (File.Exists(Settings.JsonPath)) { string json = File.ReadAllText(Settings.JsonPath); try { JsonUtility.FromJsonOverwrite(json, this); } catch (Exception e) { throw e; } } #endif } /// <summary> /// 保存。 /// </summary> public void Save() { string json = JsonUtility.ToJson(this); StreamWriter writer = new StreamWriter(Settings.JsonPath); try { writer.Write(json); writer.Flush(); } catch (Exception e) { throw e; } finally { if (writer != null) writer.Dispose(); } } /// <summary> /// アイテムデータ。 /// </summary> [System.Serializable] public class Item { public int id; public Vector3 pos; } }
18.04.10 追記) UnityEditor上で編集すると値が戻ってしまうので、UnityEditor上ではJsonから復元しないように修正
コメントを残す