Unityのライフサイクルについて
主要なライフサイクル関数
1. Awake
ライフサイクルの中で一番最初に一度だけ呼ばれる関数です。
主に変数や参照先の初期化、他のゲームオブジェクトを参照して取得するとために使用します。
注意する点としてゲームオブジェクトに紐づけたスクリプトを無効(チェックを外す)にしてる時、通常はその中のStartやUpdateといった関数は実行されませんが、Awake関数は実行されます。
たとえスクリプトが無効になっててもゲームの開始やシーンをロードしたタイミングで実行されてしまいますので、そこは頭に入れておいたほうがいいです。
ちなみにゲームオブジェクト自体が無効の時は実行されません。
2. Start
Awake関数の次に呼ばれる関数です。
スクリプトが「有効化」されたタイミングで一度のみ実行されます。
こちらもAwake同様に変数や参照先の初期化、他のゲームオブジェクトの取得にしようします。
Start関数が実行される時には既に他のすべてのオブジェクトのAwake関数が実行された後の状態なので、Awake関数内で初期化されたあとのゲームオブジェクトを取得できます。
Start関数はスクリプトが無効状態の時は実行されません。
3. Update
ゲーム実行中に毎フレーム呼ばれる関数です。
オブジェクトの移動や、スコア・テキストの更新、状態の変化を更新するために使用します。
またプレイヤーのキーボードやマウスの入力を検知する時にも使用します。
Update関数はフレームレートに依存するため、レートが高いとその分より頻繁に呼ばれ、逆に低いと呼ばれる回数が少なくなります。
仮にフレームレートが60fpsの場合、1秒間に60回Update関数が実行されるので、Update関数内には極力重たい処理をいれないように注意が必要です。
4. FixedUpdate
Update関数同様にライフサイクルの中で一定間隔で常に呼ばれる関数です。
しかしUpdate関数とは違って、フレームレートに関連しません。
デフォルトでは0.02秒ごとに呼ばれます。
主に衝突処理などの物理エンジンの計算に使用されます。
フレームレートに依存しない理由はフレームレートが変動しても一定の間隔で物理エンジンの計算を行って物理挙動を保つためです。
5. OnApplicationQuit
アプリケーションが終了する直前に一度だけ呼ばれる関数です。
OnDestory関数同様にリソースのクリーンアップ処理を行うときに使用します。
一点注意が必要で、プラットフォームによっては呼び出されません。
たとえばiOSではOnApplicationQuit関数が呼び出されないようです。
6. OnDestory
ゲームオブジェクトが破棄される直前・スクリプトが削除されるタイミングで呼ばれる関数です。
主にリソースのクリーンアップ処理を行うときに使用します。
OnDestroy関数もAwake関数同様にスクリプトが無効かされた場合でも呼び出されます。
AwakeとStartの使い分け
- Awake関数...「すべてのスクリプトがロードされたタイミング」
- Start関数...「すべてのスクリプトが初期化されたタイミング」
上記の違いから、他のゲームオブジェクトを参照するけど完全に初期化されてる必要がないときはAwake関数を使って、完全に初期化されたオブジェクトを取得したいときはStart関数を使うのがいいです。
例
CallClientの初期化は他のすべてのスクリプトが初期化されてなくてもいいので、Awake関数で実行
public class CallManager: MonoBehaviour
{
public CallClient callClient;
private void Awake()
{
// CallClientを初期化
callClient = new CallClient();
}
別スクリプトの要素を使うため、初期化がされた後に読み込みたいので、Start関数で実行
public class StartCall: MonoBehaviour
{
private CallManager callManager;
private void Start()
{
別ファイルで初期化されたcallClientを参照
callManager = FindObjectOfType<CallManager>();
}
UpdateとFixedUpdateの使い分け
基本的には物理エンジンの計算・物理挙動に関わるところはFixedUpdate関数、それ以外の処理はUpdate関数という分け方でいいかなと思います。
Update関数とFixedUpdate関数で実行のタイミングにずれがあるので、そこは注意です。
OnDestoryとOnApplicationQuitの使い分け
どちらも似ていますが、実行されるケースとタイミングが違います。
もしアプリケーションを終了するタイミングで何か処理をしたい場合はOnApplicationQuit関数を呼び出す必要があります。
逆にアプリケーションは終了しないけど、シーンの遷移やオブジェクトの削除をするタイミングで処理をしたい場合はOnDestory関数を呼び出します。
また、実行の順番としてはOnApplicationQuit → OnDestoryの順に呼び出されます。
Discussion