Version: 2021.3
言語: 日本語
ランタイムのプレハブのインスタンス化
イベント関数

イベント関数の実行順序

Unity スクリプトを実行すると、既定の順序で多くのイベント関数が実行されます。このページでは、これらのイベント関数について説明し、それらがどのように実行シーケンスに収まるかを説明します。

スクリプトのライフサイクルの概要

以下の図は、Unity がスクリプトの生存期間中にイベント関数を順序付け、繰り返す方法をまとめたものです。

さまざまなイベント関数の詳細は、以下のセクションを参照してください。

スクリプトライフサイクルのフローチャート

ノート ブラウザーの中には SVG 画像ファイルをサポートしないものがあります。上の画像が正しく表示されない場合 (テキストが表示されない場合など) は、Google ChromeMozilla Firefox など別のブラウザーをお試しください。

最初のシーンのロード

これらの関数は、シーンが始まると (シーン内の各オブジェクトに対して 1 度だけ) 呼び出されます。

  • Awake: この関数は常に Start 関数の前およびプレハブのインスタンス化直後に呼び出されます。(もしゲームオブジェクトがスタートアップ時に無効である場合、有効になるまで Awake は呼び出されません。)
  • OnEnable: (オブジェクトがアクティブな場合にのみ呼び出されます) この関数は、オブジェクトを有効にした直後に呼び出されます。これは、MonoBehaviour インスタンスが作成されるとき (例えば、ステージを起動するときや、スクリプトコンポーネントがアタッチされたゲームオブジェクトをインスタンス化するとき) に発生します。

シーンに加えられているオブジェクトに関しては、すべて のスクリプトの Awake と OnEnable 関数は、Start、Update などが呼び出される前に呼び出されることに注意してください。当然のことながら、オブジェクトをゲーム中にインスタンス化する場合に、これらを強制的に呼び出すことはできません。 

エディター

  • Reset: Reset はスクリプトがオブジェクトに最初にアタッチされたときにスクリプトのプロパティを初期化するために呼び出されます。Reset コマンドを実行した時も同様です。
  • OnValidate: OnValidate は、オブジェクトがデシリアライズされるときを含め、スクリプトのプロパティが設定されるときには常に呼び出されます。これは、エディターでシーンを開いたときやドメインの再ロード後など、さまざまなタイミングで発生します。

最初のフレームを更新する前

  • Start: スクリプトのインスタンスが有効な場合にのみ、最初のフレームのアップデート前に Start が呼び出されます。

シーンアセットの一部であるオブジェクトに対し、Start 関数はすべてのスクリプトで Update や他の関数が呼び出される前に呼び出されます。当然のことながら、オブジェクトをゲームプレイ中にインスタンス化する場合に、それを強制することはできません。

フレーム間

  • OnApplicationPause: ポーズが検知されたフレームの終わりに、実際は、通常のフレームのアップデートの間に呼び出されます。OnApplicationPause が呼び出されてからひとつだけ追加のフレームが作成され、ポーズ状態を示すグラフィックスなどを表示できます。

アップデートの順番

ゲームロジック、インタラクション、アニメーション、カメラ位置などの追跡に、各種イベントを使用できます。共通のパターンは Update 関数内のほとんどのタスクを実行することですが、その他の関数も使用できます。

  • FixedUpdate: FixedUpdate はしばしば、Update よりも頻繁に呼び出されることがあります。フレームレートが低く、フレーム間で呼び出されない可能性がある場合は、1 フレームに複数回呼び出される場合があります。フレームレートが高い場合は複数のフレームの間でも呼び出されないことがあります。すべての物理演算とアップデートは FixedUpdate のすぐ後に発生します。FixedUpdate 内で移動の計算を行う場合は、 Time.deltaTime で値を乗算する必要はありません。なぜなら FixedUpdate は、フレームレートとは関係なく、信頼性のあるタイマーで呼び出されるからです。

  • Update: Update は、 1 フレームにつき 1 度呼び出されます。これは、フレームのアップデートの主となる関数です。

  • LateUpdate: LateUpdateUpdate 終了後に、1 フレームにつき 1 度呼び出されます。Update で実行される計算は、LateUpdate が始まる前に完了します。LateUpdate の一般的な使用方法は三人称カメラの追跡です。Update 内でキャラクターを動かし、回転させる場合、LateUpdate ですべてのカメラの移動と回転の計算を行えます。これにより、キャラクターが完全に移動してからカメラが追跡することができます。

