土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

Unity Tips(7:処理タイミング関係)

Debug.break()は何をしているのか

 Debug.break()を実行すると、Unityエディタでポーズボタンを押した時と同様に処理が一時停止します。実行時には以下の2点に気をつけてください。
・単にポーズがかかるだけで、デバッガがアタッチしていてもブレークが発生するわけではない。
・ポーズがかかるのはDebug.break()が実行された瞬間ではなく、実行されたフレームが終了し、次のフレームに入る前。
 ちなみにDebug.DebugBreak()というメソッドもあるけど、リファレンスには掲載されておらず、実行してもなにも起きない模様。

Debug.LogError()は何をしているのか

 Consoleウィンドウの「Error Pause」ボタンをクリックしてオプションを有効にさせた状態でDebug.LogError()が実行されると、Debug.break()と同じようにエディタが一時停止します。一時停止をオンオフできるのが便利ですが、こちらも停止するのは次のフレームに入る前なので注意してください。

現在のフレームレートを簡単に知りたい

・Gameウィンドウの右上にある「Stats」をクリックすると情報ウィンドウが表示され、ここにフレームレートが表示される。本によってはこのフレーム数は正確ではないと書いてある物があり、参考程度にするのが良さげ。
・ちなみにstatsはstatistics(統計データ)の略。

同一のMonoBehavior派生クラスのインスタンス間で、Update()の実行順序を制御する方法は無い

 異なるMonoBehavior派生クラスのインスタンス間であれば、Script Execution Orderの機能で、Awake()、Start()、Update()の実行順序を指定できます。

スクリプト実行順設定
https://docs.unity3d.com/ja/540/Manual/class-ScriptExecution.html

 しかし、同一のMonoBehavior派生クラスのインスタンス間でのUpdate()実行順序を制御する方法は用意されていません。
 例えば、Enemyクラスがアタッチされているボスと4匹の子分がいたとして、常にボスのUpdate()を先に動作させるという風には組めないのです(ボスにアタッチさせるクラスを変えるしかない)。
 実際には、恐らく「最後に生成されたインスタンスから順に実行する」という形式になっていると思うのですが(Unity側で敢えてランダムにする必要はないから)、定義されているわけではないのでその前提で組むわけにはいきません。

 海外フォーラムでは、Update()を使用せず、自前で巡回コードを書くよう提案されています

In what order are all the Update() functions called?
http://answers.unity3d.com/questions/46107/in-what-order-are-all-the-update-functions-called.html

 設計思想としては理解できるのですが(同じクラスは同じ価値を持つので、実行順序制御は必要ないとしているのでしょう)、この仕様は結構ビビります。