ドキュメント

Unity Engine

Unity Engine

イベント機能実行順序

Unity のビルトインイベント関数の実行順序を理解し、イベントに反応してゲームのステートを正しい順序で更新できるようにします。
読み終わるまでの所要時間 15 分最終更新 3日前

以下の図は、MonoBehaviour スクリプトコンポーネントのライフサイクル中に実行されるイベント関数の実行シーケンスの概要を示しています。可読性のために、チャートの範囲はスクリプトのライフサイクルのキー部分に限定され、コンテキストに応じて内部サブシステムの余分な更新がいくつか提供されます。完全なプレイヤーループは、特定のシステムとサブシステムの更新のより長く複雑なシーケンスで、定義されたデフォルトの順序で次々と実行されます。プレイヤーループ全体とそのすべてのシステムを取得するには、PlayerLoop API を使用します。また、この API を使用して、システムの削除、独自のシステムの追加、更新順序の変更など、プレイヤーループシーケンスをカスタマイズすることもできます。
各コールバックの意味と制限の詳細については、MonoBehaviour API リファレンスの「 メッセージ 」セクションを参照してください。

Order of execution for event functions during the lifecycle of a MonoBehaviour script.

シーンのロードとアンロードの前

上の図では示されていない
SceneManager.sceneLoaded
イベントと
SceneManager.sceneUnloaded
イベントは、シーンがロードおよびアンロードされたときにコールバックを受け取ることができます。Unity は、
OnEnable
後、ただしシーン内のすべてのオブジェクトの
Start
前に
sceneLoaded
イベントを発生させます。詳細と使用例については、関連する API リファレンス ページを参照してください。
実行フローの一部としてシーンロードを含む図については、「 ドメインとシーンのリロードの無効化 」を参照してください。

エディター起動時にコードを実行

Unity エディターやランタイムの起動時に、追加のユーザーアクションや MonoBehaviour スクリプトにコードを含める必要なしに、コードの一部を即座に実行できるようにすると便利な場合があります。静的コンストラクターを持つクラスに
[InitializeOnLoad]
属性を適用することで、ユーザーアクションを必要とせずにエディターの起動時にコードを実行できます。または、
[InitializeOnLoadMethod]
属性を個々のメソッドに適用できます。詳細と使用例については、これらの属性の API リファレンスを参照してください。

ランタイム初期化時のコード実行

ランタイムアプリケーションの初期化時にコードを実行するには、
[RuntimeInitializeOnLoadMethodAttribute]
をメソッドに適用します。
RunTimeInitializeLoadType
属性パラメーターを指定して、プレイヤーループのどこで属性コードを実行するかをコントロールできます。この属性でマークされたメソッドの実行順序の詳細については、API リファレンスの
RuntimeInitializeOnLoadMethodAttribute
を参照してください。

内部アニメーション更新

以下の図は、通常のアニメーション更新ループの実行順序を示し、上の図で Internal アニメーション更新 というラベルの付いたノードを展開します。

Order of execution for the regular Animation update loop.

図に示す以下のアニメーションループコールバックは、MonoBehaviour から派生したスクリプトで呼び出されます。
追加のアニメーション関連イベント関数は、
StateMachineBehaviour
から派生したスクリプトで呼び出されます。
図に示されているその他のアニメーション関数は、アニメーションシステムの内部にあり、コンテキスト用に提供されています。これらの関数にはプロファイラーマーカーが関連付けられているため、プロファイラーを使用して、Unity がフレーム内で呼び出すタイミングを確認できます。Unity がこれらの関数を呼び出すタイミングを知ることは、コールたイベント関数がいつ実行されるかを正確に理解するのにヘルプます。アニメーション関数とプロファイラーマーカーの完全な実行順序については、プロファイラーマーカー を参照してください。

レンダリング

