🎮

[HoloLens]UE4でXBoxコントローラーを利用する

2021/02/20に公開

UE4 を利用して、HoloLens 2 で Xbox コントローラーでオブジェクトを操作する方法を確認してみました。

まず最初に結論を書くとドキュメントに書かれている通りの手順で進めると、XBox コントローラーによる操作が可能な状態になっています。ただし、自分の思った通りのキー設定をしたい場合にはひと手間必要となります。

確認環境

  • UE4.26.1

Mixed Reality のプロジェクト設定

まず、 ドキュメントの Mixed Reality のプロジェクト設定 に記載されている内容の実装は済んでいるものとします。

この状態で目の前に Cube でも配置してHoloLens にデプロイをしてみると ペアリングした XBox コントローラーの左スティック等でオブジェクトが移動することが確認出来ます。

PC と XBox コントローラーをペアリングしていればストリーミングでも動作確認でき、またエディター上でW, A, S, D 等のキー操作でもオブジェクトが移動することが確認出来ます。

Camera Move

ただし、これは以下のような簡単なBlueprintを組んでみると Cube 自体が移動しているわけではなく、カメラが移動していることが分かります。

Camera Pos

この動作は Editor 上ではユーザーの移動をシミュレーションすることができるため便利ですが、実機にデプロイした状態の場合、カメラの位置は ユーザーの目線と一致している(HoloLens の位置である)必要があるため、カメラの位置が移動してしまうのは都合が悪いです。

カメラの移動の実装場所

XBox コントローラーを利用するような実装は何もしていないのに、なぜこのような動作をするのかを調べたところ、 DefaultPawn に以下のような実装がありました。

DefaultPawn

マッピングの定義とバインドする処理が書かれおり、この中に XBox コントローラーのスティックやキーボード操作が予め Pawn の移動に割り当てられていることが分かります。

ドキュメントにある MRPawn はこの DefaultPawn を継承するよう書かれているため、このような動作が予め機能するようになっています。

カメラの移動の無効化

カメラが移動する原因が分かったため、HoloLens のアプリで XBox コントローラーを利用したい場合はこれを無効化する必要があります。

一番簡単な方法としては DefaultPawn の継承をやめてしまえばよいです。

Pawn

MRPawn 作成時に DefaultPawn ではなく、その親クラスである Pawn クラスを選ぶだけで不要な入力設定は反映されなくなります。

ただし、この方法だと Editor でもキーボード操作が効かなくなってしまうため、ユーザーの移動を手軽に Editor 上でシミュレーションしたい場合に不便です。

そこで、DefaultPawn を継承したクラスを自分で作ることにします。

メニューの File > New C++ Class... を選択します。

MRCppPawn

DefaultPawn を選択し、Next を選択します。

MRCppPawn

任意の名前(ここではMRCppPawn)を入力し、Private を選択して Create Class を選択します。

MRCppPawn.h

UCLASS()
class AMRCppPawn : public ADefaultPawn
{
    GENERATED_BODY()

    virtual void SetupPlayerInputComponent(UInputComponent* InInputComponent) override;
};

MRCppPawn.cpp

void AMRCppPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
#if PLATFORM_HOLOLENS
    // HoloLens での処理
    
    // DefaultPawn.cppの内容を参考に、
    // ここに直接C++で入力の処理を書いても良いと思います。
#else
    // HoloLens 実機以外での処理
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    // スティック操作によるカメラ移動等を無効化したい場合は、
    // 親クラスのSetupPlayerInputComponentを呼ばずに、
    //ここに独自の処理を実装することになります。
#endif
}

上記のような実装をしてコンパイルします。

MRGameMode

そして、MRGameMode の Default Panw Class を MRCppPawn に変更します。これで Editor 上では キー操作等が可能になり、HoloLens 実機ではすべて無効になります。

あとは、好きなように XBoxコントローラー のボタンを押したときの実装を行えば良いと思います。以下は簡単な動作確認用に実装したものです。

XBox BP

https://youtu.be/wZTqtX1DiiA

X ボタンと B ボタンで Cube が移動することと、スティック操作をしてもカメラが移動しないことが確認出来ます。

Discussion