Android XR 向けに Unity で開発する

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
XR ヘッドセット
有線 XR グラス

このガイドでは、Android XR 用 Unity での開発の概要について説明します。Android XR は、Unity で使い慣れたツールや機能と連携します。Unity の Android XR サポートは OpenXR をベースに構築されているため、OpenXR の概要で説明されている機能の多くは Unity でもサポートされています。

このガイドでは、次の内容について説明します。

  • Android XR の Unity サポート
    • Unity XR の基本
    • Android XR 向けアプリの開発と公開
    • Android XR 向け Unity パッケージ
      • Unity OpenXR: Android XR パッケージ
      • Unity 向け Android XR 拡張機能
      • 機能と互換性に関する考慮事項
  • 入力と操作

Android XR の Unity サポート

Android XR 向けに Unity アプリをビルドする際は、最新バージョンの Unity 6 の複合現実ツールと機能を利用できます。これには、XR Interaction Toolkit、AR Foundation、OpenXR Plugin を使用する複合現実テンプレートが含まれており、すぐに開発を始めることができます。Unity for Android XR でアプリを構築する場合は、レンダー パイプラインとして Universal Render Pipeline(URP)を、グラフィック API として Vulkan を使用することをおすすめします。これらの機能により、Vulkan でのみサポートされている Unity のグラフィック機能の一部を利用できます。これらの設定を構成する方法については、プロジェクト設定ガイドをご覧ください。

Unity XR の基本

Unity または XR 開発を初めて使用する場合は、Unity の XR マニュアルを参照して、基本的な XR のコンセプトとワークフローを理解してください。XR マニュアルには、次の情報が記載されています。

Android 向けアプリを開発、公開する

Unity には、Android 向けの開発、ビルド、公開に関する詳細なドキュメントが用意されています。Unity での Android 権限、Android ビルド設定、Android 向けアプリのビルド、Google Play への配信などのトピックが扱われています。

Android XR 用 Unity パッケージ

Android XR 用の Unity アプリのビルドをサポートするパッケージは 2 つあります。どちらのパッケージも XR プロバイダ プラグインであり、Unity の XR プラグイン管理パッケージを介して有効にできます。XR プラグイン マネージャーは、XR プラグインの読み込み、初期化、設定、ビルドのサポートを管理、提供するためのプロジェクト設定を追加します。アプリが実行時に OpenXR 機能を実行できるようにするには、プラグイン マネージャーでこれらの機能を有効にする必要があります。

この画像は、Unity のエディタでこれらの機能グループを有効にできる場所の例を示しています。

図 1. Unity XR プラグイン管理画面の例。

Unity OpenXR Android XR

Unity OpenXR Android XR パッケージは、Unity に Android XR のサポートを追加する XR プラグインです。この XR プラグインは、Unity 向けの Android XR サポートの大部分を提供し、AR Foundation プロジェクトで Android XR デバイスをサポートできるようにします。AR Foundation は、AR または複合現実のエクスペリエンスを作成するデベロッパー向けに設計されています。AR 機能のインターフェースを提供しますが、機能自体は実装しません。Unity OpenXR Android XR パッケージが実装を提供します。このパッケージの使用を開始するには、パッケージ マニュアルをご覧ください。このマニュアルには、スタートガイドが含まれています。

Unity 向け Android XR 拡張機能

Android XR Extensions for Unity は、Unity OpenXR Android XR パッケージを補完するもので、没入型エクスペリエンスの構築に役立つ追加機能が含まれています。単独で使用することも、Unity OpenXR Android XR パッケージと組み合わせて使用することもできます。

このパッケージの使用を開始するには、プロジェクト設定ガイドまたは Unity 用 Android XR 拡張機能をインポートするためのクイックスタートをご覧ください。

機能と互換性に関する考慮事項

次の表に、Unity OpenXR: Android XR パッケージと Android XR Extensions for Unity パッケージでサポートされている機能を示します。この表を使用して、必要な機能が含まれているパッケージと、互換性に関する考慮事項を確認できます。

