いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : MonoBehaviour各関数の呼び出しタイミング

MonoBehaviourの各種メソッドを使う際、いつ呼ばれるのか、どういうタイミングで呼ばれるのかを把握しておかないと、思わぬところでハマる場合があります。

よく使うメソッドについて、呼び出しタイミングをまとめました。

Awake

スクリプトがついているGameObjectがアクティブ(以下On)なら、スクリプト自体がOffでも呼ばれます。

f:id:sugar_affordance:20160707165740p:plain

また、シーンロード時に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


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。