デバイス要件の検証

このドキュメントでは、デバイスのAR対応状況とソフトウェアのアップデートを確認する方法について説明します。

デバイスの要件

ARはコンピュータービジョンの高価なアルゴリズムをもとに動作するため、必ずしもすべてのデバイスで高品質な体験を維持できるわけではありません。古いデバイスには、十分な品質のCPUやGPU、カメラが搭載されていない場合があります。デバイスの要件については、 システム要件 のランタイム要件セクションを参照してください。

さらに、ARDKではARCoreやARKitなどの共有ライブラリを使用します。デバイスのハードウェアがARに対応している場合でも、それらのライブラリをインストールし、実行できるようにする必要があります。

必要要件の検証

ARDKでは、上記の要件の検証を管理できます。 ARWorldTrackingConfigurationFactory.CheckCapabilityAndSupport を使用して、デバイスがARに対応しているか、必要なソフトウェアが最新かどうかを確認できます。

CapabilityChecker

CapabilityCheckerは、ARDKがデバイス上で実行可能かどうかを非同期で判断し、結果を表示するためのマネージャーです。Androidデバイスでは、このプロセスで、必要に応じてARCoreのアップデートが行われる場合があります。

ARCoreのインストール

Androidでは、Google Play Services for AR(ARCore)をアプリに連携し、Playストアからインストールする必要があります。ARDKは、すでにARCoreと連携されているため、ここでは、ARCoreがインストールされているかどうかを確認するだけです。ARDKには、ARCoreが最新でない場合に、ARCoreをインストールし、アップデートしてもらうようエンドユーザーをPlayストアに誘導するAPIが用意されています。Androidデバイスのソフトウェアはサポートされているが最新バージョンではないことが ARWorldTrackingConfigurationFactory.CheckCapabilityAndSupport で示される場合は、 ARCoreInstaller.RequestInstallARCore を呼び出して、インストールや更新を行うようにユーザーに促すことができます。

ユーザーには、現在のステータスと、ARCoreをアップデートする必要があることを示すポップアップ画面が表示されます。その後、Playストアに移動してアップデートを開始し、完了すると、アプリに戻ります。

iOSでは、このメソッドを呼び出しても何も行われませんが、 ARCoreInstaller.InstallResult.Installed が返ります。ベストプラクティスとして、iOSでは呼び出さないことをお勧めしますが、呼び出した場合でも大きな問題が起こることはありません。

注釈

Android 11のAPI 30以上を対象にしている場合、インストールされているARCoreのバージョンに応じてクエリを実行できるように、Unityのビルド設定が必要にある場合があります。詳細については、 Android向けにビルドする の「Android 11(APIレベル30)以降のデバイスでビルドする」を参照してください。

引数

第1引数 shouldPromptUserToUpdate では、ユーザーをPlayストアに誘導するために呼び出すか、以前のリクエストの結果を確認するために呼び出すかを指定します。

第2引数 installBehavior は、Playストアにアクセスする前にユーザーがプロンプトをキャンセルしてアプリに戻ることを許可するかどうかを指定します。 Optional の場合、キャンセルは許可され、 Required の場合は許可されません。なお、 Required を渡した場合でも、ユーザーはインストールを拒否して戻ることができます。

第3引数の messageType では、現在の状況をユーザーに説明するために表示されるテキストを指定します。 Application または Feature の場合、アプリケーションや機能でそれぞれARCoreが必要になることが分かります。 UserAlreadyInformed の場合は、説明がユーザーに表示されることはありません。

ウォークスルー

