🙄

【XRI/InputSystem】Viveコンで、Trackpadを押し込んだとき(触れたときではなく)に移動するようにする

2022/12/31に公開

環境

  • 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の右の「+」ボタンから作成可能
  • 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