属性
自動メモリ管理を理解する

イベント関数の実行順

Unity には、スクリプトが特定の順番で実行されるイベント関数が多くあります。実行順は以下のとおりです。

エディター

  • Reset: Reset はオブジェクトが最初にアタッチされたときにスクリプトのプロパティーを初期化するために呼びだされます。Reset コマンドを実行した時も同様です。

最初のシーンロード

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

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

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

最初のフレームのアップデート前

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

シーンに追加されたオブジェクトの Start 関数はすべてのスクリプトで Update や他の関数が呼び出される前に呼び出されます。当然のことながらオブジェクトがゲームプレイ中にインスタンス化されたときに強制的に呼び出すことはできません。

フレーム間

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

アップデート順

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

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

  • Update: Update はフレームごとに一度呼び出されます。これは、フレームのアップデートのメインとなる関数です。

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

レンダリング

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

コルーチン

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

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

オブジェクト破棄時

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

終了時

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

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

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

次の図はスクリプトが実行しているときのイベント関数の順序や繰り返し処理をまとめたものです。

属性
自動メモリ管理を理解する