0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

今回は静止状態から動いたときに、静止状態からどの方向に移動しているかを調べます。
例えば、現在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の値をとります

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

スクリーンショット 2023-06-25 154957.png
スクリーンショット 2023-06-25 154947.png

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

ここでライブラリとして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);
    
}

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

ほぼ0度を向いているまま後ろに下がったとき
スクリーンショット 2023-06-25 155755.png

55度ほど右を見いて右に移動したとき(55+90=145)
スクリーンショット 2023-06-25 155813.png

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

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

先ほど求めたもの

コード


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

右に45どの方向を向いて右に走った場合
スクリーンショット 2023-06-25 163936.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?