session の利用可否とデバイス対応を確認する
AR を開始する前に、通常はまず session が利用可能か、そして現在のデバイスが必要な AR 機能をサポートしているかを確認します。この記事ではその確認方法を説明します。
始める前に
- ARSession 简介 で session の基本概念、構成、ワークフローを理解してください。
- 设备支持和报告 で、Unity におけるデバイス対応と session レポートの基礎を理解してください。
- 创建 session の方法を理解してください。
起動フロー中にレポートを取得する
assemble 後にそのまま session を起動する場合は、StateChanged イベントから session レポートを取得できます。
session start の前に StateChanged イベントへ購読する必要があります。通常は Awake() で購読するのが安全です。
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
イベント処理で注目する session 状態は Ready と Broken です。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.NoAvailabileFrameSource と SessionReport.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.SessionState と Report を使って 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 や代替手段を提供できないなら、現在のデバイスの制限を分かりやすく伝えるメッセージも必要です。
次のステップ
- session の実行を制御する 方法を学ぶ
- 帧数据源及运行时选取 を学ぶ
- さらに、次のサンプルでレポート取得後の使い方を確認できます。
- Workflow_ARSession 示例 は StateChanged イベントを使い、Broken に対する UI 表示を行い、さらに AssembleUpdate で各コンポーネントの可用性を UI に表示します
- SpatialMap_Sparse_AllInOne サンプルは AssembleUpdate でデバイス対応を事前判断し、利用不可なら警告を出します
- MotionTracking_DeviceMotionAndPlaneDetection サンプルは StateChanged を使い、Broken に対する UI 表示を行います
- MegaBlock_Basic サンプルは StateChanged を使い、Broken に対する UI 表示を行います