本日は Unity の調査枠です。
アプリ起動/終了時に呼び出されるMonoBehaviourの関数の順序を確認することがあったので記事にします。
アプリ起動/終了時に呼び出される関数
MonoBehaviourを継承したスクリプトは特定のタイミングで特定の関数がキックされます。
docs.unity3d.com
今回はアプリ起動/終了時に呼び出される以下の関数を一つのスクリプトにまとめ、その呼び出し順序を確認しました。
・Awake()
・Start()
・OnEnable()
・OnDisable()
・OnApplicationFocus(bool)
・OnApplicationPause(bool)
・OnDestroy()
・OnApplicationQuit()
確認用スクリプトを作成する
呼び出しタイミングでデバッグログを出力する以下のスクリプトを作成しました。
・CheckScript.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CheckScript : MonoBehaviour { /// <summary> /// スクリプトのインスタンスがロードされたときに呼び出されます /// </summary> private void Awake() { Debug.Log("Awake"); } /// <summary> /// 最初のUpdateメソッドが呼び出される前にスクリプトが有効になると /// フレーム上でStartが呼び出されます。 /// </summary> private void Start() { Debug.Log("Start"); } /// <summary> /// オブジェクトが有効/アクティブになったときに呼び出されます /// </summary> private void OnEnable() { Debug.Log("OnEnable"); } /// <summary> /// オブジェクトが無効/非アクティブになったときに呼び出されます /// </summary> private void OnDisable() { Debug.Log("OnDisable"); } /// <summary> /// プレイヤーがフォーカスを取得、または、失ったときに呼び出されます /// </summary> /// <param name="focus">フォーカス有無</param> private void OnApplicationFocus(bool focus) { Debug.Log("OnApplicationFocus : " + focus); } /// <summary> /// プレイヤーが一時停止したときに呼び出されます /// </summary> /// <param name="pause">一時停止有無</param> private void OnApplicationPause(bool pause) { Debug.Log("OnApplicationPause : " + pause); } /// <summary> /// オブジェクトが破棄されたときに呼び出されます /// </summary> private void OnDestroy() { Debug.Log("OnDestroy"); } /// <summary> /// アプリケーションが終了する前に呼び出されます /// </summary> private void OnApplicationQuit() { Debug.Log("OnApplicationQuit"); } }
Empty オブジェクトを作成し、本スクリプトをアタッチしました。
UnityEditorでの確認
それぞれ[再生]ボタンをクリックして、アプリを起動したときと、アプリを終了したときのデバッグログを確認しました。
・アプリ起動時
Awake() ↓ OnEnable() ↓ OnApplicationPause(false) ↓ OnApplicationFocus(true) ↓ Start()
・アプリ終了時
OnApplicationQuit() ↓ OnDisable() ↓ OnDestroy()