エディタ拡張における値の変更チェック | Unity3D
GUI.changedは出来る奴だ
MMD4MecanimFaciemを作リ始めた当初、拡張したGUIで値が変更されたかどうかチェックするために「前の値を保存しておいて、GUIコントロールを表示した後の値と比較する」なんてことをやっていた訳ですが、もっと便利なGUI.changedなんてものがあると途中で気付き。。。
おそいよ!もっと早く教えてよ!と涙目になったわけです。
そんな悲劇を繰り返さないよう、一応紹介しておきます。
紹介と言っても簡単なので、公式Unityのリファレンスをペタっと。
まぁ、要はコントロールの値が変更されたらGUI.changedが勝手にtrueになるわけですね。
何故変更有無を知りたかったのか
2つ理由がありました。
1. シーンの変更フラグを建てたかった
普通に作ったエディタ拡張でコンポーネントの値を変更してもUnityEditorはシーンが変更されたと思ってくれない。SetDirtyを実行しているのにです。お陰で手動でのシーン保存を忘れてUnityEditorを終了させようものなら、「保存しますか?」の一言もなしにそれまでの変更内容が破棄されます。合掌。。。
なので、拡張エディタのGUIで値が変更されたらEditorApplication.MarkSceneDirty()を実行してシーン変更フラグを建てあげるわけです。そうすると、終了時に「保存しますか?」という気の利いた一言を投げかけてくれるようになります。やったぜ!
2. 無条件でSetDirtyを実行するとシーンビューがチラチラする
MMD4MecanimFaciemの開発中にあることに気づきました。シーンビューにおいて、なんだか知らないがMMD4MecanimModelのミクさんのコライダーが常時細かくチラチラしてる。と。
結局のところ、OnInspectorGUI関数の中で常にMMD4MecanimModelコンポーネントに対しSetDirtyを実行していたのですが、コレが原因でした。なので必要があるときだけSetDirtyした方がいいんだなと。まぁ、当たり前の事に改めて気付かされたわけですね。
で、これもGUI.changedのお陰で簡単に解決できました。チラチラしない。やったぜ!