機能

Unity OpenXR: Android XR 機能文字列

Unity 向け Android XR 拡張機能の機能文字列

ユースケースと想定される動作

AR セッション

Android XR: AR セッション

  • 機能設定には、バッファ破棄の最適化(Vulkan)が含まれます。

Android XR(拡張機能): セッション管理

  • 機能設定には、サブサンプリング(Vulkan)と URP SpaceWarp(Vulkan)が含まれます。

どちらのパッケージの機能を使用する場合も、そのパッケージの AR Session 機能を有効にする必要があります。両方の機能セットを同時に有効にできます。個々の機能は、競合を適切に処理します。

デバイスの追跡

なし

なし

デバイス トラッキングは、物理空間におけるデバイスの位置と回転を追跡するために使用されます。XR Origin GameObject は、XROrigin コンポーネントと、カメラと TrackedPoseDriver を含む GameObject 階層を使用して、デバイスのトラッキングと、トラッキング可能なオブジェクトの Unity 座標系への変換を自動的に処理します。

カメラ

Android XR: AR カメラ

なし

この機能は、光推定とフルスクリーン パススルーをサポートします。

平面検出

Android XR: AR プレーン

なし

この機能は、物理環境内の平面を検出して追跡するためのサポートを提供します。

オブジェクト トラッキング

なし

Android XR(拡張機能): オブジェクト トラッキング

この機能は、物理環境内のオブジェクトの検出と追跡をサポートします。参照オブジェクト ライブラリと組み合わせて使用されます。

顔追跡

Android XR: AR Face

  • XR_ANDROID_eye_tracking のみ
  • 顔追跡なし

Android XR: 顔追跡

  • XR_ANDROID_face_tracking

アバターの目のサポートは、Android XR: AR Face 機能を通じて提供されます。Android XR の顔追跡機能を使用して、ユーザーの顔の表情にアクセスします。これら 2 つの機能は組み合わせて使用できます。

レイキャスト

Android XR: AR Raycast

  • 平面アンカー
  • 深度アンカー

なし

この機能を使用すると、レイをキャストして、そのレイと、物理環境で検出された平面トラッキング可能オブジェクトまたは深度トラッキング可能オブジェクトとの交点を計算できます。

アンカー

Android XR: AR アンカー

なし

AR Anchor は、AR Foundation を通じて空間アンカー、平面アンカー、永続アンカーをサポートしています。

オクルージョン

Android XR: AR オクルージョン

  • 環境の奥行き

なし

オクルージョンを使用すると、アプリ内の複合現実コンテンツを、物理環境内のオブジェクトの背後に隠したり、部分的に隠したりできます。

パフォーマンス指標

Android XR のパフォーマンス指標

なし

この機能を使用すると、Android XR デバイスのパフォーマンス指標にアクセスできます。

コンポジション レイヤ

コンポジション レイヤのサポート(OpenXR プラグインと XR コンポジション レイヤが必要)

Android XR: パススルー コンポジション レイヤ

  • XR_ANDROID_composition_layer_passthrough_mesh

Unity のコンポジション レイヤ サポートを使用して、基本的なコンポジション レイヤ(クアッド、シリンダー、プロジェクションなど)を作成します。Android XR: パススルー コンポジション レイヤを使用すると、Unity の GameObject から読み取り、カスタム メッシュを含むパススルー レイヤを作成できます。

中心窩レンダリング

フォービエイテッド レンダリング(OpenXR プラグインが必要)

  • アイトラッキングによるフォービエイテッド レンダリングをサポート: 高解像度領域はユーザーが見ている中心に配置されるため、ユーザーにはわかりにくい

中心窩レンダリング(従来版)

