Version: 2020.1
ランタイムのプレハブのインスタンス化
イベント関数

Order of execution for event functions

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

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

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

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

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

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

最初のシーンのロード

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

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

Note that for objects added to the scene, the Awake and OnEnable functions for all scripts will be called before Start, Update, etc are called for any of them. Naturally, this cannot be enforced when you instantiate an object during gameplay.

エディター

  • Reset: Reset is called to initialize the script’s properties when it is first attached to an object and also when the Reset command is used.
  • OnValidate: OnValidate is called whenever the script’s properties are set, including when an object is deserialized, which can occur at various times, such as when you open a scene in the Editor and after a domain reload.

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

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

For objects that are part of a scene asset, the Start function is called on all scripts before Update, etc is called for any of them. Naturally, this cannot be enforced when you instantiate an object during gameplay.

フレーム間

  • 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 ですべてのカメラの移動と回転の計算を行えます。これにより、キャラクターが完全に移動してからカメラが追跡することができます。

In general, you should not rely on the order in which the same event function is invoked for different GameObjects — except when the order is explicitly documented or settable. (If you need a more fine-grained control of the player loop, you can use the PlayerLoop API.)

You cannot specify the order in which an event function is called for different instances of the same MonoBehaviour subclass. For example, the Update function of one MonoBehaviour might be called before or after the Update function for the same MonoBehaviour on another GameObject — including its own parent or child GameObjects.

You can specify that the event functions of one MonoBehaviour subclass should be invoked before those of a different subclass (using the Script Execution Order panel of the Project Settings window). For example, if you had two scripts, EngineBehaviour and SteeringBehaviour, you could set the Script Execution Order such that EngineBehaviours always updates before SteeringBehaviours.

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

これらの関数と プロファイラー マーカーは、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 Continue after a specified time delay, after all Update functions have been called for the frame.
  • yield WaitForFixedUpdate Continue after all FixedUpdate has been called on all scripts. If the coroutine yielded before FixedUpdate, then it resumes after FixedUpdate in the current frame.
  • yield WWW: WWW ダウンロード完了後に続行します。
  • yield StartCoroutine: コルーチンを連鎖し、MyFunc コルーチンが最初に完了するのを待ちます。

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

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

終了する場合

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

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

  • 2019–03–18 Page amended
ランタイムのプレハブのインスタンス化
イベント関数