引き続きUnityでツールを作っていたときのことです。
EditorWindowを継承し、
カスタムなウィンドウを作り、中身の処理を作っていました。
必要な処理を一通り実装し終えて動作のテスト中、
とある不具合が起こっていることに気がつきました。
ツールの基本動作として、ウィンドウを開いた後、
ユーザーがオブジェクトを指定しボタンを押すと、
必要情報を集めます。
その後 ウィンドウを開いたままUnityを実行すると
ツールクラス内でメンバとして保持している一部の情報が喪失してしまいます。
リストが空になったり、確保したクラスがnullになったり。
頻度にブレがあるわけでもなく、実行すると必ず喪失する現象が起きます。
喪失しなかったのは オブジェクト指定や調整値、Toggle用フラグなど、
調査し始めでは 共通点のないものばかりに見えました。
しかし詳しく調べていくと、
喪失していない様に見えたオブジェクト指定も、
GetInstanceID()の結果が違っていることが分かりました。
結果としては、メンバ変数にSystem.Serializable属性が付いていないのが、
喪失の原因だったわけです。
メンバの構成が、そのままScriptableObjectとしても保存できるようになっていないと、
実行時に喪失してしまうようです。
確かに喪失したメンバは
子クラスで定義してまとめていたデータや、そのリストが対象でした。
違う視点から考えると、
指定を保存していたオブジェクトのGetInstanceID()が変わっていたのも、
非実行時に置いていたオブジェクトと同じな訳ではなく、
ゼロから全オブジェクトを生成しなおし、
各パラメータを実行前から実行後に”ウィンドウ内部も含めて”上書きしていただけだったようです。
ツールも一先ず完成し、
Unityの挙動も知れたということで、一石二鳥なできごとでした。