中心窩レンダリングでは、ユーザーの周辺視野の領域の解像度を下げることで、レンダリングを高速化できます。Unity のフォービエイテッド レンダリング機能は、URP と Vulkan を使用するアプリでのみサポートされています。Unity 向け Android XR 拡張機能のフォービエーション(レガシー)機能は、組み込みレンダリング パイプラインと OpenGL ES もサポートしています。可能な場合は、Unity のフォービエイテッド レンダリング機能を使用することをおすすめします。また、Android XR 向けにビルドする場合は、URP と Vulkan の両方を使用することをおすすめします。

境界のない参照空間

なし

Android XR: 無制限の参照空間

この機能により、XRInputSubsystem のトラッキング起点モードが Unbounded に設定されます。Unbounded は、XRInputSubsystem がワールド アンカーに関連するすべての InputDevice を追跡することを示します。ワールド アンカーは変更される可能性があります。

環境ブレンドモード

なし

環境ブレンドモード

この機能を使用すると、XR 環境ブレンドモードを設定できます。このモードは、パススルーが有効になっているときに、仮想画像が現実世界の環境とどのようにブレンドされるかを制御します。

Geospatial(VPS)

なし

Android XR: Geospatial

XRGeospatialManager が Visual Positioning System(VPS)機能にアクセスし、位置情報の可用性を確認し、地理空間ポーズを計算し、サーフェス アンカーと地理空間アンカーの平面トラッキングを構成できるようにします。

Google Cloud Auth

なし

Android XR: Google Cloud

クラウド バッキング サービスにセッション認証構成戦略(API キー、キーレス、認証トークン)を提供します。

マルチモーダル フェイス

なし

Android XR(拡張機能): マルチモーダル フェイス

構成可能なマルチモーダル顔追跡モダリティ(XRFaceTrackerMode)を使用して Unity ARFace を拡張します。

バッテリー状態の表示

なし

バッテリー状態の表示

XRBatteryStateDisplayFeature を使用して、接続されているコントローラと入力パスのランタイム バッテリー ステータスと充電レベルをクエリできます。

グローバル パススルー ディミング

Android XR: AR カメラ

なし

Unity の ARCameraFeature を使用して、現実世界のパススルー減光レベルをクエリして設定できます。

システム プロパティの列挙

なし

Android XR: システム プロパティ

XR_ANDROID_enumerate_system_extension_properties を使用して、ランタイム拡張プロパティとデバイス機能を列挙します。

おすすめ設定

なし

Android XR: 推奨設定

XRRecommendedSettingsFeature.TryGetRecommendedSettings を使用して、ランタイム環境の事前起動状態(環境ブレンドモード、パススルーの不透明度、アクティブな入力モダリティなど)をクエリできるようにします。

境界ボックス検出

Android XR: AR 境界ボックス

空間エンティティ(拡張機能): 境界ボックス

OpenXR Spatial Entities フレームワーク(SpatialBoundingBoxSubsystem)を使用して、物理環境内の 3D オブジェクトの境界ボックス検出をサポートします。

共有可能なアンカー

なし

空間エンティティ(拡張機能): 共有可能なアンカー

ARShareableAnchorManager と XRShareableAnchorSubsystem を使用してアンカー機能を拡張します。これには、Android XR: Geospatial と組み合わせて使用する場合の地理空間アンカー(TryAttachGeospatialAnchor)とサーフェス アンカー(TryAttachSurfaceAnchorAsync)の追加が含まれます。

空間コンテナ

なし

空間コンテナ

フルスペース モードでシステム管理の 3D ボリューム コンテナ内にアプリのコンテンツをレンダリングできるようにします。XRSpatialContainerFeature の API とコールバック イベントを使用して、コンテナの状態、境界、可視性をクエリしてリクエストできます。

入力と操作

Android XR は、マルチモーダルな自然入力をサポートしています。

手とアイ トラッキングに加えて、6DoF コントローラ、マウス、物理キーボードなどの周辺機器もサポートされています。つまり、Android XR 向けアプリは手の操作をサポートすることが想定されており、すべてのデバイスにコントローラが付属しているとは限りません。

