(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

ScriptableObjectの変更した値が戻ってしまう場合の対処法【Unity】【ScriptableObject】【トラブルシューティング】


このエントリーをはてなブックマークに追加


この記事でのバージョン
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上では値が正常に変更されたように見えますが、

f:id:kan_kikuchi:20180226171132j:plain


Playボタンを押した時やUnityを再起動した時等に、変更した値が戻ってしまいます。

今回はこういう場合の対処法です。


原因と対処法

原因は変更が.assetファイルに反映されていないからです。

これは、.assetファイルの作成日や変更日が更新されていない事からも分かります。


f:id:kan_kikuchi:20180226173309j:plain
f:id:kan_kikuchi:20180226173221j:plain


対処法は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上で直接値を入力した場合はこういう問題は起きません。

参考