仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

HoloLens2でxboxのコントローラを使う(Input System)

今回は、HoloLens2でxboxコントローラを使用する方法をメモします。
UnityのInput Systemで簡単に使用できるようなので試します。
Input SystemはこれまでのUnityの入力系と比べ新しく、拡張、カスタマイズが可能なものであると説明されています。

docs.unity3d.com

せっかくなので、コントローラを用いて下記で使用した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を選択します。
f:id:napo909:20220213141934p:plain

Input Systemを見つけ、右下のInstallをクリックします。
f:id:napo909:20220213142006p:plain

Installを行うと再起動を求められるため、Yesをクリックします。
f:id:napo909:20220213142146p:plain

再起動が終わるとUnityの入力が新しいInput Systemに置き換わります。
しかし、MRTKのInput Simulatorでは古い入力方式を使用しているため、このままではPlayモードで動作確認が十分できません。
そのため、新旧両方使えるようにする必要があります。

上部メニューからFile → Build Settings...を選択し、Build Settingsウィンドウを表示します。
f:id:napo909:20220213142616p:plain

Build Settingsウィンドウ左下のPlayer Settings ...ボタンを押して、Project Settingsウィンドウを開きます。
f:id:napo909:20220213142643p:plain

Project SettingウィンドウのPlayer Setting、Other SettingsのActive Input Hnadlingを確認します。
Input Systemを導入したことでInput System Package (New)がアクティブになっていると思います。
MRTKではInput Manager(Old)を使用しているので、一番下のBothを選択します。
f:id:napo909:20220213142918p:plain

再度ウィンドウが表示され再起動を促されるので、Applyを押して再起動します。
f:id:napo909:20220213144012p:plain

これでInput Systemの導入ができました。

VRMモデルを歩かせる

今回はStarter Assets - Third Person Character Controllerを使用します。

assetstore.unity.com

Add to My Assetsを実施した後、Unity Projectに導入します。
f:id:napo909:20220213145059p:plain

導入したら、VRMモデルのAnimatorコンポーネントにAnimation Controllerとして、Assets -> StarterAssets -> ThirdPersonController -> Character -> Animations -> StarterAssetsThirdPersonをアタッチします。
f:id:napo909:20220213145543p:plain

次にThirdPerosonContollerコンポーネントをアタッチします。
すると、Character Controller, Player Inputコンポーネントが一緒にアタッチされます。
次にStarter Assets Inputsもアタッチします。
f:id:napo909:20220213150914p:plain

Player InputコンポーネントのActionsにStarterAssets、Defauilt SchemeXbox Controllerを設定します。
f:id:napo909:20220213150056p:plain

キャラクターのColliderを調整するために、Character ControllerのCenter, Radius, Heightを調整します。
f:id:napo909:20220213151522p:plain f:id:napo909:20220213151530p:plain

次にProject SettingsウィンドウのInput System PackageからSupported Devicesを選択します。
今回は使用するXbox Contorllerを選択します。
f:id:napo909:20220213150540p:plain

このままではキャラクターが無限に落ちていくので、Ground LayersにSpatial Awarenessを設定した上で、Spatial Awarenessを有効にします。
f:id:napo909:20220213151104p:plain f:id:napo909:20220213155700p:plain

また、初期位置として、Spatial Awarenessタグを付与したPlaneを配置し、アプリ起動時に落ちないようにします。
f:id:napo909:20220213152014p:plain

最後にそれでも落ちてしまった場合に復帰できるようにリセットボタンを用意します。
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;
    }
}

f:id:napo909:20220213153506p:plain

HoloLensにxboxコントローラをつなぐ

今回はBluetoothで接続しました。
xboxコントローラをペアリングモードにしたのち、HoloLensの設定からBluetoothを選択します。
バイスの追加からBluetoothまたはその他のデバイスを追加するを選択します。 f:id:napo909:20220213162504j:plain

「デバイスを追加する」画面からBluetoothを選択します。
f:id:napo909:20220213162614j:plain

今回接続したいXbox Wireless Controllerを選択すると、HoloLensに接続することができます。 f:id:napo909:20220213162822j:plain f:id:napo909:20220213162835j:plain

動作確認

無事コントローラでVRMモデルを操作することができました。
Spatialをつかっているので、現実空間の物体がColliderになり、そこにいるような感覚を得ます。
Starter AssetsのAnimatorを使っているためか肩の位置がややおかしいため、微調整するとなお見た目が良くなりそうです。

Input Systemを用いると、HoloLensでxboxコントローラの利用が簡単にできることがわかったので、次回以降バーチャルなラジコンなど実装してみようと思います。