💡
【VR/XRI】Indexコントローラーの持つ判定を、握りしめたときになるように変更する
環境
- 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のサンプルを上書きすると、アップデートの際に変更されてしまう可能性があるため避ける
- 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
- 閾値の設定は、Project Settings > Input System Packageから可能。ただし自分はここはデフォルトのまま
- Selectアクションの下に、Indexと並列でOculus Touch(やVive等)を設定することで、一つのアクションでマルチプレイデバイスに対応可能(この辺りはInput Systemの良いところ)
- 最後に、手のGameObjectにアタッチされているXR Controller(Action-based)のSelectのところの参照を変更しておく(写真は命名が分かりにいが、デフォルトのものではないものを参照させている)
Discussion