プロセスに関する詳細なウォークスルーは次のとおりです。

  1. ARWorldTrackingConfigurationFactory.CheckCapabilityAndSupport を使用して、ユーザーのデバイスにおけるARの互換性とサポート状況を確認します。

    using Niantic.ARDK.AR.Configuration;
    
    public class ValidateDeviceRequirements: MonoBehaviour
    {
      public void CheckARSupport()
      {
        ARWorldTrackingConfigurationFactory.CheckCapabilityAndSupport
        (
          HandleCapabilityAndSupport
        );
      }
    
      private void HandleCapabilityAndSupport(ARHardwareCapability hardwareCapability, ARSoftwareSupport softwareSupport)
      {
        // ...
      }
  2. 結果の ARWorldTrackingConfigurationFactory.CheckCapabilityAndSupport で、ハードウェアはサポートされているが、ソフトウェアのアップデートが必要であることが示される場合は、次の手順で説明する InstallARCore() を呼び出します。

    private void HandleCapabilityAndSupport(ARHardwareCapability hardwareCapability, ARSoftwareSupport softwareSupport)
    {
      if (hardwareCapability == ARHardwareCapability.Capable && softwareSupport == ARSoftwareSupport.SupportedNeedsUpdate)
      {
        InstallARCore();
      }
      else
      {
        // Handle other cases...
      }
    }
    
    private void InstallARCore()
    {
      // ...
    }
  3. InstallARCore() で、 ARCoreInstaller.RequestInstallARCore(true, ...) を使用して、ARCoreをインストールするようユーザーをPlayストアに誘導します。

    private bool _havePromptedTheUserToInstallARCore = false;
    
    private void InstallARCore()
    {
      var installationResult = ARCoreInstaller.RequestInstallARCore
      (
        true,
        ARCoreInstaller.InstallBehavior.Optional,
        ARCoreInstaller.InstallMessageType.Application
      );
    
      if (installationResult == ARCoreInstaller.InstallResult.PromptingUserToUpdate)
      {
        _havePromptedTheUserToInstallARCore = true;
      }
      else
      {
        // Handle the failure...
      }
    }
  4. Unityではゲームのアクティビティが一時停止するため、 pauseStatus = true のMonoBehavioursで OnApplicationPause が呼び出されます。

  5. ユーザーは、ARCoreをインストールするか、キャンセルするか、またはPlayストアから離れてアプリに戻ることができます。

  6. その後、ゲームのアクティビティが再開されるため、 pauseStatus = false のMonoBehavioursで OnApplicationPause が呼び出されます。

  7. ARCoreInstaller.RequestInstallARCore(false, ...) で、ARCoreがインストールされたかどうかが表示されました。

    public void OnApplicationPause(bool pauseStatus)
    {
      if (!pauseStatus && _havePromptedTheUserToInstallARCore)
      {
        var installationResult = ARCoreInstaller.RequestInstallARCore
        (
          true,
          ARCoreInstaller.InstallBehavior.Optional,
          ARCoreInstaller.InstallMessageType.Application
        );
        _havePromptedTheUserToInstallARCore = false;
    
        if (installationResult == ARCoreInstaller.InstallResult.Installed)
        {
          // Handle successfully installing ARCore...
        }
        else
        {
          // Handle the failure...
        }
      }
    }

サンプルコード

インタラクトする様子を示すために、上記のスニペットコードを1つのヘルパークラスにまとめる例を紹介します。

using Niantic.ARDK.AR.Configuration;

public class ValidateDeviceRequirements: MonoBehaviour
{
  private void NotSupported()
  {
    // Handle a lack of AR support.
  }

  private void Supported()
  {
    // Handle AR support.
  }

  // A public method that will eventually call either Supported or NotSupported.
  public void CheckARSupport()
  {
    ARWorldTrackingConfigurationFactory.CheckCapabilityAndSupport
    (
      HandleCapabilityAndSupport
    );
  }

  private void HandleCapabilityAndSupport(ARHardwareCapability hardwareCapability, ARSoftwareSupport softwareSupport)
  {
    // Based on the hardwareCapability and softwareSupport values, AR is supported, not supported, or support is dependent on the result of installing ARCore
    if (hardwareCapability != ARHardwareCapability.Capable)
    {
      NotSupported();
    }
    else if (softwareSupport == ARSoftwareSupport.NotSupported)
    {
      NotSupported();
    }
    else if (softwareSupport == ARSoftwareSupport.SupportedNeedsUpdate)
    {
      #if UNITY_IOS
        NotSupported();
      #elif UNITY_ANDROID
        InstallARCore();
      #endif
    }
    else
    {
      Supported();
    }
  }

  private bool _havePromptedTheUserToInstallARCore = false;

  // Send the user to install ARCore. This can either fail immediately, or send them to the Play store.
  private void InstallARCore()
  {
    var installationResult = ARCoreInstaller.RequestInstallARCore
    (
      true,
      ARCoreInstaller.InstallBehavior.Optional,
      ARCoreInstaller.InstallMessageType.Application
    );

    if (installationResult == ARCoreInstaller.InstallResult.PromptingUserToUpdate)
    {
      _havePromptedTheUserToInstallARCore = true;
    }
    else
    {
      NotSupported();
    }
  }

  public void OnApplicationPause(bool pauseStatus)
  {
    if (!pauseStatus && _havePromptedTheUserToInstallARCore)
    {
      // The user is returning to the Unity Activity for the first time since they were sent to the Play store, so check the result of the installation request.
      var installationResult = ARCoreInstaller.RequestInstallARCore
      (
        true,
        ARCoreInstaller.InstallBehavior.Optional,
        ARCoreInstaller.InstallMessageType.Application
      );
      _havePromptedTheUserToInstallARCore = false;

      if (installationResult == ARCoreInstaller.InstallResult.Installed)
      {
        Supported();
      }
      else
      {
        NotSupported();
      }
    }
  }