一般的に、異なるゲームオブジェクトに対してあるイベント関数が呼び出される順番は、明示的に文書化されていたり設定可能な場合を除き、一定ではありません。(プレイヤーループをより細かく制御する必要がある場合は、PlayerLoop のスクリプトリファレンスを参照してください)。

同じ MonoBehaviour サブクラスの異なるインスタンスに対して、イベント関数の呼び出し順を指定することはできません。例えば、ある MonoBehaviour の Update 関数が、他のゲームオブジェクト (その親/子ゲームオブジェクトを含む) では、同じ MonoBehaviour の Update 関数の前後に呼び出される可能性があります。

ある MonoBehaviour サブクラスのイベント関数が、別のサブクラスのイベント関数よりも先に呼び出されるように指定することができます (Project Settings ウィンドウの Script Execution Order パネルを使用)。例えば、EngineBehaviour と SteeringBehaviour の 2 つのスクリプトがある場合、SteeringBehaviours よりも EngineBehaviours の方が常に先に更新されるように Script Execution Order を設定することができます。

アニメーションの更新ループ

これらの関数と プロファイラー マーカーは、Unity がアニメーションシステムを評価するときに呼び出されます。

  • OnStateMachineEnter: State Machine Update ステップの間、コントローラーのステートマシンが Entry ステートを経て遷移すると、このコールバックは最初の更新フレームで呼び出されます。StateMachine サブステートへの遷移は呼び出されません。

    このコールバックは、コントローラーコンポーネントがある場合にのみ発生します (例えば、アニメーショングラフの AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)。

  • 注意* このコールバックを StateMachineBehaviour コンポーネントに加えると、マルチスレッドステートマシンの評価が無効になります。

  • OnStateMachineExit: State Machine Update ステップの間、コントローラーのステートマシンが Exit ステートを経て遷移すると、このコールバックは最後の更新フレームで呼び出されます。StateMachine サブステートへの遷移は呼び出されません。

    このコールバックは、コントローラーコンポーネントがある場合にのみ発生します (例えば、アニメーショングラフの AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)。

  • 注意* このコールバックをStateMachineBehaviour コンポーネントに加えると、マルチスレッドステートマシンの評価が無効になります。

  • Fire Animation Events: 最後の更新時刻から現在の更新時刻までの間にサンプリングされたすべてのクリップからすべてのアニメーションイベントを呼び出します。

  • StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit): レイヤーには、現在のステート、中間のステート、次のステートという 3 つのアクティブステートがあります。この関数は、OnStateEnterOnStateUpdateOnStateExit コールバックを定義する StateMachineBehaviour コンポーネントを持つ各アクティブステートに対して呼び出されます。

    この関数はまず、現在のステート、中間のステート、次のステートの順番に呼び出されます。

    このステップは、コントローラーコンポーネント (例えば、アニメーショングラフの AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable) がある場合にのみ発生します。

  • OnAnimatorMove: 更新フレームごとに、Animator コンポーネントごとに 1 回呼び出され、ルートモーションを変更します。

  • StateMachineBehaviour(OnStateMove): これは、StateMachineBehaviour を持つアクティブなステートごとに呼び出されます。StateMachineBehaviour はこのコールバックを定義します。

  • OnAnimatorIK: アニメーション IK を設定します。これは IK Pass を有効にした Animator Controller レイヤーごとに 1 回呼び出されます。

    このイベントはヒューマノイドリグを使用している場合にのみ実行されます。

  • StateMachineBehaviour(OnStateIK): これは、StateMachineBehaviour コンポーネントを持つアクティブなステートごとに呼び出されます。StateMachineBehaviour コンポーネントは IK Pass が有効なレイヤーでこのコールバックを定義します。

  • WriteProperties: メインスレッドからシーンにアニメーション化された他のすべてのプロパティを書き込みます。

有用なプロファイルマーカー

スクリプトライフサイクルのフローチャート に表示されるアニメーション関数の中には、呼び出しできないイベント関数があります。それらは、Unity がアニメーションを処理するときに呼び出す内部関数です。

このような関数にはプロファイラーマーカーが備えられています。そのため、プロファイラー を使用して、Unity がそれらを呼び出すフレームのタイミングを確認できます。Unity がこれらの関数を呼び出すタイミングを知ることで、自分が呼び出すイベント関数がいつ実行されるかを正確に理解するのに役立ちます。

