🥽

【Unity / Polyspatial】Apple Vision Proでアプリの状態変化を検知する

に公開

UnityでApple Vision Pro向けアプリを開発するにはPolyspatialパッケージを使用します。この記事では、Polyspatialを使用したアプリが閉じられてバックグラウンド状態になったときやバックグラウンド状態から復帰して表示されたときなど、アプリの状態が変化したことを検出する方法について解説します。

検証にはvisionOS 2.6、Unity 6000.1を使用し、Unbounded Modeでのみ検証しています。

アプリの状態変化の検出には、VolumeCameraWindowStateChangedプロパティを使用します。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@2.3/manual/VolumeCamera.html
https://docs.unity3d.com/Packages/com.unity.polyspatial@2.3/api/Unity.PolySpatial.VolumeCamera.html#Unity_PolySpatial_VolumeCamera_WindowStateChanged

WindowStateChangedプロパティはUnityEventインスタンスで、アプリの状態が変化したときに登録したコールバックが実行されます。コールバック引数のWindowEventプロパティで発生したイベント(BackgroundedClosedFocusedOpenedResized)が取得できます。Focusedイベントはフォーカスが当たったときと外れたときの両方で発火し、そのどちらかはIsFocusedプロパティで判断します。

using Unity.PolySpatial;
using UnityEngine;

public class VolumeCameraWindowStateChangedSample : MonoBehaviour
{
    [SerializeField] VolumeCamera volumeCamera;

    void Start()
    {
        volumeCamera.WindowStateChanged.AddListener((_, state) =>
        {
            Debug.Log($"event: {state.WindowEvent}, focused: {state.IsFocused}");
        });
    }
}

上のスクリプトによりアプリの状態変化に応じて以下のようなログが出力されます。

アプリを起動したとき
event: Opened, focused: true

アプリを閉じたとき
event: Focused, focused: false
event: Backgrounded, focused: false
event: Closed, focused: false

アプリがバックグランドにある状態でアプリを開いたとき
event: Opened, focused: true

警告ダイアログが出たとき
event: Focused, focused: false
↓ (警告ダイアログを閉じる)
event: Focused, focused: true

アプリを開いた状態でVisionProを外したとき
event: Focused, focused: false
event: Backgrounded, focused: false

アプリを開いた状態でVisonProを装着したとき
event: Opended, focused: true
event: Focused, focused: true

例えば、アプリを開いたときと閉じたときにそれぞれ処理を入れたい場合は以下のようにするとよさそうです。

volumeCamera.WindowStateChanged.AddListener((_, state) =>
{
    if (state.WindowEvent == VolumeCamera.WindowEvent.Opened || (state.WindowEvent == VolumeCamera.WindowEvent.Focused && state.IsFocused))
    {
        Debug.Log("On app activated");
    }
    else if (state.WindowEvent == VolumeCamera.WindowEvent.Focused && !state.IsFocused)
    {
        Debug.Log("On app deactivated");
    }
});

Discussion