1
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.

【UE4】Default PawnはPlayer StartのPitchとRollを無視してSpawnされるメモ

Last updated at Posted at 2022-02-13

対象バージョンはUE4.27.2です。

あらかじめPlayer Startを床面に対して斜めに傾けておき、ゲーム開始時にDefault Pawn(=Player Pawn)を斜めにSpawnさせようとしたがうまく行かなかった。これを調べた結果のメモを残しておく。

何が起きたか?

あらかじめPlayer Startを斜めに傾けておく。
つまりPlayer StartのRotationのPitch(Y回転)やRoll(X回転)にゼロ以外の角度を入れておく。
image.png
ビューポートで見るとこんな感じ(↓)になる。
image.png

このPlayer Startと全く同じ位置・回転を持つDefault Pawn(=Player Pawn)をゲーム開始時にSpawnしたい。
Default Pawn(=Player Pawn)の位置・回転が分かりやすいように、以下のようなPawnを作った。
image.png
Arrow Componentを使って座標軸を持たせただけである。
※なおArrow ComponentのHidden in Game値はデフォルトでTrueなので、あらかじめFalseにしておくことを忘れずに。

次に、このPawnをGame ModeのDefault Pawnに設定する。
image.png

この状態でゲームを実行、[F8]キーなどでEjectをしてDefault Pawn(=Player Pawn)の回転を確認するとこう(↓)なってしまう。
image.png
分かりづらいかもしれないが、

  • Z軸(青)が真上を向いている方がDefault Pawn(=Player Pawn)である。
  • 選択されている方がPlayer Startで、X軸(赤)がイスの方向を向いている。

つまり、Default Pawn(=Player Pawn)がPlayer Startの回転を反映していないのである。
詳細パネルでそれぞれのRotationの値を確認すると、どうやらX回転(Roll)とY回転(Pitch)がゼロクリアされているようだ。

X回転
Roll
Y回転
Pitch
Z回転
Yaw
Player Start 10.0 -30.8 -143.3
Default Pawn 0.0 0.0 -143.3

これはそういう仕様だろうか?

エンジンソース

エンジンソースを見てみると、Player StartのYaw回転(Z回転)のみしか使っていないコードが見つかる。コメントにも「Don't allow pawn to be spawned with any pitch or roll (PitchやRollを使ってPawnをSpawnしない)」と明記されている。
ソース内でも、StartSpot(=Player Start)のYaw回転しかコピーしていない。
…ということでこれは仕様である。

GameModeBase.cpp (1699行目,UE4.27.2)
APawn* AGameModeBase::SpawnDefaultPawnFor_Implementation(AController* NewPlayer, AActor* StartSpot)
{
    // PitchやRollを使ってPawnをSpawnしない
    FRotator StartRotation(ForceInit);
    StartRotation.Yaw = StartSpot->GetActorRotation().Yaw;
    // 以下略:上記StartRotationとStartSpotのLocationを使ってDefaultPawnをSpawnしている。
}

もちろん「たいていの場合は」プレイヤの初期回転にPitchやRollを入れることはないので、この仕様で困ることはめったにないだろう…とは思う。

対処方法

SpawnDefaultPawnFor_Implementation()は末尾に"_Implementation"がついていることから推測できるように、この関数はBlueprint Native Eventである。

GameModeBase.h (434行目,UE4.27.2)
UFUNCTION(BlueprintNativeEvent)
APawn* SpawnDefaultPawnFor(AController* NewPlayer, AActor* StartSpot);

なので、この関数はBlueprintでオーバーライドできる。
GameModeBaseを継承したBlueprintを作ってSpawnDefaultPawnFor関数をオーバーライドすればすればよい。例えば次のようにすれば、Player Startと全く同じRotationを持ったDefault Pawn(=Player Pawn)がSpawnできる。
image.png
要するに、余計なことは何も行わずに素直にSpawnするだけである。
これを実行すると、SpawnされたPawnとPlayerの回転が一致していることが確認できる。
image.png

追記

なお、Player Controllerの回転値も似たような制約を受けている。ただしRoll(X回転)だけ。
これが行われるのは2か所で、いづれもゲームの初期化時(最初のBegin Playより前)である。

  • AGameModeBase::InitNewPlayer()内 (GameModeBase.cpp 753行目, UE4.27.2)
    • Player ControllerがSpawnされた後、Player StartのRoll(X回転)だけゼロにした回転を SetInitialLocationAndRotation()でセットされている。
  • AGameModeBase::FinishRestartPlayer()内 (GameModeBase.cpp 1320行目, UE4.27.2)
    • Default Pawn(=Player Pawn)がSpawnされた後、Spawnの最終処理として行われる。
    • Player ControllerのControl Rotationとして、Default Pawn(=Player Pawn)のワールド回転のRoll(X回転)だけゼロにした回転をSetControlRotation()でセットされている。

以上です。

1
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
1
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?