ScriptableObjectの参照が外れる(値が書き換わる)問題の解決方法

Unityプロジェクトでマスターデータをインポートして保持するのに、ScriptableObjectを使う方法が一般的です。

僕も普段からCSVファイルやGoogleスプレッドシートにマスターデータを入力して、UnityエディタからインポートしてScriptableObjectを生成して保存しています。

具体的には親となるScriptableObjectにList型の変数を作り、そのList型変数に各データのScriptableObjectを追加していく、という方法を取っています。

こんな感じ。

しかし、実行時やUnity再起動時など、たまにScriptableObjectのリストに入れた各データが消えてしまうことがありました。

これでは実行時に毎回インポートし直さなくてはならないため、かなり不便です。

これを解決する方法を調べました。

ちなみに今回はScriptableObjectのList型変数にScriptableObjectを入れる場合について具体例として書きましたが、
ScriptableObjectの何かしらの変数をスクリプトから書き換える場合も同様のことが起こるので、その変数の値が元に戻ってしまって困っている方もこの記事の対象読者です。

原因

まず、Projectビューで参照が外れてしまう(値が書き換わる)ScriptableObjectを右クリックし、「Reveal in Finder」を選択します。

Finderが開かれ、対象のScriptableObjectのassetファイルが表示されます。

このファイルの更新日時を確認してみてください。

ScriptableObjectに値を入力した日時に更新されていないのが分かります。

つまり、Unityエディタのインスペクタ上では変更されたように見えたファイルですが、実は.assetファイルは変更されていなかったのです。

解決方法

データのインポート&ScriptableObjectの生成など、スクリプトからScriptableObjectの値を変更した場合は、変更後に以下のコードを書きましょう。

EditorUtility.SetDirty(対象のScriptableObject);
AssetDatabase.SaveAssets();

一行目は対象のScriptableObjectが変更されたことを通知する処理。
二行目は変更されたファイルを保存する処理です。

EditorUtilityを使用するには

using UnityEngine.Editor;

が必要です。

この処理をScriptableObjectの値を変更した後に実行することでファイルが保存され、Finderの更新日時も更新されます。

コメント