【Unity学習ノート】ライフサイクル

公式ドキュメント:イベント関数の実行順序


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

図に示すように、
ここに画像の説明を挿入します
スクリプトのライフサイクルは主に次の段階を経ます。


初期化

初期化フェーズ (Awake、OnEnable の初期化を含み、その後エディターのリセットが初期化プロセスの間に散在するため、エディターでゲームを開始する前に実行されるスクリプト内の Reset メソッドをオーバーライドできます。最後に開始)、ゲームを開始するときの初期化シーケンスは、Awake、OnEnable、Reset (エディターで定義されている場合)、Start です。

Awake: この関数は、プレハブをインスタンス化した後に呼び出されます。(ゲーム オブジェクトが起動時に非アクティブな場合、Awake はアクティブ化されるまで呼び出されません。)

OnEnable: (オブジェクトがアクティブな場合にのみ呼び出されます) オブジェクトを有効にした直後にこの関数を呼び出します。この呼び出しは、レベルがロードされるときや、スクリプト コンポーネントを含むゲーム オブジェクトがインスタンス化されるときなど、 MonoBehaviour インスタンスが作成される
ときに行われます。

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

上記の瞬間はすべて、最初のフレームが更新される前に実行されます。一般的に、オブジェクトは Start に入る前に Awake と OnEnable を通過する必要があります。たとえば、2 つのオブジェクト AB がある場合、A が B の前に実行されると仮定すると、実行順序は次のようになります。 A.アウェイク、A.オンイネーブル、B.アウェイク、B.オンイネーブル、A.スタート、B.スタート。


更新順序

初期化が完了すると、更新フェーズに入ります。このフェーズでは、さまざまな更新メソッドの実行順序が異なります。

FixedUpdate: この段階での更新期間は固定で、1 回約 0.02f です。主に物理システムに使用されます。FixedUpdate の呼び出し頻度は Update を超えることがよくあります。フレーム レートが低い場合、この関数はフレームごとに複数回呼び出される可能性がありますが、フレーム レートが高い場合、フレーム間で関数がまったく呼び出されない場合があります。すべての物理計算と更新は、FixedUpdate の直後に行われます。FixedUpdate 内でモーション計算を適用する場合、値に Time.deltaTime を乗算する必要はありません。これは、FixedUpdate が信頼できるタイマー (フレーム レートに依存しない) に基づいて呼び出されるからです。

更新: 更新はフレームごとに 1 回呼び出されます。これはフレーム更新に使用される主な関数です。更新はフレーム レートの影響を受けるため、通常はいくつかのゲーム制御ロジックがここに配置されます。

LateUpdate: フレームごとに 1 回 LateUpdate__ を呼び出します (Update__ の完了後)。LateUpdate が開始されると、Update で実行されたすべての計算が完了します。LateUpdate の一般的な使用法は、三人称カメラを追跡することです。Update 内でキャラクターを移動したり回転させたりする場合は、すべてのカメラの移動と回転の計算を LateUpdate で実行できます。これにより、カメラがその位置を追跡する前に、キャラクターが完全に移動することが保証されます。

上記のライフ サイクル図からわかるように、更新フェーズにおける 3 つの更新メソッドの実行順序は連続する必要があります。最初のメソッドはフレーム レートの影響を受けませんが、Update と LateUpdate はフレーム レートの影響を受けます。 LateUpdate は Update. の後に実行されるため、実行順序と実行頻度の観点から、いつどの更新方法を使用するかを検討できます。


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

図中の灰色の部分はアニメーション更新の実行順序であり、ゲームの物理フェーズのFixedUpdateとメインロジックフェーズのUpdateの更新処理は同様です。

まずステート マシンの固定更新を実行し、次にステート マシンの開始状態または終了状態に入り (ステート マシン内で実行される場合)、その後他のアニメーション イベントを処理します。

StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit): レイヤーには、現在の状態、割り込み状態、次の状態という最大 3 つのアクティブな状態を含めることができます。この関数は、OnStateEnter、OnStateUpdate、または OnStateExit コールバックを定義する StateMachineBehaviour コンポーネントを使用して、アクティブな状態ごとに呼び出されます。この関数は、現在の状態、割り込み状態、および次の状態に対して呼び出されます。

StateMachineBehaviour、つまりステート マシン間で状態が切り替わった後にコールバックが与えられることがわかります。これらの状態が切り替わるときにコールバック関数を定義できます。


各種イベント

ライフサイクルでは、イベントの実行順序がカテゴリに従って大まかに処理されていることがわかります。

