🥽
【Unity / Polyspatial】Apple Vision Proでアプリの状態変化を検知する
UnityでApple Vision Pro向けアプリを開発するにはPolyspatialパッケージを使用します。この記事では、Polyspatialを使用したアプリが閉じられてバックグラウンド状態になったときやバックグラウンド状態から復帰して表示されたときなど、アプリの状態が変化したことを検出する方法について解説します。
検証にはvisionOS 2.6、Unity 6000.1を使用し、Unbounded Modeでのみ検証しています。
アプリの状態変化の検出には、VolumeCamera
のWindowStateChanged
プロパティを使用します。
WindowStateChanged
プロパティはUnityEvent
インスタンスで、アプリの状態が変化したときに登録したコールバックが実行されます。コールバック引数のWindowEvent
プロパティで発生したイベント(Backgrounded
、Closed
、Focused
、Opened
、Resized
)が取得できます。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