Meta Quest Building Blocks: コントローラーを活用したインタラクションの構築
概要
UnityでMeta Quest向けアプリを開発する際、Oculus Integration v57以降で提供されているBuilding Blocksを利用することで、 パススルー、シーンモデル、インタラクション、空間アンカーなどある程度シーンを自動生成することができるようになりました。
この記事では、インタラクションの構築に焦点を当て、なぜか自動生成されないコントローラーのインタラクションをどのように構築するかを説明します。
環境構築
まずは、Building Blocksを利用するまでの環境構築について説明します。
今回は、以下の環境で構築します。
- Unity 2022.3.21f1
- Meta XR Core SDK V63
- Meta XR Interaction SDK V63
- Meta XR Interaction SDK OVR Integration V63
1. Unityプロジェクトを作成し、AndroidにSwitch Platform
2. XR Plugin Managementをインストール
3. Meta XR Core SDKをインストール
Meta XR All-in-One SDKというものもあるので、それを入れることでSDK類全てをインストールすることが可能ですが、今回は必要なものだけをインストールします。
4. Meta XR Interaction SDK OVR Integrationをインストール
Meta XR Interaction SDK OVR Integrationをインストールすることで、依存関係にあるMeta XR Interaction SDKもインストールされます。
5. Meta Quest向けプロジェクト設定
メニュー Oculus > Tools > Project Setup Tool を選択し、Fix Allで「Outstanding Issues」を全て解決します。
これで、Building Blocksを利用する準備が整いました。
Building Blocksでインタラクションのシーン構築
用意されているインタラクションは、以下のようなものがあります。
- Distance Grab : 手の届かないオブジェクトを掴む
- Grab Interaction : オブジェクトを掴む
- Poke Interaction : オブジェクトを突く
- Ray Interaction : レーザーポインターを使ってオブジェクトを選択
- Touch Hand Grab : コライダーの設定を利用して、オブジェクトを掴み、動的にオブジェクトの表面に指を這わせる
今回は、「Grab Interaction」「Poke Interaction」「Ray Interaction」の3つを利用してシーンを構築します。
メニュー Oculus > Tools > Building Blocks を選択することで、Building Blocksのウィンドウが表示されます。
1. CameraRigを配置
メニュー | Hierachy |
---|---|
2. Grab Interactionを配置
これを配置することで、ハンドトラッキングの設定が自動的に行われ 掴むためのサンプルCubeオブジェクトも生成されます。
しかしながら、コントローラーのインタラクションは自動生成されないため、自分で設定する必要があります。
コントローラーのインタラクション設定は、次のセクションで説明します。
メニュー | Hierachy |
---|---|
3. Poke Interactionを配置
これを配置すると、突くためのサンプルQuadオブジェクトも生成されます。
メニュー | Hierachy |
---|---|
4. Ray Interactionを配置
これを配置すると、レーザーポインターを使ってオブジェクトを選択するためのサンプルCubeオブジェクトも生成されます。
メニュー | Hierachy |
---|---|
5. ハンドトラッキングのインタラクション動作確認
以上の設定で、ハンドトラッキングについては、3つのインタラクションが設定されているため、動作確認が可能です。
コントローラーのインタラクション設定
Building Blocksのメニューで、「Controller Tracking」という項目があるのですが、これを追加してもインタラクション自体は自動生成されません。
あくまで、コントローラーを表示して、トラッキングするための設定のようです。
インタラクションを設定するために、「Controller Tracking」は不要なので追加する必要はありません。
1. コントローラーのインタラクションを設定するためのPrefabを追加
OVRControllersを[BuildingBlocks]Interactionの中に配置します。
これにより、コントローラーが表示されるようになります。
2. コントローラーのインタラクターを追加
Interaction SDKのインタラクションは、インタラクター(アクションを起こす主体、ここではコントローラー)とインタラクタブル(アクションを受ける対象)の2つの要素で構成されています。
上で説明してきたハンドトラッキングでは、インタラクターは手、インタラクタブルはCubeやQuadオブジェクトでした。
既に、インタラクタブルのオブジェクトは配置されているので、3つのインタラクションを設定するために、コントローラーのインタラクターを追加します。
追加するのは、以下の3つのPrefabになります。
- ControllerGrabInteractor : コントローラーを使ってオブジェクトを掴む
- ControllerPokeInteractor : コントローラーを使ってオブジェクトを突く
- ControllerRayInteractor : コントローラー + レーザーポインターを使ってオブジェクトを選択
3. コントローラーのインタラクション動作確認
以上の設定で、コントローラーのインタラクションについても、3つのインタラクションが設定されているため、動作確認が可能です。
コントローラーハンドのインタラクション設定
Meta Questのインタラクションには、ハンドトラッキング、コントローラートラッキングの他にコントローラーを握りつつ手を表示するコントローラーハンドというものがあります。
1. コントローラーハンドのインタラクションを設定するためのPrefabを追加
OVRControllerHandsを[BuildingBlocks]Interactionの中に配置します。
これにより、コントローラーを握っても手が表示されるようになります。
2. コントローラーハンドのインタラクターを追加
コントローラーハンドで利用するインタラクターは、ハンドトラッキングで利用するインタラクターと同じものです。
Building Blocksでハンドトラッキング用にはインタラクターが設定されていますが、コントローラーハンド用には別で追加する必要があります。
追加するのは、以下の3つのPrefabになります。
- HandGrabInteractor : 手を使ってオブジェクトを掴む
- HandPokeInteractor : 手を使ってオブジェクトを突く
- HandRayInteractor : 手 + レーザーポインターを使ってオブジェクトを選択
3. コントローラーハンドのインタラクション動作確認
以上の設定で、コントローラーハンドのインタラクションについても、3つのインタラクションが設定されているため、動作確認が可能です。
しかし、Pokeのインタラクションで、指が突き抜ける事象が発生するため、その対応が必要です。
ハンドトラッキングでは、以下のような設定をしていることが確認できます。
これに従って、追加対応を行います。
4. Pokeインタラクションの指突き抜け防止対応
HandPokeInteractorにHandPokeLimiterVisualコンポーネントを追加して、設定を行います。
5. コントローラーハンドのインタラクション動作確認
以上の設定で、Pokeのインタラクションも正常に動作するようになります。
まとめ
Building Blocksを利用することで、インタラクションのシーン構築が非常に楽になりました。
個人的な考えですが、コントローラーのインタラクションが自動的に生成されないのは、コントローラーのどのボタンにインタラクションを設定するかなど、アプリケーションによって異なるためなのかもしれません。
今回確認する中で、コントローラーハンドのPrefabが非推奨となっているのも気になりました。
Building Blocksは、「Experimental」の機能のようなので、今度どのようにアップデートされていくのか楽しみです。
書いた人
高野 剛
Unixシステムのインフラ構築・運用を経験後、ECサイトを中心としたWebアプリ開発、プロジェクトマネージメントに従事する。
ミニオン好きが高じて、USJに通い続ける中、XRアトラクションに魅了される。
自分が感動したことを他の人にも体験してもらいたいという思いから、転職を決意し、XRの学校での1年間の学びを経てMESONへ入社。
MESON Works
MESONの制作実績一覧もあります。ご興味ある方はぜひ見てみてください。
Discussion