Unity Engine #4 MonoBehavior 1
このノートは主に、Unity がデフォルトで作成するスクリプト親クラス MonoBehavior について知っておく必要があることを説明します。
ライフサイクル
下図は Unity 公式より。この図で、MonoBehavior 内の関数の順序を確認できます。
初期化
初期化フェーズでは、上図のように、Awake()、Reset()、OnEnable()、Start() の関数が使用されます。
Awake
Awake はスクリプトインスタンスがロードされるときに呼び出されます。これはすべての関数の中で最初に呼び出される関数です。オブジェクトと変数の初期化(通常はローカルまたは他のスクリプトに依存しない)に使用されます。
この関数はすべてのオブジェクトが初期化された後に呼び出されますが、ゲームオブジェクトが Enabled になる前にも呼び出されます。スクリプトコンポーネントが有効になっていなくても呼び出されます。
Awake は1回だけ呼び出されます。
Reset
Reset は、ユーザーが初めてコンポーネントを追加したとき、またはエディタでスクリプトをリセットしたときに呼び出されます。通常はデフォルト値の設定に使用されます。
この関数はゲーム実行中には呼び出されません。エディタモードでは、ゲームオブジェクトにコンポーネントを追加したとき、またはコンポーネントの Reset オプション(右上の3点の内側)をクリックしたときに1回呼び出されます。
OnEnable
スクリプトインスタンスが有効になったときに呼び出されます。
有効状態はエディタモードで確認できます。スクリプト名の左側のボックスにチェックが入ると Disabled、チェックが入ると Enabled です。
C# では、.isEnabled = true/false を通じてこのスクリプトインスタンスを有効/無効にできます。
この関数は Awake の後、Start の前に呼び出されます。スクリプトインスタンスが有効になったときに呼び出されるため(Disabled から Enabled への変更は有効化とみなされる)、この関数は複数回呼び出される可能性があります。
Start
スクリプトの最初の Update の前に1回呼び出されます。この関数も通常は初期化の設定に使用され、特に他のオブジェクトや他のスクリプトに依存する初期化に使用されます。
この関数は Awake と OnEnable の後に呼び出されます。スクリプトが有効になっていない場合、この関数は呼び出されません。
物理
物理フェーズでは、主に FixedUpdate、OnCollisionXXX、OnTriggerXXX を扱います。OnAnimatorMove()、OnAnimatorIK(int layerIndex)、OnStateMachineEnter/Exit などのアニメーション関連の関数も含まれますが、呼び出し順序は重要ではありません。まず最初の3つを見てみましょう。
FixedUpdate
FixedUpdate は物理関連のコード(剛体の移動、回転、物理計算など)の処理に使用されます。固定時間で更新され(1秒あたり50回呼び出され、つまり 0.02 秒のステップ)、フレームレートに依存しないため、異なるフレームレートでも物理シミュレーションは一貫します。呼び出し頻度は Unity の TimeManager で調整できます。
OnCollisionEnter/Stay/Exit(Collision)
OnCollisionXXX 関数はすべて衝突イベントを処理します。いずれも Collision をパラメータとして受け取ります。
Enter:2つのオブジェクトのコライダーが初めて接触したとき、衝突する各オブジェクトに対してこの関数が1回呼び出されます。
Stay:衝突が持続している間、各物理更新で呼び出されます。物理更新の固定ステップサイズは FixedUpdate と同じで、0.02 秒です(または FixedUpdate は各物理更新で呼び出されると言い換えられる)。
Exit:衝突が終わったときに1回呼び出されます。
OnCollision シリーズの関数は、衝突する2つのオブジェクトの少なくとも1つが Rigidbody コンポーネントを持っている必要があることに注意してください。
OnTriggerEnter/Stay/Exit(Collider other)
OnTriggerXXX 関数はすべてトリガーイベントを処理します。いずれも Collider をパラメータとして受け取ります。OnCollision シリーズと同様に、ここでは詳細には触れません。
OnControllerColliderHit(ColliderHit hit)
特に、Character Controller コンポーネントと他のコライダーベースの処理を扱うときに、この関数を使用できます。
入力とゲームロジック
入力とゲームロジックフェーズでは、主に OnMouseXXX、Update、LateUpdate の関数を挙げます。
OnMouseDown/Up/Drag/Over/Exit
OnMouse シリーズは、ユーザーがマウスでゲームオブジェクトの Collider と対話するときにトリガーされるイベントを処理します。
Down:ユーザーがクリックしたときにトリガーされるイベント。
Up:ユーザーがゲームオブジェクトの Collider 上で押したマウスボタンを離したときにトリガーされる。
Drag:ユーザーがマウスボタンを押したままゲームオブジェクトの Collider 上で移動したときにトリガーされる。
Over:ユーザーのマウスがゲームオブジェクトの Collider 上にある間、継続的に呼び出される。
Exit:ユーザーのマウスがゲームオブジェクトの Collider 上にホバーしなくなったときに呼び出される。
ゲームオブジェクトには Collider が必要であることに注意してください。
Update
Update 関数は毎フレーム1回呼び出され、通常のゲームロジックを処理します。
毎フレーム呼び出され、フレームレートと同じ頻度であるため、アニメーションやスムーズな移動の処理に適しています。
LateUpdate
LateUpdate 関数は Update 関数の後に呼び出され、シーン内のすべての GameObject の Update が完了した後に実行されます。したがって、この関数は通常、順序依存が必要な更新を解決するために使用されます。
この関数はカメラの調整やフォロー効果によく使用されます。すべてのオブジェクトが Update の移動を完了したことを保証するためです。
レンダリング
シーンレンダリングフェーズでは、この部分の関数は主にレンダリングパイプラインで CPU が GPU にマテリアルを提供するデータ部分を提供します。この部分の関数は URP と Built-In で動作が異なる場合があることに注意してください。Unity は異なるレンダリングパイプラインを提供しているためです。
OnPreCull
カメラがカリングを開始する前に呼び出されます。カメラのプロパティやシーンの状態を変更するために使用できます。
OnWillRenderObject
この関数は、オブジェクトをレンダリングする前に各カメラで呼び出されます。オブジェクトレベルでのプリレンダリング設定によく使用され、マルチカメラビューの調整にも使用できます。
OnBecameVisible / OnBecameInvisible
オブジェクトが可視または不可視になったときに自動的に呼び出される関数です。
OnPreRender / OnRenderObject / OnPostRender
カメラがシーンのレンダリングを開始する前/シーンがレンダリングされるとき/シーンがレンダリングされた後に呼び出される関数。レンダリングパイプラインのパフォーマンスに影響する可能性があるため、慎重に使用する必要があります。
OnRenderImage
URP では効果がありません。すべての画像が画面に表示される準備ができる前に呼び出され、通常は画像のポストプロセス効果に使用されます。パフォーマンスに一定の影響を与えやすいです。
参考文献:
- Unity Manual、https://docs.unity3d.com/Manual/ExecutionOrder.html
