UE4でHPゲージをモデルの頭上に表示しよう

#UE4でHPゲージをモデルの頭上に表示しよう

##目標
アクションゲームの敵キャラの頭上に表示するようなHPゲージをUMGを使って表示してみましょう。

##結果
![SnapCrab_NoName_2017-5-18_8-33-59_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/e7582255-47fa-ef1c-3c90-b51baee015eb.jpeg)


##環境
UnrealEngine 4.15.2

##手順
１．ThirdPersonのサンプルを用意します。

２．敵キャラを用意するので、ThirdPersonCaracotrの子ブループリントを2つ作って、敵用とプレイヤー用を用意します。
![SnapCrab_NoName_2017-5-17_22-27-22_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/c9c79e49-f905-d48d-c7ea-a3baf9fa0c90.jpeg)

２．GameModeのプレイヤーポーンをプレイヤー用のものに変更
　 下記ブループリントはプレイヤー用のイベントに移動してしまいます。　
![SnapCrab_NoName_2017-5-17_22-28-10_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/e93b166d-7296-47fc-a75d-7339d4ba196b.jpeg)

３．HPゲージをUMGで作成します。
　コンテンツブラウザの新規作成からヴィじっとブループリントを選択し、
![SnapCrab_NoName_2017-5-18_8-51-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/181347/1669fb03-ced9-6358-6437-142736268f59.png)
　名前を適当に決めてダブルクリックで開いた後、
![SnapCrab_NoName_2017-5-18_8-51-7_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/c5197c19-3cb9-5c1b-6c65-e417e2e79cf2.jpeg)
　プログレスバートテキストでHPバーの外観を作成します。
![SnapCrab_NoName_2017-5-18_8-50-39_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/3dd374de-d263-ceae-d822-434b418d663e.jpeg)

※アンカーはすべて左上にしてあります。

４．プログレスバーのゲージは関数にバインドして、変数としてThirdPersonCaracotrのリファレンスを追加、ThirdPersonCaractor側にもHPという名前でfloat型の変数を用意した後、下記のようにつなげておきます。

ゲージを関数にバインド
![SnapCrab_NoName_2017-5-18_8-59-59_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/79b5eb73-c11f-43b8-d01f-5b8d7abd2974.jpeg)

ThirdPersonCaractorに変数追加
![SnapCrab_NoName_2017-5-18_9-3-6_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/a71a42c8-7b0b-f6d4-9f43-a1028cfce95a.jpeg)

ブループリントで紐づけ
![SnapCrab_NoName_2017-5-18_9-4-53_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/f2dde9c0-5117-35fb-2d9b-b47e48e1ffe3.jpeg)
（※１から変数を引いているのは黒カラーのバーが増えていくことでゲージが減っているように見せるためです。）