インタラクション プロフィール

Unity は、インタラクション プロファイルを使用して、XR アプリケーションがさまざまな XR デバイスやプラットフォームと通信する方法を管理します。これらのプロファイルは、さまざまなハードウェア構成で想定される入出力を確立し、さまざまなプラットフォームで互換性と一貫した機能を促進します。インタラクション プロファイルを有効にすると、XR アプリケーションがさまざまなデバイスで正しく機能し、一貫した入力マッピングを維持し、特定の XR 機能にアクセスできるようになります。インタラクション プロファイルを設定するには:

  1. [プロジェクト設定] ウィンドウを開きます(メニュー: [Edit] > [Project Settings])。
  2. [XR Plug-in Management] をクリックして、プラグイン セクションを開きます(必要な場合)。
  3. XR プラグインのリストで [OpenXR] を選択します。
  4. [Interaction Profiles] セクションで、[+] ボタンを選択してプロファイルを追加します。
  5. リストから追加するプロファイルを選択します。

手の操作

ハンド インタラクション(XR_EXT_hand_interaction)は OpenXR プラグインによって提供されます。ハンド インタラクション プロファイルを有効にすると、Unity 入力システムで <HandInteraction> デバイス レイアウトを公開できます。このインタラクション プロファイルは、OpenXR で定義されている 4 つのアクション ポーズ(「ピンチ」、「ポーク」、「エイム」、「グリップ」)でサポートされているハンド入力に使用します。追加の手の操作やハンド トラッキング機能が必要な場合は、このページの XR Hands をご覧ください。

視線操作

視線操作(XR_EXT_eye_gaze_interaction)は OpenXR プラグインによって提供されます。このレイアウトを使用すると、拡張機能から返される目のポーズデータ(位置と回転)を取得できます。OpenXR 入力ガイドで視線操作の詳細を確認する。

コントローラの操作

Android XR は、6DoF コントローラ用の Oculus Touch コントローラ プロファイルをサポートしています。これらのプロファイルはどちらも OpenXR プラグインによって提供されます。

マウス操作

Android XR マウス操作プロファイル(XR_ANDROID_mouse_interaction)は、Unity 向け Android XR 拡張機能によって提供されます。Unity Input System で <AndroidXRMouse> デバイス レイアウトを公開します。

手のひらのポーズによる操作

OpenXR プラグインは、Palm Pose Interaction(XR_EXT_palm_pose)をサポートしています。これにより、Unity Input System 内で <PalmPose> レイアウトが公開されます。手のひらのポーズは、より複雑なユースケースでハンド トラッキングを行う拡張機能やパッケージの代替となるものではありません。代わりに、アバターのビジュアルなど、アプリ固有のビジュアル コンテンツを配置するために使用できます。手のひらのポーズは、手のひらの位置と向きの両方で構成されます。

XR Hands

XR Hands パッケージを使用すると、XR_EXT_hand_tracking と XR_FB_hand_tracking_aim を使用してハンド トラッキング データにアクセスできます。また、ハンド トラッキングから入力ポーズにハンドジョイント データを変換するラッパーも提供されます。XR Hands パッケージが提供する機能を使用するには、ハンド トラッキング Subsystem 機能と Meta ハンド トラッキング Aim OpenXR 機能を有効にします。

ハンド トラッキングを有効にする方法を示す例 XR Hands パッケージは、より詳細な手のポーズや手の関節のデータが必要な場合や、カスタム ジェスチャーを操作する必要がある場合に役立ちます。

詳細については、Unity のプロジェクトで XR Hands を設定するためのドキュメントをご覧ください。

顔追跡の信頼度領域

XR_ANDROID_face_tracking 拡張機能は、顔の 3 つの領域(左上、右上、下部)の信頼値を提供します。これらの値は 0(信頼度なし)~ 1(信頼度が最も高い)の範囲で、各領域の顔追跡の精度を示します。

