ScriptableObjectはなぜセーブデータに使えないのか
どこを探しても「セーブデータには使えない」と書かれているScriptableObjectですが、
その理由は見るページによって「ゲーム終了時に値が初期化されてしまう」だったり「実行時にリセットされる」だったりと、どちらなのかよく分かりませんが、要するに値の保存ができないというものです。
しかし、実行時に値の変更はできるようです。
さらに、ランタイムでAssetを作成することもできるっぽい。
じゃあ、実行時に値を変更したScriptableObject(のAsset)を適当なフォルダに保存して、次はそれを読み込めばセーブデータとして使えるのでは?
※Unity&C#1年生並みの感想
というわけでやってみようとしてみた。
Resources以下にItemという名前のScriptableObjectを配置しておきます。
適当なGameObjectに、ScriptableObjectを保持するだけのスクリプトをアタッチ。
そこにItemをアタッチ。
ボタンを押すとこんな感じのスクリプトが呼び出されるようにする。
上記GameObjectのHoldingItemが保持しているItemというScriptableObjectを取得し、
それをAssets/Saveフォルダに、SaveDataという名前のアセットとして保存する、というもの。
コンパイルは通りますが……
実行するとエラー。
Itemは既にAssets/ResourcesフォルダにあるYO!
というエラーらしい。
は? だから別のフォルダに別の名前で保存するように言ってるやんけ
と思いますが、そういう仕様なのでできないのでしょう。
該当ScriptableObjectをインスタンス化→保存ならどうだ……
と思いましたが、ScriptableObject.CreateInstanceは型しか引数に取れないので、結局実行時に変更されたScriptableObjectは取得できませんでした。
結論:ScriptableObjectはセーブデータには使えない
以上。