改訂バージョン: Unreal Engine 4.19 |
例えばシューティングゲームのロックオンマーカーのように、3D空間上に存在するオブジェクトに重ねてHUDを表示したいことがあります。
今回は、3D座標を2D画面上の座標に変換し、HUDに利用する方法をご紹介します。
UE4のHUDを初めて触る方は、HUD入門の記事も合わせてご覧下さい。
UMGを用いる実装についてはActorの3D座標位置にWidgetを表示する方法も合わせてご覧ください。
1.3Dオブジェクトの画面上の座標を取得する
いきなり結論ですが、HUDの「Project」 というノードを使えば、3D座標を画面上の2D座標に変換することが出来ます。
次の例では、プレイヤーキャラの頭上に X の文字が付いてきます。


「Get Player Pawn」でプレイヤーキャラを取得し、「Get Actor Location」で、その3D座標を取得します。
「Project」で2D座標に変換し、「Break Vector」で値をバラしてテキスト表示の座標に使用します。
ここで取得した座標はキャラの基準座標(青いおっさんの場合は体の中心)なので、頭上にくるように少しずらしています。
(本当は骨の位置などを取得して、正確な位置に合わせた方がよいです)
これを利用すれば、ロックオンした敵にマーカーを表示したり、目標物へのガイドをHUDに表示したり、といった機能を実現することが出来ます。
但し、「Project」は、HUDの「Event Receive Draw HUD」の呼び出し中にしか使用出来ません。
それ以外のタイミングで使おうとしても、(0, 0, 0)が返ってくるだけになってしまうので、注意して下さい。
他のタイミングで同じようなコトをしたければ、残念ながら、自力で計算するしかないようです。。。