Unity スクリプトを実行すると、既定の順序で多くのイベント関数が実行されます。このページでは、これらのイベント関数について説明し、それらがどのように実行シーケンスに収まるかを説明します。
以下の図は、Unity がスクリプトの生存期間中にイベント関数を順序付け、繰り返す方法をまとめたものです。
さまざまなイベント関数の詳細は、以下のセクションを参照してください。
ノート ブラウザーの中には SVG 画像ファイルをサポートしないものがあります。上の画像が正しく表示されない場合 (テキストが表示されない場合など) は、Google Chrome や Mozilla Firefox など別のブラウザーをお試しください。
これらの関数は、シーンが始まると (シーン内の各オブジェクトに対して 1 度だけ) 呼び出されます。
シーンに加えられているオブジェクトに関しては、すべて のスクリプトの Awake と OnEnable 関数は、Start、Update などが呼び出される前に呼び出されることに注意してください。当然のことながら、オブジェクトをゲーム中にインスタンス化する場合に、これらを強制的に呼び出すことはできません。
シーンアセットの一部であるオブジェクトに対し、Start 関数はすべてのスクリプトで Update や他の関数が呼び出される前に呼び出されます。当然のことながら、オブジェクトをゲームプレイ中にインスタンス化する場合に、それを強制することはできません。
ゲームロジック、インタラクション、アニメーション、カメラ位置などの追跡に、各種イベントを使用できます。共通のパターンは Update 関数内のほとんどのタスクを実行することですが、その他の関数も使用できます。
FixedUpdate: FixedUpdate はしばしば、Update よりも頻繁に呼び出されることがあります。フレームレートが低く、フレーム間で呼び出されない可能性がある場合は、1 フレームに複数回呼び出される場合があります。フレームレートが高い場合は複数のフレームの間でも呼び出されないことがあります。すべての物理演算とアップデートは FixedUpdate のすぐ後に発生します。FixedUpdate 内で移動の計算を行う場合は、 Time.deltaTime で値を乗算する必要はありません。なぜなら FixedUpdate は、フレームレートとは関係なく、信頼性のあるタイマーで呼び出されるからです。
Update: Update は、 1 フレームにつき 1 度呼び出されます。これは、フレームのアップデートの主となる関数です。
LateUpdate: LateUpdate は Update 終了後に、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 サブステートへの遷移は呼び出されません。
このコールバックは、コントローラーコンポーネントがある場合にのみ発生します (例えば、アニメーショングラフの AnimatorController、AnimatorOverrideController、AnimatorControllerPlayable)。
注意* このコールバックを StateMachineBehaviour コンポーネントに加えると、マルチスレッドステートマシンの評価が無効になります。
OnStateMachineExit: State Machine Update ステップの間、コントローラーのステートマシンが Exit ステートを経て遷移すると、このコールバックは最後の更新フレームで呼び出されます。StateMachine サブステートへの遷移は呼び出されません。
このコールバックは、コントローラーコンポーネントがある場合にのみ発生します (例えば、アニメーショングラフの AnimatorController、AnimatorOverrideController、AnimatorControllerPlayable)。
注意* このコールバックをStateMachineBehaviour コンポーネントに加えると、マルチスレッドステートマシンの評価が無効になります。
Fire Animation Events: 最後の更新時刻から現在の更新時刻までの間にサンプリングされたすべてのクリップからすべてのアニメーションイベントを呼び出します。
StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit): レイヤーには、現在のステート、中間のステート、次のステートという 3 つのアクティブステートがあります。この関数は、OnStateEnter、OnStateUpdate、OnStateExit コールバックを定義する StateMachineBehaviour コンポーネントを持つ各アクティブステートに対して呼び出されます。
この関数はまず、現在のステート、中間のステート、次のステートの順番に呼び出されます。
このステップは、コントローラーコンポーネント (例えば、アニメーショングラフの AnimatorController、AnimatorOverrideController、AnimatorControllerPlayable) がある場合にのみ発生します。
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 Update と Process Graph 関数の実行後にのみ発生することが分かっている場合、アニメーションクリップは次のフレームで再生されることを予想でき、今すぐにではないことがわかります。
State Machine Update: すべてのステートマシンは、実行シーケンスのこのステップで評価されます。このステップは、コントローラーコンポーネントがある場合にのみ発生します (例えば、アニメーショングラフでは、AnimatorController、AnimatorOverrideController、AnimatorControllerPlayable)。
ノート: ステートマシンの評価は通常マルチスレッドですが、特定のコールバック (例えば OnStateMachineEnter とOnStateMachineExit) の追加は、マルチスレッドを無効にします。詳細は前述の アニメーションの更新ループ を参照してください。
ProcessGraph: すべてのアニメーショングラフを評価します。これには、評価が必要なすべてのアニメーションクリップのサンプリングと、Root Motion の計算が含まれます。
ProcessAnimation: アニメーショングラフの結果をブレンドします。
WriteTransforms: アニメーション化されたすべてのトランスフォームをワーカースレッドからシーンに書き込みます。
IK Pass が有効になっている複数のレイヤーを持つヒューマノイドリグは、複数の WriteTransforms パスを持つことができます (スクリプトライフサイクルのフローチャート を参照してください)。
ノート: これらのコールバックは、ビルトインレンダーパイプラインでのみ動作します。
一般的にコルーチンのアップデートは、Update 関数の後に実行されます。コルーチンは、所定の YieldInstruction が終了するまで、その実行 (生成) を中止できる関数です。 コルーチンには以下の用法があります。
これらの関数は、シーン内のすべてのアクティブなオブジェクトで呼び出されます。