MRが楽しい

MRやVRについて学習したことを書き残す

UnityでOnApplicationFocusを使ってアプリケーションのフォーカス時の処理を行う

本日は Unity の小ネタ枠です。
UnityでOnApplicationPauseを使ってアプリケーションのフォーカス時の処理を行う方法についてです。

OnApplicationFocus

アプリケーションがフォーカスを取得、または、失ったときに、すべてのゲームオブジェクトに送信されます。
フォーカスがアプリケーションに戻ったときはステータスに true が渡され、外れるときに false が渡されます。
OnApplicationFocus は yield ステートメントを使ってコルーチンにすることができます。
この場合、初期フレーム内で早期通知と通常の更新ステップの2回評価されます。
docs.unity3d.com

注意:UnityEditor の場合、OnApplicationFocus は[Game]ビューがフォーカスを失ったり戻ったりしたときに呼ばれます。
外部アプリケーション(Unity以外のアプリケーション)にフォーカスがあるとき、[Game]ビュー以外のタブをクリックすると、1フレームで2回 OnApplicationFocus が呼び出されます。
1回目は Unity がフォーカスを取り戻すと[Game]ビューもフォーカスを取り戻すため、引数を true に設定して OnApplicationFocus を呼び出します。
2回目は[Game]ビューがクリックされたタブにフォーカスを奪われるため、引数を false に設定して OnApplicationFocusが 呼び出されます。

サンプルコード

エディター上でフォーカス変化時の動作を確認する以下のサンプルコードを用意しました。
・OnApplicationFocusTest.cs

using UnityEngine;

public class OnApplicationFocusTest : MonoBehaviour
{
    void OnApplicationFocus(bool focusStatus)
    {
        Debug.Log($"Check OnApplicationFocus : {focusStatus}");
    }
}

サンプルシーン起動時、[Game]ビューにフォーカスが映るので引数 True で OnApplicationFocus が呼び出されます。

この後、Unity 以外のアプリケーションを選択してフォーカスを外すと引数 False で OnApplicationFocus が呼び出されます。

次に[Game]ビューを再び選択した場合と、Unity の[Game]ビュー以外の部分を選択した場合です。
[Game]ビューを再び選択した場合は引数 True で OnApplicationFocus が呼び出されます。

Unity の[Game]ビュー以外の部分を選択した場合は前述の注意事項の通り、引数 True と False の2回 OnApplicationFocus が呼び出されます。