これらの信頼値を使用して、ブレンドシェイプを段階的に無効にしたり、対応する顔領域に視覚フィルタ(ぼかしなど)を適用したりできます。基本的なブレンドシェイプの場合は、対応する顔領域のブレンドシェイプを無効にします。

「顔の下部」領域は、口、あご、頬、鼻など、目の下にあるすべての部分を表します。上部の 2 つの領域には、顔の左右の目と眉の領域が含まれます。

次の C# コード スニペットは、Unity スクリプトで信頼度データにアクセスして使用する方法を示しています。

using UnityEngine;
using Google.XR.Extensions;

public class FaceTrackingConfidence : MonoBehaviour
{
    void Update()
    {
      if (!XRFaceTrackingFeature.IsFaceTrackingExtensionEnabled.HasValue)
      {
        DebugTextTopCenter.text = "XrInstance hasn't been initialized.";
        return;
      }
      else if (!XRFaceTrackingFeature.IsFaceTrackingExtensionEnabled.Value)
      {
        DebugTextTopCenter.text = "XR_ANDROID_face_tracking is not enabled.";
        return;
      }

      for (int x = 0; x < _faceManager.Face.ConfidenceRegions.Length; x++)
      {
        switch (x)
        {
          case (int)XRFaceConfidenceRegion.Lower:
            regionText = "Bottom";
            break;
          case (int)XRFaceConfidenceRegion.LeftUpper:
            regionText = DebugTextConfidenceLeft;
            break;
          case (int)XRFaceConfidenceRegion.RightUpper:
            regionText = DebugTextConfidenceRight;
            break;
        }
    }
}

詳細については、Unity 向け Android XR 拡張機能のドキュメントをご覧ください。

手のレンダリング方法を選択する

Android XR は、手のレンダリングに 2 つの方法(ハンドメッシュとプレハブ ビジュアライザー)をサポートしています。

手のメッシュ

Android XR Unity パッケージには、XR_ANDROID_hand_mesh extension へのアクセスを提供するハンドメッシュ機能が含まれています。ハンドメッシュ機能は、ユーザーの手のメッシュを提供します。ハンドメッシュには、手の形状を表す三角形の頂点が含まれています。この機能は、ユーザーの手の実際の形状を表すパーソナライズされたメッシュを可視化するために使用することを目的としています。

XR Hands プレハブ

XR Hands パッケージには、Hands visualizer というサンプルが含まれています。このサンプルには、ユーザーの手をコンテキストに適した表現でレンダリングするための、完全にリギングされた左手と右手が用意されています。

システム ジェスチャー

Android XR には、ユーザーが戻る、ランチャーを開く、実行中のアプリの概要を取得するためのメニューを開くシステム ジェスチャーが含まれています。ユーザーは、利き手でピンチ操作を行うことで、このシステム メニューを有効にできます。

ユーザーがシステム ナビゲーション メニューを操作している場合、アプリはヘッド トラッキング イベントにのみ応答します。XR Hands パッケージは、ユーザーがこのシステム ナビゲーション メニューを操作するなどの特定のアクションを行ったことを検出できます。AimFlags、SystemGesture、DominantHand を確認すると、このシステム アクションがいつ実行されるかがわかります。AimFlags の詳細については、Unity の Enum MetaAimFlags のドキュメントをご覧ください。

XR Interaction Toolkit

XR Interaction Toolkit パッケージは、VR および AR エクスペリエンスを作成するための、コンポーネント ベースの高度なインタラクション システムです。Unity 入力イベントから 3D と UI のインタラクションを利用できるようにするフレームワークを提供します。触覚フィードバック、視覚フィードバック、移動などのインタラクション タスクをサポートしています。


OpenXR™ および OpenXR ロゴは、The Khronos Group Inc. が所有する商標であり、中国、欧州連合、日本、英国で商標として登録されています。