はじめに
UnityでC#スクリプトを書き始めると、必ず目にするのが次のような関数です。
・Awake()
・Start()
・Update()
・FixedUpdate()
・OnEnable()
・OnDisable()
この記事では、それぞれの関数がいつ呼ばれるのか、何を書くべきかなどを解説します。
MonoBehaviourのライフサイクルとは?
Unityでは、MonoBehaviour を継承したクラスに対して、決められたタイミングで特定の関数が自動的に呼ばれます。
これをライフサイクルと呼びます。
ポイントは、
自分で呼んでいないのに、Unityが勝手に呼んでいる
という点です。
Awake
void Awake()
{
Debug.Log("Awake");
}
これは、オブジェクト生成後に呼ばれる関数です。
Startより先に呼ばれるのが特徴です。
自身の初期化や、コンポーネント取得(GetComponent)などに向いています。
Start
void Start()
{
Debug.Log("Start");
}
これは、最初のUpdateが呼ばれる直前に呼び出されます。
1度だけ実行され、この時点では必ず他オブジェクトのAwakeが終わっています。
そのため、他のオブジェクトを参照する初期化やゲーム開始時の処理など、他のオブジェクトが存在する前提で進む処理を記述します。
Update
void Update()
{
Debug.Log("Update");
}
これは、毎フレーム呼ばれる関数です。
入力処理、毎フレームの状態更新、アニメーションの制御などに向いています。
一方、処理を書きすぎると動作が重くなるというデメリットもあります。
FixedUpdate()
void FixedUpdate()
{
Debug.Log("FixedUpdate");
}
これは、主に物理演算用の関数です。
一定時間ごとに呼ばれ、フレームレートに依存しないのが特徴です。
Rigidbodyを使った物理処理や、AddForceなどの物理演算に使います。
OnEnable
void OnEnable()
{
Debug.Log("OnEnable");
}
GameObjectやコンポーネントがアクティブになるたびに呼ばれます。
対になる関数として、OnDisableがあります。
おわり
Unityには、このように似たような関数が存在します。
違いを理解し、使いこなせるようになりましょう。