🙄
【XRI/InputSystem】Viveコンで、Trackpadを押し込んだとき(触れたときではなく)に移動するようにする
環境
- Unity 2021.3.7f1
- XR Interaction Toolkit 2.2.0
- OpenXR 1.4.2
- 検証デバイス
- HTC Vive Pro
- Meta Quest 2(単機とQuestLinkでPCVR)
やりたいこと
- 問題: スムーズ移動(Continuous Move)時、XRIのデフォルトの設定だと、Viveコンで移動しようとするときに、Trackpadに触れただけで移動してしまう。
- Trackpadに触れただけではなく、押し込んだときに移動するようにしたい
- VRChatではそのような挙動になっている
結論
- InputSystemのmodifierを活用することで、trackpadのvector2の入力と、trackpadClickedの入力を組み合わせて使うことができる
詳細
trackpadを押し込んだときだけ入力を受け取るようにする
- InputSystemのActionの設定で、
XRI LeftHand Locomotion>Moveのアクションの下のバインドを変更する - もともとは、
Primary2DAxis [LeftHand XR Controller]がバインドされている- これによって、コントローラーがどのデバイスであるかに関係なく、よしなに2DAxisの入力を取ってくれていて、それはそれで便利ではある
- だが、たまに不都合があり、今回の場合は不都合に当てはまっている
- 以下の
VIVE Moveアクションのようにバインドする(VIVE Moveアクションは説明用にVive限定で作っているが、後程他のMoveと統合する)- Actionの右の「+」ボタンから作成可能
- Actionの右の「+」ボタンから作成可能
- Modifierの方には、前提となる入力を入れる。今回であれば、
trackpadClicked [LeftHand HTC Vive Controller]を入れる。 - Bindingには、本来入れたい入力を入れる。今回は
trackpad [LeftHand HTC Vive Controller]を入れる。 - これによって、trackpadをclickしているときだけtrackpadの入力を受け取る。
1つのActionの中で他の入力と両立させる
- 上記は
VIVE Moveとしてアクションを切り分けたが、同じMoveの中に入れたい。 - 上手くいかないやり方
-
Primary2DAxis [LeftHand XR Controller]と並列にならべる 
- こうすると、触れただけで移動してしまう。
- これは、
LeftHand XR ControllerがXR系の入力を包含していて、その中にViveコンのtrackpadを触れただけの入力が含まれているから。
-
- 上手くいくやり方
- 以下のように、個別のコントローラーの入力をそれぞれ別で設定する(OculusとIndexをそれぞれ作る)

参考
捕捉
- 今回のContinuous Moveだけでなく、TurnやTeleport周りも同じように設定すればよい。
Discussion