💡

【VR/XRI】Indexコントローラーの持つ判定を、握りしめたときになるように変更する

2022/11/16に公開

環境

  • Unity 2021.3.7f1
  • XR Interaction Toolkit 2.2.0
  • OpenXR 1.4.2

概要

  • Indexコントローラーの持つ判定(gripPressed)の判定が、デフォルトの場合、中指等がコントローラーに触れたタイミングで発火する。そのため、意図せずにオブジェクトをつかんでしまう問題が発生する
  • Input Systemの設定を変更することで、ソースコードを書かずにこの問題を解決した(コントローラーを軽く握りしめたときに持つようにする)
  • Oculus Touch Controllerなど他デバイスとの共存も可能になっている

問題の原因

  • XR Interaction ToolkitのStartar Assets(サンプル)で設定されているInput Actionでは、以下のようにSelectが設定されている。(任意のデバイスのコントローラのgripPressedをとっている)
  • IndexコントローラーのgripPressedは、指が触れたときに発火する仕様とのこと。参考

解決

  • Input Actionの設定を独自に作り、新たにSelectの設定をする
    • XRIのサンプルを上書きすると、アップデートの際に変更されてしまう可能性があるため避ける
  • Action TypeはButtonとし、その下のバインドで各コントローラーの入力を設定する
  • Indexコントローラーは、gripForceという0~1のアナログな値を取得し、閾値を超えたときにselect判定が呼ばれるようにする
    • 閾値の設定は、Project Settings > Input System Packageから可能。ただし自分はここはデフォルトのまま
    • 閾値の設定ではなく、Input Actionの設定から、Processorsを通すことで実際の入力値を加工することが可能
    • 2022.12.16追記: このProcessorsは効いてないことがわかった。格闘過程: https://zenn.dev/dara/scraps/220110ee37235b
  • Selectアクションの下に、Indexと並列でOculus Touch(やVive等)を設定することで、一つのアクションでマルチプレイデバイスに対応可能(この辺りはInput Systemの良いところ)
  • 最後に、手のGameObjectにアタッチされているXR Controller(Action-based)のSelectのところの参照を変更しておく(写真は命名が分かりにいが、デフォルトのものではないものを参照させている)

Discussion