#初めに
今回初めて株式会社ヒストリア様主催の「第12回UE4ぷちコン」にゲームを応募しました。
残念ながらUnrealFestでの展示にはなりませんでしたが、その中からタイトルにもある通りキャラクターがマウスポインタの方を向く機能(マインクラフトのインベントリとか?)について紹介したいと思います。
タイトル画面が完成!
— Naotsun@C++&UE4勉強中 (@Naotsun_UE) August 26, 2019
寝てるグレイちゃんを起こして戯れる機能をなんとなく実装したけど、これが思いのほか楽しいw#UE4 pic.twitter.com/iG83uVzCjz
#どんな機能を使うのか
まず、この機能を作るのに大まかに2つのUE4の機能を使います。
1つ目はアニメーションブループリントの「Look At」ノードです。こちらについてはalweiさんが詳しく解説されているのでこちらの記事を見て頂ければと思います。
2つ目はPlayerControllerクラスの「ConvertMouseLocationToWorldSpace」関数です。
この記事ではこの関数についてとそれを用いた実装について紹介します。
#ConvertMouseLocationToWorldSpace関数について
この関数はマウスの座標(ScreenPosition)からWorldSpaceの座標を取得する関数です。また、PlayerControllerクラスのメンバ関数なので当然引数にPlayerControllerクラスが必要です。
それではそれぞれの戻り値について見ていきます。World LocationとWorld Directionについては公式のドキュメントに何も書いていなかったので私調べになります。
- World Location (Vector) : 現在有効になっているカメラのワールド座標
- World Direction (Vector) : 現在有効になっているカメラの前方の向き
- Return Value (Bool) : 正常に変換が行えたかの真偽値 (おそらく画面外にマウスポインタが居たりするとfalseになったりするのかも...?)
ライントレースで調べてみるとスクリーンからまっすぐ伸びるわけではなくコーン状に広がっていくのでWorld Directionは画面の真ん中が真正面で端に行くほど傾くようになっているのだと思います。
ざっくりまとめると現在有効なカメラの位置とForwardVectorが取得できると考えてもいいのではないでしょうか。
#作ってみる
簡略化するために今回はアニメーションブループリントに実装します。キャラクターのクラスのTickイベントでも問題ありません。
LookAtLocation変数(Vector)にカメラの位置から正面に300cm進んだ点の座標を格納しています。今回は300にしましたが、カメラとキャラクターの位置で丁度いい値がことなるので調整してみてください。ライントレースなどと同じ要領です。
見る方向は求められたので、あとはLookAtノードの引数に渡すだけです。
#おまけ
初めにの参考動画ではグレイちゃんをクリックで起こして、その後マウスポインタを見るようになっています。WorldSpaceに配置されたアクタをマウスでクリックしたか判定する関数もありましたのであわせてご紹介しておきます。
またまたPlayerControllerクラスの「GetHitResultUnderCursorForObjects」関数を使います。
こちらはLineTraceForObject関数などと同じで判定するObjectTypeを配列で指定してトレースし、HitResultのHitActorで当たったオブジェクトを取得できます。
#最後に
今回ご紹介した「ConvertMouseLocationToWorldSpace」関数と「GetHitResultUnderCursorForObjects」関数は見つけた時にこんな関数もあるのか~と驚かされましたw
また、おまけで紹介した「GetHitResultUnderCursorForObjects」関数がライントレースなどと同じような処理をしてる場合どのくらい遠くまでトレースしてるのかが気になりました。内部実装を確認していないので違う方法で実装されているかもしれませんが...