アプリケーション終了時のコルーチン呼び出し
2023/12/16
Unity version : 2022.3.15f1 Personal(日本語化済み)
作成者:ダイギイン(アクシオン管理人)

はじめに

アプリケーションを終了する際に自動で何かさせたいことがあると思います。
Unityでは OnApplicationQuit関数内に処理を記述することで実現できるようです。
・・・できるようなんですが、その関数内に別の関数を呼び出すとき、 IEnumerator型のようにコルーチンだった場合は、その限りではないのかもしれません。

今回はその検証をしようと思います。


目次


準備



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

ページトップ