プレイヤーがどの向きに移動しているのかを調べる(Unreal Engin) 

# はじめに

今回は静止状態から動いたときに、静止状態からどの方向に移動しているかを調べます。
例えば、現在45どの方向を向いていて、そこから75度の方向に移動した場合30度回転した方向に動いていることを取得するような感じです。

これを求める理由としては以下になります。
* カメラを回転しない場合に後ろなどに移動しても体が回転しない（バックステップしてるようになる）


今回は以下の手順で調べていく

* ポーンの照準回転を調べる
* プレイヤーの動いている方向を調べる
* プレイヤーがどの向きに移動しているのかを調べる

# ポーンの照準回転を調べる

コード


```php

//Pawn->GetBaseAimRotation()
FRotator AimRotation = ShooterCharacter->GetBaseAimRotation();


FString MovementRotationMessage =
    FString::Printf(
        TEXT("Movement Rotation: %f"),
        MovementRotation.Yaw);

if (GEngine)
{
    GEngine->AddOnScreenDebugMessage(1, 0.f, FColor::White, OffsetMessage);
}

```

照準回転をこれで調べることができます。
0から右周り180度は0~180の値をとり、0から左回り180度は0~-180の値をとります

ただ、これはワールド座標での回転方向がわかるだけです。

![スクリーンショット 2023-06-25 154957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/61d337d3-7591-6f11-7020-e0960cce8299.png)
![スクリーンショット 2023-06-25 154947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/d057319b-cc91-d5b1-47c7-016fd43a4b52.png)

# プレイヤーの動いている方向を調べる

ここでライブラリとしてUKismetMathLibraryを使います

### UKismetMathLibrary

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Kismet/UKismetMathLibrary/

まだ完全に理解できておらずあいまいな伝え方になるのですが、とりあえず数値を出したり計算するのに便利なライブラリです...!

今回はUKismetMathLibraryよりMakeRotFromXを使っていきます。これは動かしているキャラクターの速度からどの方向に走っているかを-180~180で計算してくれます。

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Kismet/UKismetMathLibrary/MakeRotFromX/

コードです

```php

//キャラクターの速度から回転方向を求める
FRotator MovementRotation =
			UKismetMathLibrary::MakeRotFromX(
				ShooterCharacter->GetVelocity());

//ヨーの軸のみデバッグメッセージとして出力
FString MovementRotationMessage =
			FString::Printf(
				TEXT("Movement Rotation: %f"),
				MovementRotation.Yaw);

if (GEngine)
{
    GEngine->AddOnScreenDebugMessage(1, 0.f, FColor::White, MovementRotationMessage);
    
}

```

これによって動いている方向を取得することができます！


ほぼ0度を向いているまま後ろに下がったとき
![スクリーンショット 2023-06-25 155755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/1eedd58f-66e3-710b-b22b-e8562425f40a.png)


55度ほど右を見いて右に移動したとき(55+90=145)
![スクリーンショット 2023-06-25 155813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/811f292a-502b-550c-3825-9c8f88c505ba.png)

(もう少しわかりやすく見せれたらよかったのですが...)


# プレイヤーがどの向きに移動しているのかを調べる

先ほど求めたもの

コード
```php

FRotator AimRotation = ShooterCharacter->GetBaseAimRotation();

		

FRotator MovementRotation =
    UKismetMathLibrary::MakeRotFromX(
        ShooterCharacter->GetVelocity());


//NormalizedDeltaRotator(a,b)はa-bを正規化した値を返します。
//.hでfloat型として定義しています。
MovementOffsetYaw = UKismetMathLibrary::NormalizedDeltaRotator(
    MovementRotation,
    AimRotation).Yaw;


FString OffsetMessage =
    FString::Printf(
    TEXT("Movement Offset Yaw: %f"),
    MovementOffsetYaw);

if (GEngine)
{
    GEngine->AddOnScreenDebugMessage(1, 0.f, FColor::White, OffsetMessage);
}

```


結果です。

右に45度の方向を向いてまっすぐ走った場合
![スクリーンショット 2023-06-25 163924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/fde972d1-48f9-f8f4-88ac-6c97b7c4c97c.png)


右に45どの方向を向いて右に走った場合
![スクリーンショット 2023-06-25 163936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/590db159-9825-9bf0-b128-1b91ece223af.png)


しっかり取得できているのが確認できました！