前回、MRTK v2を使ったUnity Editor上でのHoloLens 1の挙動を確認しました。
今回は、MRTKでのInput周りを調査していきたいと思います。
Input周りはMRTKのコアとなる部分なので、コードの量も非常に多く複雑ですが、少しずつ見ていきたいと思います。
全体の概念は、ドキュメントの下記に記載されています。
MRTKは、基本的な思想としてマルチデバイス対応となっています。HoloLen 1/2やWindows MRデバイスはもちろん、Oculus RiftやVIVEでも使用可能です。また、同じデバイスでも複数種類のコントローラーが存在します。HoloLensでしたらば手やXBoxコントローラーに加えてマウスまで使用可能です。
このように、様々なデバイスやコントローラーを扱うために、階層化して抽象化する設計になっており、拡張が容易になっている半面、コードから直接的にアクセスできないのでわかりにくさも増している印象です。
では実際に動かしながら確認していきたいと思います。
MRTKを使った新規シーンを作成して、プロファイルは前回の記事のようにDefaultHoloLens1ConfigurationProfileを選択します。
適当にCubeを配置して、そのCubeに対してインタラクションを行うこととします。
MRTKのチュートリアルでは、対象物に対してInteractable.csをアタッチしました。
同じようにしてみます。
Interactable.csは、その名の通りInputに対してインタラクションを行う中心的な役割をするコンポーネントで、今後も多用することになると思われます。
まず注目したいのが、Input Actionsプルダウンに表示されている「Select」です。
前述のようにマルチデバイス化が行われているため、デバイス固有のアクション(HoloLensならAirTap、マウスのクリック、XBoxコントローラのAボタンなど)に対応した処理を書こうとすると密結合となりコードの量も多くなります。なので、デバイス問わず「Select」というアクション(InputAction)を発行してもらい、それを受け取るようにすれば、受け取る側は「Select」に対応した処理を1つ書いておけば良くなります。
InputActionの定義はプロファイルで行い、デフォルトでは「DefaultMixedRealityInputActionsProfile」で設定されています。カスタマイズするにはプロファイルをCloneして複製します。
では、定義したInputActionがどのデバイスから呼び出されるかの設定ですが、これもプロファイルが管理してて、デフォルトでは「DefaultMixedRealityControllerMappingProfile」で設定されています。同じくCloneして中身を見てみると、各コントローラーごとに、どのボタンを押したらどのInputActionが呼び出されるかの設定がされています。
ちなみに、Articulated Left/Right Hand ControllerはHoloLens 2での手の認識で、HoloLens 1ではGGV Left/Rightとなります。
(GGV = Gesture,Gaze and Voice)
ここでボタンとInputActionの組み合わせを設定したら、Interactableの設定でInputActionを選択します(追加したInputActiobがプルダウンに出てこない場合は一度Runしてみてください)
これで、Interactableが追加したInputActionに反応するようになり、その下のEventsのOnClickにuGUIのようにイベントを設定すればそれを実行することができます。
InputActionのカスタマイズについては、MixeRealityToolkit.Examples > Demos > Input > Scenes > InputActions にもありますので参考にしてください。(RotateというカスタムのActionを定義しています)
イベントを受け取る方法としては、インターフェイスを直接実装する方法もあり、そちらの方がHTKの経験がある場合は楽かもしれませんが、MRTKの機能をフルに使うにはInteractableを使った方がシンプルに実装できそうです。
つづく。。