本日はMetaQuestの小ネタ枠です。
Questアプリで閉じるボタン押下時に終了処理を実行する方法についてです。
Questアプリの閉じるボタン押下時の動作
Questアプリはメニューパネルの[閉じる]ボタンを押下したとき、内部的にはポーズ処理でアプリを抜けます。
このため、OnApplicationQuitは呼び出されません。
bluebirdofoz.hatenablog.com
代わりにポーズ状態の変化を検知してOnApplicationPauseが呼び出されます。
bluebirdofoz.hatenablog.com
閉じるボタン押下時に終了処理を実行する
閉じるボタン押下時にアプリの終了処理を呼び出したい場合はポーズ状態の変化を検知してApplication.Quitでアプリを終了します。
docs.unity3d.com
以下のサンプルスクリプトを作成しました。
- フォーカスが外れるかつポーズ状態に移行した場合、閉じるボタンが押下されたと判定してアプリを終了します。
- OnApplicationQuitが呼び出されたときにドキュメントフォルダにログを出力します。
using System.Threading.Tasks; using UnityEngine; public class QuestAppQuit : MonoBehaviour { #if UNITY_ANDROID /// <summary> /// アプリ終了(OnApplicationQuit)が発生した際にドキュメントフォルダにログを出力する /// </summary> private void OnApplicationQuit() { string documentFolderPath = GetDocumentFolderPathPerAndroid29(); string logFilePath = System.IO.Path.Combine(documentFolderPath, "OnApplicationQuitLog.txt"); string exitTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string logText = $"OnApplicationQuit: {exitTime}\n"; try { // ドキュメントフォルダにログを出力 System.IO.File.AppendAllText(logFilePath, logText); } catch (System.Exception e) { Debug.LogError("Failed to write exit log: " + e.Message); } } /// <summary> /// 現在のアプリケーションのフォーカス状態(OnApplicationFocus)とぽーズ状態(OnApplicationPause)を参照して /// [閉じる]ボタンが押されたときにアプリケーションを終了する /// </summary> private void ControlAppQuit() { // フォーカスが外れていて、ポーズ状態の場合はアプリケーションを終了する if (!m_IsFocused && m_IsPaused) { Debug.Log("Application is quitting due to focus and pause state."); Application.Quit(); } } // 現在のアプリケーションのフォーカス状態(OnApplicationFocus) private bool m_IsFocused = true; /// <summary> /// フォーカスの状態変化(OnApplicationFocus)が発生した際にドキュメントフォルダにログを出力する /// フォーカスが当たったときはtrue、フォーカスが外れたときはfalse /// </summary> private void OnApplicationFocus(bool focus) { m_IsFocused = focus; // アプリケーションの終了を行うかどうかを制御する ControlAppQuit(); } // 現在のアプリケーションのポーズ状態(OnApplicationPause) private bool m_IsPaused = false; /// <summary> /// アプリポーズ(OnApplicationPause)が発生した際にドキュメントフォルダにログを出力する /// ポーズが発生したときはtrue、ポーズが解除されたときはfalse /// </summary> private void OnApplicationPause(bool pause) { m_IsPaused = pause; // アプリケーションの終了を行うかどうかを制御する ControlAppQuit(); } // 略 #endif }
作成したスクリプトを任意のオブジェクトに設定します。

実機での動作確認
アプリを起動後、Metaボタンでメニューを開いて[閉じる]ボタンを押下しました。

結果、ドキュメントフォルダにOnApplicationQuitの実行ログが出力されました。

