MRが楽しい

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

Questアプリでメニューボタンでウィンドウが開いたことを検知する

本日はUnityの小ネタ枠です。
Questアプリでメニューボタンでウィンドウが開いたことを検知する方法についてです。

OnApplicationFocus

OnApplicationFocusmメソッドはアプリがフォーカスを取得またはロストしたときに呼び出されます。
本メソッドはMonoBehaviourで実装された全てのスクリプトで機能します。
docs.unity3d.com

Questアプリではプレイヤーがメニューボタンでウィンドウを開くとフォーカスをロストします。
このため、OnApplicationFocusmメソッドを使ってウィンドウが開いたことを検知できます。

サンプルスクリプト

以下の別ウィンドウが開かれたときにメッセージを通知するサンプルスクリプトを作成しました。
・FocusExitCheck.cs

using TMPro;
using UnityEngine;

public class FocusExitCheck : MonoBehaviour
{
    [SerializeField]
    private TMP_Text messageText;
    
    /// <summary>
    /// フォーカス変更時のイベント
    /// </summary>
    /// <param name="focus"></param>
    private void OnApplicationFocus(bool focus)
    {
        // フォーカスを失ったときにメッセージを表示する
        if (focus == false)
        {
            messageText.text = "別ウィンドウが開かれました";
        }
    }
}

シーン内の任意のゲームオブジェクトにスクリプトを設定し、テキストへの参照を設定します。

これで準備は完了です。プロジェクトのビルドとQuest3へのデプロイを実行します。

アプリ内でコントローラのQuestボタンを押下してメニューウィンドウを開いてみます。

以下の通りウィンドウを開いた時点でフォーカス変更のイベントが検知されてメッセージが書き換わっています。

Tips

アプリを終了するApplication.Quit()と組み合わせると、別ウィンドウを開くと同時にアプリを終了することも可能です。

using TMPro;
using UnityEngine;

public class FocusExitCheck : MonoBehaviour
{
    [SerializeField]
    private TMP_Text messageText;
    
    /// <summary>
    /// フォーカス変更時のイベント
    /// </summary>
    /// <param name="focus"></param>
    private void OnApplicationFocus(bool focus)
    {
        // フォーカスを失ったときにアプリを終了する
        if (focus == false)
        {
            Application.Quit();
        }
    }
}

docs.unity3d.com