Table of Contents

session の利用可否とデバイス対応を確認する

AR を開始する前に、通常はまず session が利用可能か、そして現在のデバイスが必要な AR 機能をサポートしているかを確認します。この記事ではその確認方法を説明します。

始める前に

  • ARSession 简介 で session の基本概念、構成、ワークフローを理解してください。
  • 设备支持和报告 で、Unity におけるデバイス対応と session レポートの基礎を理解してください。
  • 创建 session の方法を理解してください。

起動フロー中にレポートを取得する

assemble 後にそのまま session を起動する場合は、StateChanged イベントから session レポートを取得できます。

session start の前に StateChanged イベントへ購読する必要があります。通常は Awake() で購読するのが安全です。

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

イベント処理で注目する session 状態は ReadyBroken です。Ready は session が正常に起動したこと、つまり現在のデバイスで利用可能であることを意味します。Broken は起動に失敗したこと、つまり現在のデバイスで利用できないことを意味します。

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 コンポーネントが現在のデバイスで利用できないことを示します。その他の理由は通常、デバイスに依存しません。厳密には、この 2 つの理由は、現在の構成だけではそのデバイスで AR 機能を実行できないことを意味します。構成とは、session オブジェクトで選択した機能と設定を指します。詳細な可用性レポートは Report から取得できます。

SessionReport.SessionBrokenReason.NoAvailabileFrameSource の場合、session 起動時にオンラインでデバイス一覧を更新して、そのデバイスがサポート済みだと分かれば、session が自動的に回復することがあります。

起動前にレポートを取得する

session 起動前に判断し、状況に応じて session を起動するか決めたい場合は、Assemble() を手動で呼び出し、AssembleUpdate イベントでコンポーネントの可用性レポートを取得できます。

session assemble の前に AssembleUpdate イベントへ購読する必要があります。

Session.AssembleUpdate += OnAssembleUpdate;

assemble の第 1 フェーズでは、ARSession.SessionStateReport を使って session の対応状況を判断できます。ただし第 2 フェーズのレポートは session に反映されません。

そのため、手動で Assemble() を呼ぶ場合は、AssembleUpdate イベント内で可用性レポートを処理し、現在のデバイスで session が使えるか判断するのが一般的です。

特に SessionReport.AvailabilityReport.FrameSources リスト内のコンポーネント可用性に注意してください。frame source コンポーネントが 1 つでも利用可能なら、SessionReport.AvailabilityReport.FrameSources 部分は現在のデバイスで利用可能です。

また、レポート内の SessionReport.AvailabilityReport.FrameFilters リストにも注意が必要です。ただし判定基準は assemble オプションによって異なり、すべての 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 起動中に起こりうる他のエラーまでは判断できませんが、そうしたエラーは通常デバイスに依存しません。必要なら、起動後に StateChanged イベントで補足判断できます。

session コンポーネントが使えない場合の選択肢

アプリ開発では、できるだけ多くのデバイスに対応したいのが普通です。session コンポーネントが現在のデバイスで使えない場合、次の選択肢があります。

  • 他の AR 機能へダウングレードする
    session コンポーネント構成を変更し、現在のデバイスでサポートされる AR 機能を選びます。構成変更の方法は 创建 session を参照してください。

  • 非 AR 体験を提供する
    session コンポーネントが使えない場合は、AR ではない体験を提供します。たとえばナビゲーション場面で AR ナビゲーションが無理なら、従来の 2D ナビゲーションはとても有効です。

  • ユーザーに別デバイスを案内する
    場合によっては、AR 機能をサポートしないデバイスを使っていることがあります。その場合は、よりよい体験のために別デバイスの使用を促せます。

これらの方法を選ぶ際は、アプリの要件とユーザー層に応じて判断してください。AR アプリで、一部のデバイスがどうしても AR や代替手段を提供できないなら、現在のデバイスの制限を分かりやすく伝えるメッセージも必要です。

次のステップ