まっつん◆SW1/SWF8io が再起動するようです

ブログを使って日々勉強するよ!

Unityで変数の値がプレビューで反映されない時の解決法

Unity触ってまだ間もないからすげー悩んじゃったけど、これきっとUnity開発者あるある話のひとつなんだろうなぁ。

※Unity4.5.3(C#) Windowsで確認

 

f:id:n_mattun:20140831161609p:plain

発生した問題

スクリプト上で変数の値を変更しても、なぜかプレビュー時にその変数の値が反映されない。

原因

  • Public宣言された変数の場合、プレビュー時はスクリプト上で初期化された変数より、Unity IDE上のHierarcy内の各インスペクタに表示される変数の値が優先的に適用されるため。
  • しかし、Editorフォルダを使ったカスタムUIスクリプトを利用している場合は、カスタムUIスクリプト上で定義された変数しか表示されない。
  • 表示されていないにも関わらず、変数の値はインスペクタ側で保持し続ける(?)という仕様のため、この状態でスクリプト側のPublic変数の値をいじっても、プレビュー時には見えないところでキャッシュされている値を参照し、結果的に変数の値が反映されてないように見えてしまう。

解決方法

インスペクタ側の値をリフレッシュする

インスペクタの歯車アイコン(画像内の黄緑印)からResetを選択すると、インスペクタ上の変数がリフレッシュされ、スクリプト上の変数を参照し直してくれます。

変更したい変数をインスペクタ上に表示する

Asset内のScriptフォルダと同階層にあるEditorフォルダ(画像内の赤印)を開くとカスタムUIを定義しているスクリプトが置いてあるので、そこに自分が追加したい変数の定義を追記する。カスタムUIの定義と変更方法は以下のサイトを参考にどうぞ。

 

○×(まるぺけ)つくろーどっとコム:カスタムエディタ編 その1 Inspectorが変わる!

 

なお、インスペクタ上に変数が表示されても常に値をリフレッシュしてくれるワケではないので、歯車アイコンからのResetは結局必要になるので注意してください。

 

変数をprivateにする

変数をprivateにすればインスペクタ側に変数は展開されなくなるので、常にスクリプト内の変数を参照してくれます。

 

 

OculusでOVRオブジェクト内の変数の役割を把握するために値を変更してもまったく反映されなかったからおかしいなぁと思ったらこんなところに原因があったとは・・・ Unityって罠が多いという触れ込みをちょこちょこ見かけるけど、見事に罠を踏み抜いた感じがするぜチクショー。