全般的な設定
このセクションでは、ヘッドマウントデバイス用の XR Origin カメラリグを作成する手順と、XR インタラクションの基本的な構成要素を作成する手順を説明します。
アクションベースの動作を使用するための設定を通じて、推奨される手順を説明します。
アクションベースの動作とデバイスベースの動作の違い
Snap Turn Provider などの動作には、Action-based (アクションベース) の動作と Device-based (デバイスベース) の動作の 2 種類があります。アクションベースの動作は アクション を使用して、1 つ以上のコントロールからの入力を間接的に読み取ります。デバイスベースの動作は、InputDevice.TryGetFeatureValue
を使用して、動作自体に設定された特定のコントロールである InputDevice
から直接入力を読み取ります。
Input System パッケージのメリットを活用するために、デバイスベースの動作ではなく、アクションベースの動作を使用することをお勧めします。例えば、論理的な入力と物理的な入力が区別されるというメリットがあるほか、ユーザーがカスタマイズしたアクションマップを作成してそれらを切り替えたり、複数のクロスプラットフォームコントローラーの入力を単一の意味のアクションにバインドしたり、入力アクションのイベントコールバックを使用したりすることができます。XR Device Simulator など、XR Interaction Toolkit パッケージの一部の機能は、入力アクションを使用する場合にのみサポートされます。
Starter Assets をインポートする
アセットをインポートして動作の設定を効率化する手順については、Starter Assets サンプルを参照してください。このサンプルには、このガイドで使用される入力アクションとプリセットのデフォルトセットが含まれています。
XR Interaction Manager を作成する
GameObject > XR > Interaction Manager を使用して、XR Interaction Manager (インタラクションマネージャー) を作成します。対象のゲームオブジェクトでこのコンポーネントを使用すると、シーン内で Interactor (能動側、インタラクター) と Interactable (受動側、インタラクタブル) を相互作用させることが可能になります。
追跡対象デバイスに対する XR Origin カメラリグを作成する
GameObject > XR > XR Origin (Action-based) を使用して XR Origin カメラリグを作成します。
このゲームオブジェクトの XR Origin コンポーネントは、ヘッドマウントディスプレイやコントローラーなど追跡可能なデバイス位置を Unity シーンの最終位置に変換します。これは、ゲームオブジェクトが動きを直接 Main Camera に適用するのではなく、環境を動きまわってロコモーションを実現するゲームオブジェクトです。
また、子の Camera Offset ゲームオブジェクトも作成し、XR Origin の Camera Floor Offset Object の値を割り当てます。このゲームオブジェクトの位置は、XR Origin の Tracking Origin Mode の値に応じて、Unity によって自動で更新されます。
このガイドでは、Tracking Origin Mode の設定を Not Specified のままにしておきます。
[!ノート] ** Device** モードでは通常、XR ランタイムが空間内の固定位置 (開始時のヘッドマウントディスプレイ (HMD) の初期位置など) を基準として、追跡対象デバイスの位置を知らせます。このモードの場合は、XR Origin の Camera Y Offset を、Main Camera の地面からの高さに設定します。Floor モードでは通常、XR ランタイムはプレイヤーが立つ実際の床を基準として、追跡対象デバイスの位置を知らせます。このモードでは、必ずしも追跡の原点を人為的に上昇させる必要はないので、Camera Offset の高さは自動的に消去されます。デフォルトモードの XR ランタイムを使用するには、Not Specified モードに設定します。
すでにシーンに Main Camera がある場合は、メニューを使用して XR Origin を作成すると、自動的に子ゲームオブジェクトとして Camera Offset の下に移動します。Main Camera がない場合は、新しい Main Camera が作成されます。この Main Camera を伴うゲームオブジェクトは、XR Origin の Camera GameObject の値として割り当てられます。
XR HMD の位置と回転が Main Camera の Transform を更新するように、Tracked Pose Driver (Input System) コンポーネントが追加されます。このコンポーネントは、Position Input を <XRHMD>/centerEyePosition
に、Rotation Input を <XRHMD>/centerEyeRotation
に紐づけるために設定されます。
XR Controller とインタラクターを設定する
インタラクターのコンポーネントは、ゲームオブジェクトとシーン内のインタラクタブルのコンポーネントとの相互作用を制御します。インタラクターにはいくつかの種類があります。そのうちの 1 つは XR Ray Interactor で、このコンポーネントはシーン内で操作できる有効なインタラクタブルオブジェクトを見つけるために レイキャスト を使用します。
XR 入力デバイスからの入力を読み取るために、このインタラクターは XR Controller コンポーネントを必要とします。
折りたたみ項目の矢印を選択して、XR Origin の階層を展開し、LeftHand Controller ゲームオブジェクトを選択します。このゲームオブジェクトには XR Controller (Action-based) コンポーネントがあります。各アクションの Reference 設定が表示されない場合は、Inspector ウィンドウでコンポーネントの右上にあるプリセットセレクター (スライダーアイコン) をクリックし、XRI Default Left Controller を選択します。プリセットが 1 つも表示されない場合は、Starter Assets をインポート してください。RightHand Controller ゲームオブジェクトについても同様に、XRI Default Right Controller プリセットを選択します。
下の表に、XR 入力デバイスとのバインディングが必要な XR Controller でのアクションを記載しています。
アクション | 必要とされる用途 |
---|---|
Position、Rotation、Select | 基本的なインタラクション |
Tracking State | 位置や回転の入力が有効かどうかを確認する |
Activate | 選択したオブジェクトをアクティブにする |
UI Press | UI キャンバス要素と相互作用する |
Haptic Device | 触覚インパルスを送信するデバイスを特定する |
Rotate Anchor、Translate Anchor | 離れた位置にある選択中のオブジェクトを操作する |
XR Controller (Action-based) コンポーネントの入力アクション参照プロパティには、設定が任意で、割り当てる必要のないものがあります。詳細については、ドキュメントのプロパティ表を参照するか、Inspector ウィンドウのツールチップを参照してください。
このコントローラーとインタラクターは触覚フィードバックを一部しかサポートしていません。XR Controller (Action-based) の触覚フィードバックを有効にするには、<XRController>{LeftHand}/*
のように、アクティブなコントロールにバインディングパスを持つ Haptic Device Action を指定します。XR Controller (Device-based) の触覚フィードバックを有効にするには、Left Hand などの触覚フィードバックをサポートする Controller Node を指定します。このようにすると、インタラクターは、Inspector ウィンドウの Haptic Events の下で、選択やホバーのイベント時に再生する触覚フィードバックの強度と期間を指定することができます。
Enable Interaction with UI GameObjects オプションは、対象の XR Ray Interactor がシーン内のワールド空間キャンバスで Unity UI 要素に相互作用できるかどうかを制御します。UI インタラクションの詳細とそれを有効にする手順については、UI の設定 を参照してください。
アクションベースの動作に関するアクションを有効にする
入力に応じたアクションが実行されるようにするには、前もってアクションを有効にする必要があります。このプロセスの詳細については、Input System のドキュメントで アクションの使用 を参照してください。このパッケージに含まれるアクションベースの動作は、InputActionProperty
タイプのプロパティを持ち、アクションを直接格納するか、入力アクションアセットに含まれるアクションを参照して間接的に格納することができます。アクションベースの動作では、自体の OnEnable
または OnDisable
イベント時に、直接定義される (参照ではない) アクションが自動で有効化または無効化されます。アクションベースの動作では、間接的に定義される (参照される) アクションは自動で有効化または無効化されず、有効な状態を外部的に管理することができます。
Input Action Manager コンポーネントを使用すると、Input Action アセットで定義されたアクションを自身の OnEnable
または OnDisable
イベント時に自動で有効化または無効化することができます。
GameObject > Create Empty で、ゲームオブジェクトの Input Action Manager の名前を変更します。Component > Input > Input Action Manager で、作成したゲームオブジェクトにコンポーネントを追加します。Inspector ウィンドウで、Add (+) を選択するか、Size を 1 に設定し、Action Assets リストに要素を追加します。要素のオブジェクトピッカー (円形のアイコン) を選択し、XRI Default Input Actions を選択します。
後で追加の入力アクションアセットを作成する場合は、そのアクションもすべて有効化するために Action Assets リストに追加します。
[!ノート] Unity エディターの使用中に入力デバイスから入力アクションを正確に読み取るために、場合によっては、現在のプロジェクト設定に応じてゲームビューにフォーカスを置く必要があります。コントローラーのボタンを押すなどの入力がうまく機能しない場合は、マウスでクリックして、ゲームビューにフォーカスを戻してください。ゲームビューへのフォーカスを不要にする設定方法については、背景とフォーカスの変更に関する動作 を参照してください。
プレイヤーがつかむことができるインタラクタブルを作成する
インタラクタブルのコンポーネントは、ユーザーがシーン内でオブジェクトをどのように操作できるかを定義します。つかむことができる基本的な 3D キューブを作成する場合は、GameObject > XR > Grab Interactable の順に選択します。
この例では、キューブが落ちて手の届かないところに行かないように、キューブを置く平面を作成します。GameObject > 3D Object > Plane の順に選択し、キューブをクリックします。次に Transform ギズモをクリックしてドラッグし、Plane ゲームオブジェクトの上まで移動します。
下のスクリーンショットは、XR Grab Interactable を持つゲームオブジェクトです。スムーズなトラッキングで掴む、動かす、落とす、投げる動作をサポートします。
[!ヒント] GameObject > XR メニューから追加されたインタラクタブルは、ボックスコライダーを使用してインタラクションを検出しますが、凸状メッシュコライダーなどの異なる種類の Collider コンポーネントでは、よりコストパフォーマンスに優れたヒット検出が可能です。
既存のゲームオブジェクトを設定して、ユーザーが掴むことのできるインタラクタブルなオブジェクトにするには、シーンでそのオブジェクトを選択し、以下のコンポーネントを追加します。
- Component > XR > XR Grab Interactable を追加
- Component > Physics > Box Collider を追加
XR プロバイダーを有効にする
Edit > Project Settings > XR Plug-in Management を開きます。まだパッケージをインストールしていない場合は、そのウィンドウで Install XR Plugin Management をクリックします。デバイスに適用する、Oculus や Open XR などのプラグインプロバイダーを 1 つ以上選択します。Open XR はさらに設定を行う必要があります。その手順については、パッケージのドキュメントを参照してください。