MRが楽しい

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

Questアプリでメニューが開かれた状態を検知する

本日はMetaQuest3の小ネタ枠です。
Questアプリでメニューが開かれた状態を検知する方法です。

メニューが開かれた状態

没入型のQuestアプリではコントローラの[Meta]ボタンを押すと、メニュー画面が開きます。
このとき没入中のQuestアプリは一時停止状態となり、メニュー画面を閉じるまで操作が行えなくなります。

このとき、没入型のQuestアプリは操作が行えないだけでアプリ自体は一時停止せずに動作し続けています。

メニューが開かれた状態を検知する

このメニューが開かれた状態を検知するには OnApplicationFocus(bool) 関数が利用できます。
本関数はアプリケーションのフォーカスが外れた、または取得された場合に状態が通知されます。
docs.unity3d.com

サンプルスクリプト

アプリケーションのフォーカスの変化を検知して、テキストメッセージに表示する以下のサンプルスクリプトを作成しました。
・PauseTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class PauseTest : MonoBehaviour
{
    /// <summary>
    /// 出力用テキストフィールド
    /// </summary>
    [SerializeField]
    private TMP_Text p_text;

    /// <summary>
    /// 起動時処理
    /// </summary>
    private void Start()
    {
        if (p_text != null) p_text.text = "";

        string text = "Start";
        message(text);
    }

    /// <summary>
    /// フォーカスの検出
    /// </summary>
    /// <param name="focus"></param>
    private void OnApplicationFocus(bool focus)
    {
        string text = "OnApplicationFocus:" + focus;
        message(text);
    }
    
    /// <summary>
    /// メッセージ出力
    /// </summary>
    /// <param name="text"></param>
    private void message(string text)
    {
        if (p_text != null)
        {
            // 発生時刻と共にテキストフィールドに文字を出力
            p_text.text += text;
            p_text.text += System.DateTime.Now.ToString(" hh:mm:ss");
            p_text.text += System.Environment.NewLine;
        }
    }
}

シーンに適当なテキストパネルを作成し、コンポーネントを設定します。

動作確認

MetaQuest3でデプロイしたアプリを起動し、コントローラの[Meta]ボタンを押下します。

メニューが開かれたタイミングで OnApplicationFocus に false の通知が行われたログが確認できました。

メニューから[再開]ボタンを押してアプリを再開します。

すると再開したタイミングで OnApplicationFocus に true が通知されます。
これでQuestアプリでメニューが開かれた状態を検知することができました。

補足

なお前述の通りアプリは一時停止していないため、メニューを開く操作では以下の OnApplicationPause 関数の通知は発生しません。
docs.unity3d.com