よくわからず使っていたのが間違い。
単純に 呼ぶべき関数を呼んでなかったってだけです。
AssetPostprocessorクラスを使って、txtファイルをScriptableObjectに変換してシナリオテキストの保存に使っています。
(TextAssetで読むのもありかもしれないがSystem.IOが使えない場合があるのでこうしている)
で、OnPostprocessAllAssets()でインポートor変更されたテキストファイルに対して、
AssetDatabase.CreateAssetでScriptableObjectを生成して。。とやっていたのですが、エディター上で「Play」押すたびに中身が消える現象が発生。
生成した直後。ScenarioDataはtxtデータをシンプルにstringのリストに格納するだけのリスト。
この状態でPlayを押すと
ウウオアアアーー!
.assetファイルが入っているフォルダを見に行くと
タイムスタンプが更新されてない。
すなわちエディタ上で入ったように見えたデータが保存されていないってことですね。
開発環境がWindows8.1なので、OS側の管理者権限問題か?と思ってたら違いました。
結論は、
「AssetDatabase.SaveAssets();」だけじゃ保存してくれないのよ というわけでした。
以下、手順メモ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void CreateScriptableObjectAndSave(string assetPath)
{
//アセットの生成//
AssetDatabase.CreateAsset ((ScriptableObject)someScriptableObject, assetPath);
//変更ここから//
AssetDatabase.StartAssetEditing();
//ここで生成したScriptableObjectにデータを入れる処理//
//変更ここまで//
AssetDatabase.StopAssetEditing();
//変更をUnityEditorに伝える//
EditorUtility.SetDirty(someScriptableObject);
//すべてのアセットを保存//
AssetDatabase.SaveAssets();
}
ちゃんと「ここからここまでが編集、あとUnityにもデータ更新があったことを伝える」
をやらないとだめらしい。
生半可にこったことやろうとするとこういうのにハマりますね。。。