Table of Contents

Session 可用性とデバイスサポートの判断

AR を開始する前に、通常は session が利用可能かどうか、および現在のデバイスが必要な AR 機能をサポートしているかどうかを判断する必要があります。この記事では、これらのチェックを実行する方法について説明します。

開始前に

起動フローでのレポート取得

session を組み立てた後すぐに起動した場合、StateChanged イベントを通じて session レポートを取得できます。

session start の前に StateChanged イベントをサブスクライブする必要があります。通常、Awake() 内でサブスクライブを行うのは安全です:

void Awake()
{
    Session.StateChanged += HandleSessionStateChange;
}

イベントハンドラで注目すべき session の状態は、ReadyBroken です。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.NoAvailabileFrameSourceSessionReport.SessionBrokenReason.FrameFilterNotAvailabile の理由が発生した場合、session コンポーネントが現在のデバイスで利用できないことを示します。他の理由は通常、デバイスに依存しません。厳密に言えば、これらの理由が発生することは、現在の構成(かつその構成のみ)での AR 機能がこのデバイスで動作しないことを意味します。構成とは、session オブジェクトで選択された機能と設定を指します。詳細な可用性レポートは Report から取得できます。

SessionReport.SessionBrokenReason.NoAvailabileFrameSource の場合、session 起動時にネットワーク経由でデバイスリストを更新中にデバイスがサポート対象であることが判明すると、session が自動的に回復する可能性があります。

起動前のレポート取得

session 起動前に判断を行い、具体的な状況に基づいて session を起動するかどうかを決定したい場合は、手動で Assemble() を呼び出し、AssembleUpdate イベントを使用してコンポーネントの可用性レポートを取得できます。

session assemble の前に AssembleUpdate イベントをサブスクライブする必要があります。

Session.AssembleUpdate += OnAssembleUpdate;

組み立ての第一段階では、ARSession.SessionStateReport を利用して 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 通知を提供します