HoloLens2でxboxのコントローラを使う(Input System)
今回は、HoloLens2でxboxコントローラを使用する方法をメモします。
UnityのInput Systemで簡単に使用できるようなので試します。
Input SystemはこれまでのUnityの入力系と比べ新しく、拡張、カスタマイズが可能なものであると説明されています。
せっかくなので、コントローラを用いて下記で使用したVRMを歩かせることを目標とします。
xr-physics-work-etc.hatenablog.com
前提
今回の環境は以下です。
Unity 2019.4.31
MRTK 2.7.3
MRTKは既に導入済みとします。
準備
Input Systemを導入する
まずはInput Systemを導入します。
Input SystemはPackage Managerからインポートできます。
上部メニューのWindow → Pacakge managerを選択します。
Input Systemを見つけ、右下のInstallをクリックします。
Installを行うと再起動を求められるため、Yesをクリックします。
再起動が終わるとUnityの入力が新しいInput Systemに置き換わります。
しかし、MRTKのInput Simulatorでは古い入力方式を使用しているため、このままではPlayモードで動作確認が十分できません。
そのため、新旧両方使えるようにする必要があります。
上部メニューからFile → Build Settings...を選択し、Build Settingsウィンドウを表示します。
Build Settingsウィンドウ左下のPlayer Settings ...ボタンを押して、Project Settingsウィンドウを開きます。
Project SettingウィンドウのPlayer Setting、Other SettingsのActive Input Hnadlingを確認します。
Input Systemを導入したことでInput System Package (New)
がアクティブになっていると思います。
MRTKではInput Manager(Old)
を使用しているので、一番下のBoth
を選択します。
再度ウィンドウが表示され再起動を促されるので、Applyを押して再起動します。
これでInput Systemの導入ができました。
VRMモデルを歩かせる
今回はStarter Assets - Third Person Character Controllerを使用します。
Add to My Assetsを実施した後、Unity Projectに導入します。
導入したら、VRMモデルのAnimatorコンポーネントにAnimation Controllerとして、Assets -> StarterAssets -> ThirdPersonController -> Character -> Animations -> StarterAssetsThirdPerson
をアタッチします。
次にThirdPerosonContoller
コンポーネントをアタッチします。
すると、Character Controller
, Player Input
コンポーネントが一緒にアタッチされます。
次にStarter Assets Inputs
もアタッチします。
Player Input
コンポーネントのActionsにStarterAssets
、Defauilt SchemeにXbox Controller
を設定します。
キャラクターのColliderを調整するために、Character Controller
のCenter, Radius, Heightを調整します。
次にProject SettingsウィンドウのInput System PackageからSupported Devicesを選択します。
今回は使用するXbox Contorllerを選択します。
このままではキャラクターが無限に落ちていくので、Ground LayersにSpatial Awareness
を設定した上で、Spatial Awarenessを有効にします。
また、初期位置として、Spatial Awarenessタグを付与したPlaneを配置し、アプリ起動時に落ちないようにします。
最後にそれでも落ちてしまった場合に復帰できるようにリセットボタンを用意します。
MRTK標準ボタンに下記スクリプトをアタッチし、初期位置に戻せるようにします。
- ResetPos.cs
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResetPos : MonoBehaviour { Vector3 pos = new Vector3(0, 0, 0); Quaternion rot = new Quaternion(0, 0, 0, 1); Vector3 scale = new Vector3(1, 1, 1); [SerializeField] Transform targetTransform; // Start is called before the first frame update void Start() { pos = targetTransform.position; rot = targetTransform.rotation; scale = targetTransform.localScale; } // Update is called once per frame public void ResetPosFunc() { targetTransform.position = pos; targetTransform.rotation = rot; targetTransform.localScale = scale; } }
HoloLensにxboxコントローラをつなぐ
今回はBluetoothで接続しました。
xboxコントローラをペアリングモードにしたのち、HoloLensの設定からBluetoothを選択します。
デバイスの追加からBluetoothまたはその他のデバイスを追加する
を選択します。
「デバイスを追加する」画面からBluetooth
を選択します。
今回接続したいXbox Wireless Controllerを選択すると、HoloLensに接続することができます。
動作確認
無事コントローラでVRMモデルを操作することができました。
Spatialをつかっているので、現実空間の物体がColliderになり、そこにいるような感覚を得ます。
Starter AssetsのAnimatorを使っているためか肩の位置がややおかしいため、微調整するとなお見た目が良くなりそうです。
HoloLens2 + xboxコントローラを試すついでにVRMモデル動かしてみた。
— napo tech (@SubNapo) February 13, 2022
Spatial Awareness使うだけで現実の物体にぶつかるので実在感が違うなぁ。 pic.twitter.com/z7dy5IXYpJ
Input Systemを用いると、HoloLensでxboxコントローラの利用が簡単にできることがわかったので、次回以降バーチャルなラジコンなど実装してみようと思います。