はじめに
アプリケーションを終了する際に自動で何かさせたいことがあると思います。
Unityでは OnApplicationQuit関数内に処理を記述することで実現できるようです。
・・・できるようなんですが、その関数内に別の関数を呼び出すとき、
IEnumerator型のようにコルーチンだった場合は、その限りではないのかもしれません。
今回はその検証をしようと思います。
目次
準備
- Unity Hub からプロジェクトを新規作成します。(今回は2Dプロジェクト)
- ヒエラルキーに"Example"という名前の空のオブジェクトを作ります
- 新しい検証用のスクリプト"Example.cs"を作成します
fig.1 検証の準備
検証1 void型関数を呼び出す場合
OnApplicationQuit関数内で void型関数を呼び出す場合として以下のスクリプト(script.1)を作成します。
関数名は"Sample"とします。
script.1 Example1.cs
プログラムを実行し、停止しするとunityのコンソールは次のようになります。
fig.2 検証結果1
コンソールのメッセージから、Sample関数が実行されたことが判りました。
検証2 IEnumerator型コルーチンの場合
OnApplicationQuit関数内で IEnumerator型関数をコルーチンで呼び出す場合として以下のスクリプト(script.2)を作成します。
関数名は"SampleCoroutine"とします。
script.2 Example2.cs
プログラムを実行し、停止しするとunityのコンソールは次のようになります。
fig.3 検証結果2
コンソールのメッセージから、SampleCoroutine関数が実行されていないことが判りました。
検証3 IEnumerator型だが通常の呼び出しの場合
IEnumerator型関数を通常の呼び出しをするとして以下のスクリプト(script.3)を作成します。
関数名は検証2と同じで"SampleCoroutine"とします。
script.3 Example3.cs
プログラムを実行し、停止しするとunityのコンソールは次のようになります。
fig.4 検証結果3
コンソールのメッセージから、SampleCoroutine関数が実行されていないことが判りました。
今回のまとめ
今回の検証から OnApplicationQuit関数内において、関数の型がIEnumerator型の関数を呼び出しても実行されないことが判りました。
理由としてはUnity公式のマニュアルにある
スクリプトライフサイクルのフローチャートを見る限り、OnApplicationQuit関数が実行されるのはメインループから外れた後に呼び出されるからと思われます。
また、チャート内の説明で"OnEnabled will be called if it is enabled again"とあり、OnEnableにしないとスクリプト自体が止まってしまうからと思われます。
参考文献
・スクリプトライフサイクルのフローチャート(Unity Documentation) https://docs.unity3d.com/ja/2018.4/Manual/ExecutionOrder.html