少し前にScriptableObjectの記事を書いた。
元々セーブ機能を作りたくて調べた上記の機能であるが、Unityエディタでは問題なく動くのに、実機だと動かない。
動かないというかアセットファイルの値を変更できないので、セーブができない。
ScriptableObjectから作られたアセットファイルの値はUnityエディタから変更できても、実機(iPhoneとかAndroidのスマホ、ゲーム機など)で実行された場合は変更できないんです。
そこでどうしたかというと、StreamWriter
や`StreamReader`を使って、Application.persistantDataPath
にデータを読み書きすることにした。
ここならアプリがバージョンアップされてもデータは恒久的に残るらしい。
実装するに当たって、以下の記事がシンプルで分かりやすかったので参照した。
https://qiita.com/kengkong/items/3fe34ce5e1af89b2adb3
ScritableObjectを継承したデータ保存用クラスの代わりに、Serializeした別のデータ保存用クラスを作成し、以下のコードで読み書きするようにした。
public void SaveMobileData(MobileData data) { StreamWriter writer; string jsonData = JsonUtility.ToJson(data); writer = new StreamWriter(Application.persistentDataPath + "/savedata.json", false); writer.Write(jsonData); writer.Flush(); writer.Close(); } public MobileData LoadMobileData() { string data = ""; StreamReader reader; reader = new StreamReader(Application.persistentDataPath + "/savedata.json"); data = reader.ReadToEnd(); reader.Close(); return JsonUtility.FromJson<MobileData>(data); }