[HoloLens]XBoxコントローラーでグレイマンを動かす!

5 min読了の目安(約5100字TECH技術記事

https://twitter.com/hi_rom_/status/1363245468046692354

こちらにあるツイートの通り HoloLens 2 アプリでキャラクターを XBox コントローラーで動作させる方法についてまとめました。「なんかいろいろ試してたら動いた」というものの手順を(ある程度あとから調べつつ)言語化しました。もしかしたらもっとエレガントな方法があるかもしれないので、その場合はご指摘等いただけると幸いです。

確認環境

  • UE4.26.1

事前準備

まず、 ドキュメントの Mixed Reality のプロジェクト設定 に記載されている内容の実装は済んでいるものとします。HoloLens と Microsoft Windows Mixed Reality のプラグイン有効化も必要です。また、レベルは Empty Level で新規作成した状態とします。

そして、グレイマンのキャラクターを取り込みたいため、Add Feature or Content Pack... を選択し、

Add Feature

ThirdPerson を選択して Add to Project ボタンを押します。

Add Content

[Place Actors] パネルから [Basic] を選択し、 [PlayerStart] をシーンにドラッグします。[Details] タブで [Location] を X = 0, Y = 0, Z = 0 に設定します。

[Place Actors] パネルの [Lights] タブに切り替えて、Directional Light をシーンにドラッグします(場所は任意)。

[Place Actors] パネルから [Basic] を選択し、 [Plane] をシーンにドラッグします。[Details] タブで [Location] を X = 0, Y = 0, Z = -100、 [Scale] を X = 10.0, Y = 10.0, Z = 10.0 に設定します。

[Contents Browser] パネルの Content > ThirdPersonBP > Blueprints の ThirdPersonCharacter をシーンの Plane の上の任意の場所にドラッグします。

動作検証

事前準備まで済ませた状態で一度 Play ボタンを押してみます。ここで XBox コントローラーの左スティック、または キーボードの W, A, S, D 等キーを押すと MRPawn が移動していることが確認出来ます。

Play01

入力操作では カメラではなくキャラクターが動いてほしいため、レベルに配置した ThirdPersonCharacter の [Details]タブの Pawn >Auto Possess Player を Player 0 に変更します。

Auto Possess Player

この状態で Play ボタンを押すと、キャラクターが入力操作で動いてくれますが、カメラも一緒に動いていることが分かります。

Play02

やりたいことは、カメラの位置は HoloLens の位置(つまり MRPawn の位置)を追従し、入力操作はキャラクターを動かすことです。

方法1

そこで 1 つ目の方法として公式ドキュメントにあるスタティック カメラの使用の方法で固定カメラに切り替える方法を試します。

レベルブループリントを開き、以下と同等になるような実装をすればカメラを切り替えられることが分かります。

Camera Actor

ただし、ここで注意が必要で、先ほど設定した Auto Possess Player を Player 0 に変更した状態で Play をしても MRPawn が生成されていません。

World Outliner

そのため (Camera がついている) MRPawn を予め自分でレベルに配置します([Location] は X = 0, Y = 0, Z = 0)。

そうすれば以下のような Blueprint が組めます。

Set View

ここで Play ボタンを押して動作確認をします。

Play03

カメラの位置は固定でキャラクターだけ操作できていることが分かります。
うまく行っていそうなので、ストリーミングもしくは、デプロイして動作確認します。ストリーミング・デプロイの方法はドキュメント参照

以下はストリーミングで試したものですが、HoloLens の向きに併せてカメラが移動していることと、XBox コントローラーの操作でキャラクターが移動していることが確認出来ます。

Streaming

方法2

方法1 では MRPawn をレベルに自分で配置していましたが、もともとは自動で生成されていたものなので、自動生成されるやり方で出来ないか調べてみました。

まずは、ThirdPersonCharacter の [Details]タブの Pawn >Auto Possess Player を Disable に戻し、レベルに追加した MRPawn を削除します。

この状態で Play ボタンを押すと、以下のように MRPawn は自動で生成され、入力操作で MRPawn が移動する状態となっています。

World Outliner

レベルブループリントを開き、[My Blueprint] パネルの Variables の[+Variable] ボタンを押し、名前を MRPawn にし、 Pawn の Object Referance に設定します。

MRPawn

そして以下のような Blueprint を組みます。

Way 2

この状態でストリーミング、もしくはデプロイして動作確認すると方法1 と同等の動作をすることが確認出来ます。

まとめ

2 つの方法で HoloLens アプリケーションで XBox コントローラーを用いてキャラクターを操作する ことができました。

アプリケーション起動時の Player Cotroller の所有する Pawn が ThirdPersonCharacter か MRPawn かというのが違いで、それぞれの場合に対応した形になると思います。

動作確認するにあたって以下のような Blueprint をテストで組んでみて動作確認すると分かりやすかったです。

Test BP

また、ブループリントでポーンを所有するのドキュメントも参考になりました。

あとは、これを空間マッピングの情報を用いて現実空間でキャラクターを操作する場合には、ARSessionConfig を開き AR Settings > World Mapping の設定を以下のように行い、空間マップのメッシュとコリジョンを生成するようにします。

World Mapping

Use Mesh Data for Occulusion にチェックを入れるとオクルージョン(現実空間の壁などの後ろにあるCGは描画されない機能)が効くようになるはずですが、なにも描画されなくなったりと動作が不安定でした。

現実空間で動かす場合はレベルに配置した床の Plane は削除すると良いと思います。なお空間マップが生成されるまでに少し時間がかかるため、アプリを起動すると最初キャラクターが落下していってしまいます。そのため、以下のような位置のリセット機能を入れておくと良いと思います(以下は キーボードの 3 キーまたは、XBox コントローラーの Y ボタンを押すと位置をリセットする例)。

Reset Position

また、UE4.26 以降ではデプロイ時には Project Settings > Description > Settings の Start in VR にチェックを入れることを忘れないように注意してください(チェックしていないと何も描画されません)。

Start in VR