この実行順序は、ビルトインレンダーパイプラインにのみ適用されます。スクリプタブルレンダーパイプラインに基づいてレンダリングするパイプラインの実行順序の詳細については、URP または HD レンダーパイプライン (HDRP) のドキュメントの関連セクションを参照してください。レンダリングの直前に作業する場合は、 application.onBeforeRender を参照してください。
  • カメラがシーンをカリングする前に呼び出されます。カリングは、カメラに表示するオブジェクトを決定します。
    OnPreCull
    はカリングが発生する直前に呼び出されます。
  • オブジェクトが任意のカメラに対して表示/非表示になったときに呼び出されます。オブジェクトはいつでも非表示になるため、上のフローチャートには
    OnBecameInvisible
    は表示されません。
  • オブジェクトが可視の場合、各カメラに対して 1 回呼び出されます。
  • カメラがシーンのレンダリングを開始する前に呼び出されます。
  • すべての通常のシーンレンダリングが完了した後に呼び出されます。この時点で GL クラスまたは Graphics.DrawMeshNow を使用してカスタムジオメトリを描画できます。
  • カメラがシーンのレンダリングを終了した後に呼び出されます。
  • シーンのレンダリングが完了した後に呼び出され、画像のポストプロセスを可能にします。ポストプロセスエフェクト を参照してください。
  • GUI イベントに反応してフレームごとに複数回呼び出されます。レイアウトと再描画のイベントが最初に処理され、次に各入力イベントのレイアウトとキーボード/マウスイベントが処理されます。
  • シーンビューでギズモを描画するために使用する
    OnDrawGizmos
    。
注
OnPreCull、OnPreRender、OnPostRender、OnRenderImage は Unity ビルトインイベント関数で、MonoBehaviour スクリプトで呼び出されます。ただし、これらのスクリプトが有効な Camera コンポーネントと同じオブジェクトにアタッチされている場合のみ。異なる オブジェクトにアタッチされた MonoBehaviour の
OnPreCull
、
OnPreRender
、および
OnPostRender
に対して同等のコールバックを受け取る場合は、スクリプトリファレンスの関連ページのコード例に示すように、同等のデリゲート (名前に小文字の
on
が入っていることに注意してください)、Camera.onPreCull、Camera.onPreRender、および Camera.onPostRender を使用する必要があります。

コルーチンと非同期タスクの再開

中断されたコルーチンは、使用されている yield 命令に応じて、実行シーケンスの異なる時点で再開できます。例えば、
WaitForEndOfFrame
を使用したコルーチンはフレームの終了時に再開し、
WaitForFixedUpdate
を使用したコルーチンは固定更新ステップの終了時に再開します。詳細については、コルーチン を参照してください。
通常の .NET タスクと非同期メソッドは、
Update
フェーズで再開します。コルーチンと同様に、Unity のカスタム
Awaitable
クラスは、待機時に使用するメソッドに応じて異なるタイミングで再開できます。詳細は、「 Awaitable クラスを使用した非同期プログラミング 」を参照してください。
注
コルーチンと非同期タスクの再開の間の正確な実行順序は保証されません。Awaitable はグループ化され、待機順に実行されます。

MonoBehaviour と Entities の組み合わせ

ECS(エンティティ コンポーネント システム)を使用する場合、UnityはECSシステム グループの更新をプレイヤー更新ループにマージします。
Entities Systemsウィンドウを使用して、プレイヤー ループ全体に関連するECSシステム グループの更新順序を表示できます。詳細については、Entities パッケージのドキュメントのシステムの更新順序を参照してください。

制限事項

一般的に、同じイベント機能が異なるGameObjectsオブジェクトに対して実行される順序は、順序が明示的に的に文書化または設定可能な場合を除き、当てにすることはできません。
同じ MonoBehaviour スクリプトの異なるインスタンスに対してイベント機能が呼び出される順序を指定することはできません。例えば、ある MonoBehaviour の
Update
機能は、その親や子ゲームオブジェクトを含む別のゲームオブジェクト上の同じ MonoBehaviour の
Update
機能の前後に呼び出されます。
異なる MonoBehaviour スクリプト間の実行順序を設定するには、スクリプト実行順序 を参照してください。

追加リソース