例えば、FireAnimationEvents コールバックで Animator.Play を呼び出すとします。 StateAnimationEvents コールバックが State Machine UpdateProcess Graph 関数の実行後にのみ発生することが分かっている場合、アニメーションクリップは次のフレームで再生されることを予想でき、今すぐにではないことがわかります。

  • State Machine Update: すべてのステートマシンは、実行シーケンスのこのステップで評価されます。このステップは、コントローラーコンポーネントがある場合にのみ発生します (例えば、アニメーショングラフでは、AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)。

    ノート: ステートマシンの評価は通常マルチスレッドですが、特定のコールバック (例えば OnStateMachineEnterOnStateMachineExit) の追加は、マルチスレッドを無効にします。詳細は前述の アニメーションの更新ループ を参照してください。

  • ProcessGraph: すべてのアニメーショングラフを評価します。これには、評価が必要なすべてのアニメーションクリップのサンプリングと、Root Motion の計算が含まれます。

  • ProcessAnimation: アニメーショングラフの結果をブレンドします。

  • WriteTransforms: アニメーション化されたすべてのトランスフォームをワーカースレッドからシーンに書き込みます。

    IK Pass が有効になっている複数のレイヤーを持つヒューマノイドリグは、複数の WriteTransforms パスを持つことができます (スクリプトライフサイクルのフローチャート を参照してください)。

レンダリング

  • OnPreCull: カメラがシーンを間引く前に呼び出されます。カリングにより、カメラにどのオブジェクトを表示するかが決定されます。OnPreCull は、カリングが発生する直前に呼び出されます。
  • OnBecameVisible/OnBecameInvisible: オブジェクトがカメラに対して表示または非表示になる際に呼び出されます。
  • OnWillRenderObject: オブジェクトが表示されると、各カメラに対して 1 回 呼び出されます。
  • OnPreRender: カメラがシーンのレンダリングを開始する前に呼び出されます。
  • OnRenderObject: すべてのシーンレンダリング終了後に呼び出されます。GL クラスまたは Graphics.DrawMeshNow を使用して、この点にカスタムのジオメトリを描画できます。
  • OnPostRender: カメラがシーンのレンダリングを終了した後に呼び出されます。
  • OnRenderImage: シーンのレンダリングが終了した後に呼び出され、画像のポストプロセスを可能にします。詳細は ポストプロセスエフェクト を参照してください。
  • OnGUI: GUI イベントに応じて、フレームごとに複数回呼び出されます。レイアウトおよび再描画イベントが最初に処理され、その後にレイアウトおよびキーボード/マウスイベントが各入力イベントに対して処理されます。
  • OnDrawGizmos 可視化のためにシーンビュー内での Gizmos の描画に使用されます。

ノート: これらのコールバックは、ビルトインレンダーパイプラインでのみ動作します。

コルーチン

一般的にコルーチンのアップデートは、Update 関数の後に実行されます。コルーチンは、所定の YieldInstruction が終了するまで、その実行 (生成) を中止できる関数です。 コルーチンには以下の用法があります。

  • yield: コルーチンは、次のフレームで Update 関数がすべて呼び出された後に続行します。
  • yield WaitForSeconds フレームに対して Update 関数がすべて呼び出された後、指定された時間経過後に続行します。
  • yield WaitForFixedUpdate すべてのスクリプトで FixedUpdate 関数が呼び出された後に続行します。もし、コルーチンが FixedUpdate の前に一時停止した場合は、現在のフレームの FixedUpdate の後に再開します。
  • yield WWW: WWW ダウンロード完了後に続行します。
  • yield StartCoroutine: コルーチンを連鎖し、MyFunc コルーチンが最初に完了するのを待ちます。

オブジェクトが破棄される場合

  • OnDestroy: オブジェクトが破棄される直前のフレームのアップデート後に OnDestroy が呼び出されます (オブジェクトは Object.Destroy あるいはシーン終了時に破棄されます)。

終了する場合

これらの関数は、シーン内のすべてのアクティブなオブジェクトで呼び出されます。

  • OnApplicationQuit: この関数は、アプリケーション終了前に、すべてのゲームオブジェクトで呼び出されます。エディターでは、ユーザーが再生モードを停止すると呼び出されます。
  • OnDisable: この関数は、動作が無効になると呼び出されます。

  • 2019–03–18 修正されたページ
ランタイムのプレハブのインスタンス化
イベント関数