アドカレ
KENTOのひとりアドカレ9日目の記事です。
https://qiita.com/advent-calendar/2025/kento
環境情報
| ツール/SDK | バージョン |
|---|---|
| Unity | 6000.0.62f1 |
| Meta XR Core SDK | 81.0.0 |
| Open XR Plugin | 1.16.0 |
| XR Interaction Toolkit | 3.0.9 |
| XR Hands | 1.7.1 |
事前準備は以下の通りです。
- 【Meta Quest】しばらく触ってないうちにMeta XR SDKがOpenXRベースになっていたので改めて整理
- 【Meta Quest】XR Interaction Toolkitを導入する
- 【Meta Quest】パススルー設定方法
XRIの以下サンプルを元に話を進めます。
Assets/Samples/XR Interaction Toolkit/3.0.9/Starter Assets/DemoScene.unity
デモ
GIFのようにつかみ処理を行うサンプルの構造を見ていきます。
つかむ処理
XRIの基本インタラクションとして、つかむ処理が実装されています。当然ながら、MetaのAPIへの依存はないため、XRIの機能で実装したインタラクションはOpenXR互換のデバイスであればそのままの移植が可能となります。
つかむ動作の中核となるのが、NearFarInteractorです。このコンポーネントの特徴として、遠距離/近距離の両方をサポートしていることが挙げられます。
Inspectorにもそれぞれを有効/無効を切り替える設定が存在しています。

そして、それらのつかみ機能と対になるのがCaster機能です。ShpereInteractionCasterは近距離、CurveInteractionCasterは遠距離の機能それぞれにおける対象オブジェクトの検出を担当しています。InteractionAttachControllerではつかんだ際にどのように追従させるかを設定できます。
つかむ動作のトリガーとなる入力は、UnityのInputSystem(InputAction)で抽象化されています。

※SelectとActiveって何が違うんだろうと思って調べてみたのですが、懐中電灯のオン/オフようなSelect中に発生するイベントをActiveと定義しているようでした。
An interface that represents an Interactor component that can activate an Interactable component. Not to be confused with the active state of a GameObject, an activate event in this context refers to a contextual command action, such as toggling a flashlight on and off.
引用元:IXRActivateInteractor.cs
あとはつかまれる側です。XRGrabInteractableが必須です。XRGeneralGrabTransformerはなくても動きます。
それぞれどんな役割か超簡単に言うと、XRGrabInteractableは「つかまれる物としての設定」、XRGeneralGrabTransformerは「つかんだ後の動き方」 という分離です。
色々設定がありますが、どういう構造であるかさえ理解しておけば、細かいパラメータの持つ意味などを丸暗記する必要はないと思います。ソースがPackageにあるので、Claude CodeやCursorなどに聞けば役割をすぐ教えてくれます。
ここまでの解説はコントローラーの操作を対象としたシーンでしたが、ハンドトラッキングの方も見ていきます。
XRIのHand Interaction Demoをインポートします。

以下パスがサンプルシーンです。
Assets/Samples/XR Interaction Toolkit/3.0.9/Hands Interaction Demo/HandsDemoScene.unity
Hand Interaction Profileを有効化する必要があります。PC環境も有効にしておけばLinkでデバッグも可能です。

うれしいことにコントローラーのときと使うコンポーネントも構造も一緒です。入力ソースはInputActionの抽象化レイヤーとして定義されているので、環境に応じて何をもとに入力したかを意識する必要はありません。

この前提の元、XRInputModalityManagerがコントローラーとハンドトラッキングの切り替え処理を担っています。具体的な処理として、Left/RightHandとLeft/RightControllerのアクティブ切り替えをやってくれます。
おわりに
XRI、素晴らしいです。これほど開発を楽にしてくれて大変感謝です。






