MonoBehaviourの各種メソッドを使う際、いつ呼ばれるのか、どういうタイミングで呼ばれるのかを把握しておかないと、思わぬところでハマる場合があります。
よく使うメソッドについて、呼び出しタイミングをまとめました。
Awake
スクリプトがついているGameObjectがアクティブ(以下On)なら、スクリプト自体がOffでも呼ばれます。
また、シーンロード時にGameObjectをOffにしておき、実行後にOnに変更した際にも呼ばれます。
また、プレハブをInstantiateした場合は、呼び出し元のスクリプトをブロックしてInstantiateされた側のAwake, OnEnableが実行されます。
コード1 Instantiate (Prefab); コード2
コード2が実行されるのは、PrefabのAwake, OnEnableの実行が終了した後です。
OnEnable, OnDisable
スクリプトをOn-Offするたびに呼ばれます。
気をつけたいのは、GameObjectのActive状態によって呼ばれるかどうか変わるということ。
- スクリプトがOnの状態で、GameObjectの状態をOn-Offすると呼ばれます。
- スクリプトがOffの状態でGameObjectをOn-Offしても呼ばれません。
- GameObjectがOffの状態でスクリプトをOn-Offしても呼ばれません。
- GameObjectがOnの状態でスクリプトをOn-Offすると呼ばれます。
特に呼ばれないパターンはしっかり覚えておいたほうがいいでしょう。
また、ゲームの実行を停止したり、シーンをアンロードしたときにも呼ばれます。 豆知識として覚えておきましょ。
Start
最初のUpdate関数が呼ばれる前に一度だけ呼ばれます。
タイミング的にはOnEnableの後、Updateの前です。
OnEnableと違って、最初にOnの状態になったときの一回しか呼ばれないのでご注意を。
Update
ご存知、毎フレーム呼ばれる関数です。
FixedUpdate
Updateと似ていますが、物理エンジンを扱う場合はこちらの関数で行います。
例えばRigidbodyにAddForceしたり、velocityを取得したりする場合など。
自分はUpdateの中でRigidbody.velocityを取得して姿勢制御をしたら、ゲッダン始まったことがありました(遠い目)。
気をつけたいのが、Updateの合間に複数回呼ばれる可能性があること。
FixedUpdate Update FixedUpdate FixedUpdate Update ...
という順番で呼ばれたりします。
処理落ちが起きた際にそういう現象が起きます。
FixedUpdateはフレームレートによらず一定間隔で呼ばれる関数です。
LateUpdate
Update関数の後に呼ばれます。Updateと同じく毎フレーム呼ばれる関数です。
全スクリプトのUpdate関数が呼ばれた後に呼ばれるので、処理を切り分けるのに便利です。
Script Execution Orderを使わずにこちらで済ませられる場合があります。
OnApplicationQuit
アプリケーションが終了するときに呼ばれます。
また、OnDestroy、OnDisableはOnApplicationQuitの後に呼ばれるのでご注意を。
直感的には間違えやすい場所です。
OnBecameVisible, OnBecameInvisible
この関数を定義したスクリプトと一緒にMeshRendererやSkinnedMeshRendererがアタッチされている場合に、カメラでゲーム画面にオブジェクトが表示されるときに呼ばれます。
Transformのポジションを移動してカメラ領域に入ったとき、もしくは、GameObjectやレンダラの状態をOn-Offしたときにも呼ばれます。
なんと、当メソッドを定義してあるスクリプトがOff状態でも呼ばれてしまいますので注意。
カメラが複数個あった場合でも、呼ばれるのはレンダラ一個につき一回だけです。
カメラが全てOffになっていても、内部的に描画対象の空間にいる場合は呼ばれますので、ここも気をつけたいところ。
OnCollision, OnTrigger
FixedUpdateの後、Updateの前に呼ばれます。
FixedUpdateと同じサイクルで呼ばれるので、Updateの間に複数回はさまる場合があります。
ちなみにOnCollisionはOnTriggerの後に呼ばれます。
・参考 http://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html