５．敵キャラを配置
![ScreenShot00009.png](https://qiita-image-store.s3.amazonaws.com/0/181347/0a3655f3-fc49-b626-6859-6888b9fac818.png)


６．敵キャラのブループリントにUIのリファレンスを追加し、BiginPlayイベント（とDestroyedイベント）で下記のように設定しておきます。
![SnapCrab_NoName_2017-5-18_23-20-50_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/bb6b72e2-3886-ddc1-d246-16511a1ff778.jpeg)

（最後のAddtoViewportにターゲットをセットしないと表示されませんので注意しましょう）

７．UIゲージ側のブループリントを開き、ContructとTickに下記のように設定しましょう。

Contructイベント
![SnapCrab_NoName_2017-5-18_23-23-48_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/27a83b89-6ff2-30f7-9d41-867af3d450e9.jpeg)

Tickイベント
![SnapCrab_NoName_2017-5-18_23-29-25_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/f30aba35-65a1-3ee3-9d71-79f48d2c15b6.jpeg)

８．さて、これでひとまず頭の上にゲージが出るはずです。
　コンパイルして表示してみましょう。

![ScreenShot00008.png](https://qiita-image-store.s3.amazonaws.com/0/181347/ee7f0ab2-055a-4491-0953-b4628f798f50.png)

無事表示されました！

・・・おや？画面からキャラクターが消えるとゲージも消えてしまうようです。
![SnapCrab_NoName_2017-5-18_23-39-2_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/7fd230e5-c43b-8c4d-a80b-b1aa28e6a210.jpeg)
↓
![SnapCrab_NoName_2017-5-18_23-39-12_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/8d20e3d6-4944-019a-e888-41cd43353f3a.jpeg)

一度画面外から外れるとTickイベントが来なくなってしまうようですね。

９．強制的にTickを回すために処理を関数化しましょう。

Tickからのつながりを外して、
![SnapCrab_NoName_2017-5-18_23-43-6_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/19523aea-41fb-632b-979f-4eb78d631b74.jpeg)

選択部分を関数に折りたたみます。
![SnapCrab_NoName_2017-5-18_23-44-27_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/077b7ede-75c2-c77d-7b45-246f792a0b2a.jpeg)

１０．関数化したので、必ず回っているはずの敵キャラのTickから呼び出せます。

こんな感じでしょうか
![SnapCrab_NoName_2017-5-18_23-49-4_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/c957b941-7c4a-725d-703d-657efb9038fb.jpeg)

HPBarUIは手順６で作成したWidgitのリファレンスです。
**こんなこともあろうかと**保持していました。
(嘘です。後から追加しました。）

１１．再度プレイしてみましょう。
はい、消えなくなりましたね。
![SnapCrab_NoName_2017-5-18_23-57-45_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/6d003ba1-c5ee-4eed-0dc4-b448574f3392.jpeg)

でも、全部同じ大きさですね。
距離によってサイズの変化がないので違和感があります。

１２．３D座標の2点をスクリーン座標に直したものをもとにサイズを調整する機能を入れましょう。
手を入れるべきはUI側のブループリントです。

頭上の点から適当量離れた2点をスクリーン座標に直します。
でてきたｘ座標の距離を係数で割ってスケール値に利用します。
![SnapCrab_NoName_2017-5-19_0-4-29_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/6e926fae-b1e0-b980-50df-a8513c3c020e.jpeg)

一応、両方とも有効であることを確認して、SetRenderScale関数でWidget全体のスケールに入れます。
（スケール値は極端な値にならないようにClumpしておきます。）
![SnapCrab_NoName_2017-5-19_0-4-46_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/e210ebea-82de-e7d0-94e8-ec9104f5287a.jpeg)

１３．再度プレイしてみましょう。
![SnapCrab_NoName_2017-5-19_0-10-43_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/1102c882-8ec6-ac07-a41d-3da18a98d9ce.jpeg)

それっぽくなりました。
数値はマジックナンバーですが、そんなに厳密な計算が必要ではない箇所なので良しとしておきます。

１４．（補足）壁の向こうでもゲージが見えていたので見えなくしました。

![SnapCrab_NoName_2017-5-19_0-13-57_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/489d9d36-8db5-a38c-8a5e-0dc223d6fe01.jpeg)
位置がバレバレで台無しにならないように、
![SnapCrab_NoName_2017-5-19_0-17-41_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/6b9cdb7f-0818-9070-783a-c5875465edae.jpeg)
関数の頭でWasRecentlyRenderd関数でチェックしてやれば、
![SnapCrab_NoName_2017-5-19_0-15-6_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/9c77973a-8e99-a7a1-5169-d417718eff40.jpeg)
ひとまず、アクターがすべて隠れているときにはゲージも表示されなくなります。（対応として最適ではないですが、煩わしさは若干減るでしょう。）

##パッケージ
https://drive.google.com/file/d/11y-q7ZpAjGJn81LXv8Q-7Qbydto4ASUB/view?usp=sharing

##参考Webページ
◇UMGの３D位置変換や表示について
https://gameprogrammemo.tumblr.com/post/126581883062/umg%E3%81%AEui%E3%82%923d%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E9%A0%AD%E4%B8%8A%E3%81%AB%E8%A1%A8%E7%A4%BA-ue4study

https://forums.unrealengine.com/showthread.php?50130-UMG-Tutorial-Placing-Widgets-Over-Actors-In-Screenspace

http://historia.co.jp/archives/3990

◇カメラに映るアクターについて
https://answers.unrealengine.com/questions/499508/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%8B%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AB%E6%98%A0%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%82%92%E5%88%A4%E5%88%A5%E3%81%97%E3%81%9F%E3%81%84.html