はじめに
よくあるTPS視点RPGのプレイヤーキャラクターを移動させると進行方向を自動で向いてくれる実装のメモです。
実装環境
UE5 EarlyAccess (UE5の機能は使いません)
ThirdPersonTemplateを使用
実現したいもの
- 左スティックでキャラクターが移動する。
- カメラも進行方向を映すように自動で回転する。
ThirdPersonTemplateの状態
ThirdPersonTemplateの実装では、左スティックでキャラクターは移動しますがカメラは回転せずに付いてきます。
進行方向を見るためには、左スティックで移動操作をしながら右スティックorマウスでカメラを操作する必要があります。
この操作を左スティック一つで行えるようにしていきましょう。
実装方法の検討
通常のスティック操作によるカメラ回転
- 通常、進行方向を向く挙動をするには左スティックで移動しながら右スティックでカメラを回転させます。
- 左スティックで真正面に進む場合は回転させません。左右への移動量がある場合にカメラを回転させています。
- 左スティックの水平成分をカメラの回転に割り当てることで、左スティック一つでキャラクターの移動と進行方向を向くカメラの挙動が実装できそうです。
自動カメラ回転の計算方法
- 計算しやすくするため垂直時にはカメラの回転量を0とし、左右の時には1となるような計算式を考えます。
- 進行方向のベクトルとカメラの右方向ベクトルと内積を取ることで、垂直時には0、平行時には1(-1)の結果が取得できます。
- これにカメラの回転速度をかけることで左スティックだけで移動とカメラの回転が実現できそうです。
実装手順
ThirdPersonCharacterのブループリントには既にキャラクターの移動に関するノードが組まれています。
Tickイベントを実装しベクターを足し合わせ進行方向のベクトルを求めます。
AddMovementInputでキャラクターの移動を行った後、進行方向ベクトルとカメラの右ベクトルから内積を計算しカメラの回転量を求めます。
求めた回転量をAddControllerYawInputにわたすことで、進行方向を向くようにカメラが回転してくれます。
MapRangedClampを使用しているのは、左スティックの水平成分が一定値を超えた場合にカメラが回転しはじめるようにするためです。
完成したもの
おわりに
色々ゲームの移動挙動を観察すると、進行方向にカメラが回転し始めるのがしばらく移動してからだったり、歩いてる時と走っている時で回転速度が違ったり、TPS視点でもアクションゲームでは回転補正がなかったり、似たようなゲームでもそれぞれ挙動が異なっていて何を考えてこの挙動を仕様にしたのか考えるのも面白かったです。