[UE4]HandheldARテンプレートを読んでみる

# はじめに
プロジェクト作成時にHandheldAR（日本語だと携帯AR）を選択したものを読んでいきます。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/ed8b4009-aa1e-0199-f8e7-b74cd17d411a.png)
デプロイするまではクイックスタートに従いました。
https://docs.unrealengine.com/ja/Platforms/AR/HandheldAR/ARQuickStart/index.html

この記事で使用したプロジェクトを下記にアップロードしています
https://github.com/tamfoi/advent-calendar-2019

# コンテンツ一覧
|パス|概要|
|-----------------|------------------|
|HandheldARBP\D_ARSessionConfig|ARモード時の設定ファイル|
|HandheldARBP\Blueprints\GameFramework\BP_ARGameMode|PawnとControllerを設定している以外は特になし|
|HandheldARBP\Blueprints\GameFramework\BP_ARPawn|UI制御や画面がタッチされたときにオブジェクトを出す処理など|
|HandheldARBP\Blueprints\GameFramework\BP_ARPlayerController|特に実装なし|
|HandheldARBP\Blueprints\Placeable\BP_Placeable|画面をタッチされたときに出現するオブジェクト|
|HandheldARBP\Blueprints\Placeable\M_ContactShadow|BP_Placeableのオブジェクトの陰部分のマテリアル|
|HandheldARBP\Blueprints\Placeable\T_ContactShadow|M_ContactShadowに設定されているテクスチャ|
|HandheldARBP\Blueprints\UI\BP_DebugMenu|デバック表示の有無やARの有効無効の切り替え処理など|
|HandheldARBP\Blueprints\UI\BP_MainMenu|起動直後に表示されるUI|
|HandheldARBP\Maps\HandheldARBlankMap|デフォルトマップ。レベルBPには特に実装なし|
|HandheldARBP\Materials\M_BackgroundFade|未使用|


下記4つを見ていけば良さそうです

- HandheldARBP\Blueprints\GameFramework\BP_ARPawn
    - 以下BP_ARPawnと呼称します
- HandheldARBP\Blueprints\Placeable\BP_Placeable
    - 以下BP_Placeableと呼称します
- HandheldARBP\Blueprints\UI\BP_MainMenu
    - 以下BP_MainMenuと呼称します
- HandheldARBP\Blueprints\UI\BP_DebugMenu
    - 以下BP_DebugMenuと呼称します


# BP_ARPawn
## BeginPlay
UMGの設定処理が入っています。ZOrderでスタート画面のほうが上にくるようになっているのがポイントです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/fd406d17-5473-2b74-4b13-714db42ddb10.png)

## InputTouch
画面をタップしたときの処理です。最初は普通のライントレースを飛ばして既に配置したオブジェクトがないかチェックしています。オブジェクトがなかった場合にはAR機能で認識した床かどうかをチェックして真ならば新しいオブジェクトをそこに生成するという感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/d43af3db-6cb1-14c6-d207-894fc56392ba.png)


# BP_Placeable
## コンストラクションスクリプト
3種類のメッシュをランダムで設定する処理です
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/56298fa0-1298-0f53-e27b-f9bdb30f252c.png)

## イベントグラフ
スポーン時の演出処理です。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/d4fc3935-3bc6-531b-3e12-8cef25c28221.png)

# BP_MainMenu
## 表示されるUI
<img width="30%" alt="Screenshot_20191208-184849.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/be7e9d38-a9a2-c7e1-8085-34305372aed0.png">

## Start ARボタンタップ時の処理
ARモードに切り替えて自身を削除してカメラ映像やメニューを見えるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/16346450-cf43-4f8b-2e0f-453ca75b643f.png)

# BP_DebugMenu
## 表示されるUI

### Button
デバック系の情報の表示非表示の切り替えなどができるボタン
![Screenshot_20191208-182753-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/06e28d99-787c-1231-223d-66710065976a.png)

### Light Info
環境光などの情報（デバックログなのでUIではないかもですが）
![Screenshot_20191208-182753-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/c4c76a28-c578-a52c-8209-87b7db309b10.png)

## Event Construct
BP_Pawnで設定されているタップしたときの処理結果に応じて渡されてくるオブジェクトをLast Hit Objectの部分に表示するEventをディスパッチャーに登録しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/2ce8e198-936b-8c6d-9211-522505fe1a86.png)

## Event Tick
各デバックフラグがオンのときに毎フレーム更新する処理が入っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/afdbeb18-261f-3c0b-9b56-ec0de88e0d49.png)

## Button
各ボタンをタップしたときにデバック表示の切り替えやARモードのON/OFFなどを切り替える処理が入っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150472/19a8a275-f908-09aa-4e39-3df7618704c0.png)

# おわりに
HandheldAR以外にもGoogleが出しているサンプルがあるのでそちらも確認すると良さそうです(エンジンのビルドからする必要があるみたいです)
https://developers.google.com/ar/develop/unreal/quickstart