Unityで2DRPGを開発するブログ

Unityで2DRPGを開発する様を綴りたいブログです。

ScriptableObjectはなぜセーブデータに使えないのか

どこを探しても「セーブデータには使えない」と書かれているScriptableObjectですが、

その理由は見るページによって「ゲーム終了時に値が初期化されてしまう」だったり「実行時にリセットされる」だったりと、どちらなのかよく分かりませんが、要するに値の保存ができないというものです。

tsubakit1.hateblo.jp

しかし、実行時に値の変更はできるようです。

さらに、ランタイムでAssetを作成することもできるっぽい。

https://i.gyazo.com/d495596526cde8d03d5a31b708afb18d.gif

じゃあ、実行時に値を変更したScriptableObject(のAsset)を適当なフォルダに保存して、次はそれを読み込めばセーブデータとして使えるのでは?

※Unity&C#1年生並みの感想

というわけでやってみようとしてみた。

 

gyazo.com

Resources以下にItemという名前のScriptableObjectを配置しておきます。

https://i.gyazo.com/4a51e858ba83efa7dab554004fc9c794.png

適当なGameObjectに、ScriptableObjectを保持するだけのスクリプトをアタッチ。

そこにItemをアタッチ。

gyazo.com

ボタンを押すとこんな感じのスクリプトが呼び出されるようにする。

上記GameObjectのHoldingItemが保持しているItemというScriptableObjectを取得し、

それをAssets/Saveフォルダに、SaveDataという名前のアセットとして保存する、というもの。

コンパイルは通りますが……

gyazo.com

 実行するとエラー。

gyazo.com

Itemは既にAssets/ResourcesフォルダにあるYO!

というエラーらしい。

は? だから別のフォルダに別の名前で保存するように言ってるやんけ

と思いますが、そういう仕様なのでできないのでしょう。

該当ScriptableObjectをインスタンス化→保存ならどうだ……

と思いましたが、ScriptableObject.CreateInstanceは型しか引数に取れないので、結局実行時に変更されたScriptableObjectは取得できませんでした。

結論:ScriptableObjectはセーブデータには使えない

以上。