はじめに
今回は静止状態から動いたときに、静止状態からどの方向に移動しているかを調べます。
例えば、現在45どの方向を向いていて、そこから75度の方向に移動した場合30度回転した方向に動いていることを取得するような感じです。
これを求める理由としては以下になります。
- カメラを回転しない場合に後ろなどに移動しても体が回転しない(バックステップしてるようになる)
今回は以下の手順で調べていく
- ポーンの照準回転を調べる
- プレイヤーの動いている方向を調べる
- プレイヤーがどの向きに移動しているのかを調べる
ポーンの照準回転を調べる
コード
//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の値をとります
ただ、これはワールド座標での回転方向がわかるだけです。
プレイヤーの動いている方向を調べる
ここでライブラリとしてUKismetMathLibraryを使います
UKismetMathLibrary
まだ完全に理解できておらずあいまいな伝え方になるのですが、とりあえず数値を出したり計算するのに便利なライブラリです...!
今回はUKismetMathLibraryよりMakeRotFromXを使っていきます。これは動かしているキャラクターの速度からどの方向に走っているかを-180~180で計算してくれます。
コードです
//キャラクターの速度から回転方向を求める
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);
}
これによって動いている方向を取得することができます!
(もう少しわかりやすく見せれたらよかったのですが...)
プレイヤーがどの向きに移動しているのかを調べる
先ほど求めたもの
コード
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);
}
結果です。
しっかり取得できているのが確認できました!