Session 可用性とデバイスサポートの判断
AR を開始する前に、通常は session が利用可能かどうか、および現在のデバイスが必要な AR 機能をサポートしているかどうかを判断する必要があります。この記事では、これらのチェックを実行する方法について説明します。
開始前に
- ARSession の概要 を通じて、session の基本概念、構成要素、およびワークフローを理解する
- デバイスサポートとレポート を通じて、Unity におけるデバイスサポートと session レポートの基本を理解する
- session の作成 方法を理解する
起動フローでのレポート取得
session を組み立てた後すぐに起動した場合、StateChanged イベントを通じて session レポートを取得できます。
session start の前に StateChanged イベントをサブスクライブする必要があります。通常、Awake() 内でサブスクライブを行うのは安全です:
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
イベントハンドラで注目すべき session の状態は、Ready と Broken です。Ready 状態は session が正常に起動したことを示し、session が現在のデバイスで利用可能であることも意味します。Broken 状態は session の起動に失敗したことを示し、session が現在のデバイスで利用できないことを意味します。
Broken 状態は、必ずしもデバイスがサポートされていない場合にのみ発生するわけではありません。したがって、具体的な失敗理由を取得するために SessionReport.BrokenReason を使用する必要があります。
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session は現在のデバイスで利用可能
}
else if (status == ARSession.SessionState.Broken)
{
// session は現在のデバイスで利用不可
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// 選択したコンポーネントが現在のデバイスでサポートされていない
}
else
{
// デバイスに依存しない理由
}
}
}
SessionReport.SessionBrokenReason.NoAvailabileFrameSource と SessionReport.SessionBrokenReason.FrameFilterNotAvailabile の理由が発生した場合、session コンポーネントが現在のデバイスで利用できないことを示します。他の理由は通常、デバイスに依存しません。厳密に言えば、これらの理由が発生することは、現在の構成(かつその構成のみ)での AR 機能がこのデバイスで動作しないことを意味します。構成とは、session オブジェクトで選択された機能と設定を指します。詳細な可用性レポートは Report から取得できます。
SessionReport.SessionBrokenReason.NoAvailabileFrameSource の場合、session 起動時にネットワーク経由でデバイスリストを更新中にデバイスがサポート対象であることが判明すると、session が自動的に回復する可能性があります。
起動前のレポート取得
session 起動前に判断を行い、具体的な状況に基づいて session を起動するかどうかを決定したい場合は、手動で Assemble() を呼び出し、AssembleUpdate イベントを使用してコンポーネントの可用性レポートを取得できます。
session assemble の前に AssembleUpdate イベントをサブスクライブする必要があります。
Session.AssembleUpdate += OnAssembleUpdate;
組み立ての第一段階では、ARSession.SessionState と Report を利用して session のサポート状況を判断できます。ただし、第二段階のレポートは session に更新されません。
したがって、通常、手動で Assemble() を呼び出す場合、AssembleUpdate イベント内でコンポーネントの可用性レポートを処理し、session が現在のデバイスで利用可能かどうかを判断する必要があります。
SessionReport.AvailabilityReport.FrameSources リスト内のコンポーネントの可用性に注目する必要があります。いずれかの frame source コンポーネントが利用可能であれば、SessionReport.AvailabilityReport.FrameSources の部分は現在のデバイスで利用可能です。
また、レポート内の SessionReport.AvailabilityReport.FrameFilters リスト内のコンポーネントの可用性にも注目する必要があります。ただし、判断基準は組み立てオプションによって異なり、すべての frame filter が利用可能であることを要求する場合と、任意の数の frame filter が利用可能であることを要求する場合があります。デフォルトオプションでは、すべての frame filter が利用可能であることが要求されます。
デフォルト構成では、次のコードを使用して session コンポーネントが現在のデバイスで利用可能かどうかを判断できます:
void OnAssembleUpdate(SessionReport.AvailabilityReport report)
{
if (report.FrameSources.Any(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available) &&
report.FrameFilters.All(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available))
{
Session.AssembleUpdate -= OnAssembleUpdate;
// session コンポーネントは現在のデバイスで利用可能、session を起動できる
Session.StartSession();
}
else
{
// session コンポーネントは現在のデバイスで利用不可
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
AssembleUpdate イベントは2回トリガーされる可能性があることに注意してください。上記のコード例では、コンポーネントが利用可能であると確認した後、イベントのサブスクライブを解除しています。
この判断方法では、session 起動プロセス中に発生する可能性のある他のエラーを判断できませんが、これらのエラーは通常デバイスに依存しません。必要に応じて、session 起動後に StateChanged イベントを通じて追加の判断を行うことができます。
session コンポーネントが利用不可の場合の選択肢
アプリケーション開発では、通常、可能な限り多くのデバイスとの互換性を提供したいと考えます。したがって、session コンポーネントが現在のデバイスで利用できない場合、次のいずれかの選択肢を検討できます:
他の AR 機能へのダウングレード
session コンポーネントの構成を変更し、現在のデバイスでサポートされている AR 機能を選択します。session コンポーネント構成の変更方法については、session の作成 を参照してください。非 AR 体験の提供
session コンポーネントが利用できない場合に、非 AR の体験を提供します。たとえば、ナビゲーションシナリオでは、AR ナビゲーションが実現できない場合、従来の 2D ナビゲーションを提供することは非常に有用です。デバイス交換のユーザーへの促し
特定のアプリケーションシナリオでは、ユーザーが AR 機能をサポートしていないデバイスを使用している可能性があります。この場合、より良い体験を得るためにデバイスを交換するようユーザーに促すことができます。
これらのオプションを選択する際には、アプリケーションの具体的な要件とユーザーベースを考慮してバランスを取ることが重要です。AR アプリケーションでは、一部のデバイスで AR または代替案が提供できない場合でも、現在のデバイスの制限をユーザーに理解してもらうために、適切なユーザー通知情報を提供する必要があります。
次のステップ
- session 実行の制御方法を理解する: session の制御
- フレームデータソースと実行時選択について理解する: フレームデータソースと実行時選択
- さらに、レポート取得後のアプリケーションシナリオを理解するために、以下のサンプルを参照できます:
- Workflow_ARSession サンプル は StateChanged イベントを使用し、Broken 状態に対して UI 通知を提供します。また、AssembleUpdate イベントを使用して各コンポーネントの可用性を UI に表示します
- SpatialMap_Sparse_AllInOne サンプルは、AssembleUpdate イベントを使用してデバイスサポートを事前に判断し、利用不可の場合の通知を提供します
- MotionTracking_DeviceMotionAndPlaneDetection サンプルは、StateChanged イベントを使用し、Broken 状態に対して UI 通知を提供します
- MegaBlock_Basic サンプルは、StateChanged イベントを使用し、Broken 状態に対して UI 通知を提供します