読者です 読者をやめる 読者になる 読者になる

MEBIUSTOSのブログ

主にUnityに関する技術的な事を書いていきます。 Twitter @xflutexx

エディタ拡張における値の変更チェック | Unity3D

GUI.changedは出来る奴だ

MMD4MecanimFaciemを作リ始めた当初、拡張したGUIで値が変更されたかどうかチェックするために「前の値を保存しておいて、GUIコントロールを表示した後の値と比較する」なんてことをやっていた訳ですが、もっと便利なGUI.changedなんてものがあると途中で気付き。。。
おそいよ!もっと早く教えてよ!と涙目になったわけです。

そんな悲劇を繰り返さないよう、一応紹介しておきます。
紹介と言っても簡単なので、公式Unityのリファレンスをペタっと。

GUI.changed 公式リファレンス

まぁ、要はコントロールの値が変更されたらGUI.changedが勝手にtrueになるわけですね。

何故変更有無を知りたかったのか

2つ理由がありました。

1. シーンの変更フラグを建てたかった

普通に作ったエディタ拡張でコンポーネントの値を変更してもUnityEditorはシーンが変更されたと思ってくれない。SetDirtyを実行しているのにです。お陰で手動でのシーン保存を忘れてUnityEditorを終了させようものなら、「保存しますか?」の一言もなしにそれまでの変更内容が破棄されます。合掌。。。

なので、拡張エディタのGUIで値が変更されたらEditorApplication.MarkSceneDirty()を実行してシーン変更フラグを建てあげるわけです。そうすると、終了時に「保存しますか?」という気の利いた一言を投げかけてくれるようになります。やったぜ!

2. 無条件でSetDirtyを実行するとシーンビューがチラチラする

MMD4MecanimFaciemの開発中にあることに気づきました。シーンビューにおいて、なんだか知らないがMMD4MecanimModelのミクさんのコライダーが常時細かくチラチラしてる。と。

結局のところ、OnInspectorGUI関数の中で常にMMD4MecanimModelコンポーネントに対しSetDirtyを実行していたのですが、コレが原因でした。なので必要があるときだけSetDirtyした方がいいんだなと。まぁ、当たり前の事に改めて気付かされたわけですね。
で、これもGUI.changedのお陰で簡単に解決できました。チラチラしない。やったぜ!