UE4でもHoloLens/WinMRHeadsetの開発がしたい！

[Unreal Engine 4 (UE4) その2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4second) の13日目です。

以前からHoloLensやWindowsMixedRealityHeadset(Immersiveデバイス)用のプログラムをUE4で開発するあれこれをやっているので、それ関連の個人的な知見から、デプロイまでの手順をまとめます。
(これでUE4 × WinMRに取り組む人が3人ぐらいでも増えるといいな。)
※本件特有の手順以外の手順は詳細な説明はあまりしていません。

###●UE4で作ったやつ
【第8回UE4ぷちコン応募作品】[とある仮想時限(アンリアル)の魔法陣(クロノスブレイカー)](https://t.co/tPHYCDs4BG)

###●その他UE4で検証とかしたやつ
[HoloLens上でUWPアプリの動作を確認(ついでにXBOXOneコントローラーも使用)](https://twitter.com/diberidarshi/status/848145553078628356)
[MixedRealityポータル上でUWPアプリの動作を確認](https://twitter.com/diberidarshi/status/901327423525994497)
[WinMRHeadsetの動作を確認](https://twitter.com/diberidarshi/status/902540037237088256)
[WinMRのモーションコントローラーの動作を確認](https://twitter.com/diberidarshi/status/931572213110652928)

#前提のお話
UE4は4.18の現在UWP向けの出力に対応していません。そのため、HoloLens向け含むWindowsStore用のアプリ等のUWP用のアプリケーションを作成することはできません。
そのため通常のEpicGamesLauncherから起動するUE4ではなく、UWP出力するべくカスタムされたUE4を使用します。
そういった経緯もあり、情報も少なく動作等も安定しているとはいいがたいです(私自身まだ解っていないことの方が多いです)。

#環境の構築

##VisualStudioとWindows10SDK
まずUWP関連のビルドを行えるように、VisualStudioをインストールします。
(今回は最新のVisualStudio2017を使用します。)
**※既にインストール済みの方も更新を確認することをオススメします。場合によってはビルドのどこかでこける可能性がありますので**(コントロールパネルのプログラムと機能から「Microsoft Visual Studio 2017」の変更を選択することで更新できます)。
インストールの際は**「ユニバーサルWindowsプラットフォーム開発」の項目にチェックを入れて**、インストールを開始します。
<img width="969" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/214053/a82e59fa-9012-4fd6-9982-afbae020895c.png">

しばらく時間がかかるので、気長に待ちましょう。

##専用のUE4
GitHub上からカスタムされたUE4のソースコードを取得し、エンジンビルドを行います。
手順自体は[こちらの記事](http://historia.co.jp/archives/1327/)と同じにはなりますが、アクセスするリポジトリ等が異なります。

###エンジンのソースコードを取ってくる
https://github.com/MICROSOFT-XBOX-ATG/MICROSOFT_UWP_UNREAL
![UWP_UE4_GitHub.png](https://qiita-image-store.s3.amazonaws.com/0/214053/fbdd401e-7090-d553-d02c-6ca3b07838ce.png)
このページにアクセスしてGitのクライアントアプリで落とすなり、「Clone or download」の「Download ZIP」から落とすなりしましょう。ちなみにブランチはデフォルトでは「release_uwp」になっていますが、こちらはUWP用です。WinMR用に3Dのアプリを作る際は「dev_MixedReality」ブランチに切り替え、そちらを使用しました。

![GitHub_404.png](https://qiita-image-store.s3.amazonaws.com/0/214053/89ff4a52-7f7f-cc6f-0c9c-440c94e56bdb.png)

このページに404でアクセスできない場合は、UE4用のアカウントとGitHubのアカウントを紐づけ、ログインした状態でアクセスしてください。手順は[オフィシャルのサイト](https://www.unrealengine.com/ja/ue4-on-github)にも記載されています。

###エンジンのビルドを行う
取得したエンジンデータのフォルダ内に「Setup.bat」というファイルがあるので実行し、追加で必要なファイルを用意します。
こちらもしばらく時間がかかります。
※環境次第でXBOX用のSDK等追加でインストールされることがありますので、その場合は出てきたインストールウィザードを実行させて下さい。
「Setup.bat」が終了したら、「GenerateProjectFiles.bat」を実行し、VisualStudio用のプロジェクトファイルを生成します。
「UE4.sln」が生成されるので、それを開き、VisualStudio上でビルドを実行します。
これもしばらく時間がかかります。

ビルドが正常終了すると、「Engine\Binaries\Win64」フォルダ内に「UE4Editor.exe」が生成されているので、これで開発するための環境はできました。

(私の環境だとここまでで4~5時間ほどかかります。CPU性能やネットワーク環境が素晴らしくない場合は気長に待ちましょう。)

#実機にデプロイしてみる

##HoloLens用

###パッケージ化
新規プロジェクトから適当に作ったプロジェクトで「File」→「Package Project」→「Universal Windows Platform」→「UWP(x86-32bit)」からパッケージ化を行います。
![HoloLens_Packaging.png](https://qiita-image-store.s3.amazonaws.com/0/214053/084552e7-05c8-5740-80cd-2f7fd08ec8a7.png)
これもしばらく時間がかかります。

###証明書関連の入力
パッケージ化の最後の方で、証明書関連の入力が発生します。
ストアにリリースするのであれば設定が必要でしょうが、ローカルでテストするだけであれば特に設定せずともアプリの動作は確認できるので、最初のダイアログボックスを「OK」、続いて出てくるメッセージボックスを「はい」を選択し、入力を省略します。
![CreatePrivateKeyPassword.png](https://qiita-image-store.s3.amazonaws.com/0/214053/1fd45a22-7042-79d3-4c86-f96d8b62ec48.png)
![CreatePrivateKeyPassword_msg.png](https://qiita-image-store.s3.amazonaws.com/0/214053/7fdfc356-c899-ef62-9cdb-1bf13f5553dc.png)

###appxファイルのインストール
パッケージ化が完了したら、UWP32というフォルダに拡張子が「appx」というファイルが生成されています。これがUWP用のパッケージファイルなので、これを実機にインストールします。
![appx_output.png](https://qiita-image-store.s3.amazonaws.com/0/214053/5ca1d5d8-59c3-595f-cc47-d9e6a84c1097.png)

PCのブラウザからHoloLensのデバイスポータル[^1]を開き、「App」→「Install App」→「App Package」で先ほど作成されたappxファイルを選択します。
「Deploy」の「Go!」ボタンを押すことで実機にインストールされます。
![HoloLens_AppManager.png](https://qiita-image-store.s3.amazonaws.com/0/214053/8e6e1c3d-678f-bf32-2910-9578b9a2fb7f.png)

インストールが完了したら、デバイスポータル上or実機上から対象のアプリケーションを起動しましょう。

**ただ、たぶん2017/12/13時点で「dev_MixedReality」ブランチの最新のリポジトリを落としていると起動直後に落ちると思います。**
詳細な原因まで確認できていないのですが、最新のリポジトリを使用した私の環境では落ちています。
UE4ぷちコンの際(2017/9/9時点)はこの手順で動作を確認し、冒頭に動画URLを貼ったクロノスブレイカーを作成しました。
(原因は調査中ですが、情報も少なく、諸々の手順の待ち時間も大概長いのでまだ原因は解っていません。)
なので、ひとまず動かしたい場合は2017/9/9時点のリビジョンでエンジンのビルドを行ってみるといいかもしれません。

##WindowsMixedRealityHeadset(Immersiveデバイス)用
基本的にHoloLensと同じです。相違点だけ記載します。
###パッケージ化のターゲット
「File」→「Package Project」→「Universal Windows Platform」→「**UWP(x64-64bit)**」からパッケージ化を行います。
![Immersive_Packaging.png](https://qiita-image-store.s3.amazonaws.com/0/214053/309d22fe-1e7a-dd37-20ef-9596a8a6b4c2.png)


###インストール時の手順
ローカルマシンのMixedRealityポータル用のデバイスポータルにアクセスし、「Add」から**appxファイルと一緒に生成されているcerファイルの両方を設定し、「Next」ボタンを押すことで**ローカルマシンのMixedRealityポータル内からアクセスできるアプリとして、インストールされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214053/6ce374ad-605b-d628-7f92-4c5bb27fddcb.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214053/4ee61227-37df-4404-3b9e-cd5d9c456de5.png)

インストールが完了したら、デバイスポータル上or実機上から対象のアプリケーションを起動しましょう。
**ただ、こちらもたぶん2017/12/13時点で「dev_MixedReality」ブランチの最新のリポジトリを落としていると起動直後に落ちると思います。**
プロジェクトの設定の「Rendering」→「Forward Renderer」から「Forward Shading」にチェックを入れた状態で、パッケージ化すると問題なく動作すると思います。
(こちらもHoloLensと同じく情報不足中です。)


#さいごに
ひとまず何もないところからデプロイするまでを今回まとめてみました(大枠は[このスライド](https://www.slideshare.net/naoakiyamaji/holo-lens-ue4)にも書いてますが)。

正直まだ発展途上過ぎて新規でこの環境に飛び込む人は中々いないと思いますが、私は飛び込んでUE4ぷちコンにチームで応募→入賞して、横浜まで行って自前のHoloLensで1日中アテンドすることで、UE4ぷちコンで2位に入賞して手に入ったSwitchでスーパーマリオオデッセイとかできてます。
(ちなみに私のUE4×HoloLensの全ては[ここ](http://unrealengine.hatenablog.com/entry/2017/03/11/000502)から始まりました。)

随時調査は進めていきますが、私の手元の環境だとここの全手順をやると6～8時間潰れるぐらい待たされたり、情報がほとんどなかったり(日本語は正直皆無な気がする)するので、興味がある方は気長に待つか、一緒に調査してくれるか、私にハイスペックなマシンをください。

#その他情報
##UE4ぷちコンで作成したクロノスブレイカー関連
- 「WindowsSpeechRecognition」の「KeywordRecognition」コンポーネントを使用して、WinMRでの音声認識が使える
- 基本的な構成の考え方はVRと同じでHoloLensでも概ね思った通りに動く(頭の向き等)

##それ以外
- ImmersiveデバイスではVRプレビューが使用できる
- 2017/12/13時点だとMixedRealityテンプレートを選択してプロジェクトを作成すると、プロジェクトが開けず落ちます(しかもクリップボード内にエラー残ってなかった)
- 2017/11/7時点だとMixedRealityテンプレートから生成したプロジェクトで、モーションコントローラーが使用できる(「dev_MixedRiality」ブランチではVRプレビュー上では使用できなかった)
- VisualStudio上での「デバッグ」→「その他デバッグターゲット」→「インストールされているアプリケーションパッケージのデバッグ」からHoloLensやImmersiveデバイスに接続し、アプリケーションのデバッグが行える模様

[^1]: デバイスポータルについては、この辺りを参照([Windows Device Portal の概要](https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/device-portal)、[HoloLens 用 Device Portal](https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/device-portal-hololens))