この記事でのバージョン
Unity 2017.3.1f1
はじめに
例えば以下のようなValueという変数を持つScriptableObjectがあり、
//Valueという変数を持つScriptableObject public class MyScriptableObject : ScriptableObject { public int Value = 0; }
そのScriptableObjectのValueをエディタ上でプログラムから変更したとします。
//ScriptableObjectをロードし、Valueを変更 MyScriptableObject myScriptableObject = Resources.Load<MyScriptableObject>("MyScriptableObject"); myScriptableObject.Value = 100;
すると一見、Inspector上では値が正常に変更されたように見えますが、
Playボタンを押した時やUnityを再起動した時等に、変更した値が戻ってしまいます。
今回はこういう場合の対処法です。
原因と対処法
原因は変更が.assetファイルに反映されていないからです。
これは、.assetファイルの作成日や変更日が更新されていない事からも分かります。
対処法はEditorUtility.SetDirtyで変更があった事を記録し、
AssetDatabase.SaveAssetsで保存するだけ。
なお、どちらもusing UnityEditor;が必要なので注意が必要です。
//ScriptableObjectをロードし、Valueを変更 MyScriptableObject myScriptableObject = Resources.Load<MyScriptableObject>("MyScriptableObject"); myScriptableObject.Value = 100; //ダーティとしてマークする(変更があった事を記録する) EditorUtility.SetDirty(myScriptableObject); //保存する AssetDatabase.SaveAssets();
一応、EditorUtility.SetDirtyだけすれば変更は記録されるので、
その後エディタ上でシーンを保存(cmd+s)すれば変更は反映されるのですが、
念のため保存もプログラムからやりましょう。
ちなみにInspector上で直接値を入力した場合はこういう問題は起きません。
参考