OnState、OnAnimation、およびその他のアニメーション イベントが最も優先されます。

OnTrigger、OnCollistion、その他の物理イベント、その後にアニメーション イベントが続く

OnMouse、OnKey (推測、不確か) およびその他の入力イベント、それに続く物理イベント

OnState や OnAnimation などのアニメーション イベントは更新中に再度更新されます

OnRender... いくつかのシーン レンダリング イベントを待機し、LateUpdate 後に更新します

OnDrawGizmos、ギズモ レンダリング。シーンのレンダリング後に視覚化するためにシーン ビューに補助アイコンを描画するために使用されます。

OnGUI、Gizmos レンダリング後の GUI レンダリング。GUI イベントに応答してフレームごとに複数回呼び出されます。レイアウト イベントと再描画イベントが最初に処理され、次に各入力イベントのレイアウト イベントとキーボード/マウス イベントが処理されます。

OnApplicationPause は、一時停止が発生したフレームの後に呼び出されてアプリケーションを一時停止しますが、実際の一時停止の前に別のフレームを発行します。

中間イベント処理全体の主なプロセスは、最初にアニメーション イベントを処理し、次に物理イベントを処理し、次に入力イベントを処理し、次にアニメーションが更新され、次にいくつかのレンダリング イベント、GUI のレンダリングであることがわかります。すべての後です。


終盤

シーン内のすべてのアクティブなオブジェクトに対して次の関数を呼び出します。

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

OnDisable: この関数は、動作が無効または非アクティブになったときに呼び出されます。

Object.Destroy この関数は、オブジェクトが存在していた最後のフレームに対するすべてのフレーム更新が完了した後に呼び出されます (オブジェクトは、Object.Destroy の要求により、またはシーンが閉じられたときに破棄される可能性があります)。

OnDisable、Destroy などの上記のイベントはゲーム内で実行できますが、OnApplicationQuit メソッドは実行終了時にのみ呼び出すことができます。終了プロセス全体は、OnApplicationQuit、OnDisable、Destroy です。終了メソッドは Application.Quit である必要があります。


ステージ分析

上記のプロセスは、初期化段階、物理段階、入力検出段階、ゲームロジック段階、レンダリング段階、終了段階に大別できます。

初期化フェーズはゲーム開始時に1回だけ実行され、終了フェーズはゲーム終了時に1回だけ実行され、残りのフェーズはフレームごとに順次循環される。

内部アニメーションの更新は、物理ステージのFixedUpdateと物理イベントの前、およびゲームロジックステージのUpdateとLaterUpdateの間に散在します。入力検出フェーズは、物理フェーズとゲーム ロジック フェーズの間、つまり、FixedUpdate の最後で Update の前にあります。レンダリング フェーズはゲーム ロジック フェーズの後、フレーム全体の終わりにあり、レンダリング フェーズが終了するとフレームが終了することを意味します。

コルーチンの戻り値

実際、コルーチンの戻り時間は、いくつかのステージの開始点と終了点のマークと見なすことができることを見つけるのは難しくありません。たとえば、yield WaitForFixedUpdateFixedUpdate の終了をマークする瞬間、yield nullおよび Update 後のその他のリターンは、yield WaitForEndOfFrame各フレームの終わりの瞬間を表します。(中間英語訳: 返されるはずのコルーチンが中断されて実行を再開した場合、Update で yield も実行する必要があります。翻訳は間違っている可能性があります)


要約する

ライフサイクル全体における重要な瞬間の実行シーケンス:

  • 初期化フェーズ
  • Awake、OnEnable、Restart (エディター)、Start
  • 物理的な段階
  • 固定更新時
  • (内部アニメーション実行)
  • yield return WaitForFixedUpdate
  • 入力段
  • オンマウスXXX
  • ゲームロジックステージ
  • アップデート
  • 利回りは null を返します
  • yield return WaitForSeconds
  • 利回りリターン WWW
  • yield return StartCoroutine
  • (内部アニメーション実行)
  • 後で更新
  • レンダリング段階
  • SceneRender シーンのレンダリング
  • ギズモのレンダリング
  • GUIRender (最後の GUI レンダリング)
  • yield return WaitForEndOfFrame はフレームの終わりをマークします
  • (一時停止するか、フレームの終わりで OnFixedUpdate に戻るか、ゲームを終了します)
  • 終盤
  • アプリケーション終了時、無効化時、破棄時

おすすめ

転載: blog.csdn.net/milu_ELK/article/details/132023730