76.

UE5のSpawnActorで回転が反映されない原因と対処方法

編集

Unreal Engine 5(UE5)の「Spawn Actor from Class」ノードで Spawn Transform の Rotation を設定したのに反映されない場合、ほとんどはスポーンしたアクター自身が「生成直後に別の回転で上書きしている」ことが原因です。Spawn Transform の Rotation はあくまでアクターのルートコンポーネントのワールド回転を初期化する値にすぎず、Pawn の制御回転・MovementComponent・BeginPlay や Construction Script の処理・ルートと子コンポーネントの構成といった要素が、その初期回転をスポーン後に書き換えてしまうケースが大半です。つまり「Spawn ノードに正しい値を渡しているのに見た目が変わらない」のではなく、「渡した値が一瞬で別の値に上書きされている」と捉えると、原因の切り分けがしやすくなります。

本記事では、UE5 で SpawnActor の Rotation が反映されない主な原因と、それぞれに対する具体的な対処を整理します。検証は UE5 系の標準的な挙動を前提としていますが、コンポーネント構成やバージョンによって細部が異なる場合があるため、最終的な判断は使用中のバージョンの公式ドキュメントとエディタ上の実機確認をおすすめします。

この記事の要点
  • Spawn Transform の Rotation は「ルートコンポーネントの初期ワールド回転」を設定するだけで、スポーン後に上書きされると反映されないように見える。
  • 代表的な上書き元は、Pawn の制御回転(bUsePawnControlRotation)、MovementComponent(OrientRotationToMovement など)、BeginPlay / Construction Script 内の回転設定。
  • ルートが SceneComponent で、メッシュなど子コンポーネント側にローカル回転やピボットのずれがあると、アクターは正しく回っていても見た目がずれて見える。
  • 確実に向きを固定したい場合は、スポーン後に Set Actor Rotation を明示的に呼ぶのが最も再現性の高い対処。
  • 原因の特定には、まずどの処理が回転を書き換えているか(コンポーネント設定かイベント処理か)を切り分けることが重要。

そもそも Spawn Transform の Rotation は何を設定しているか

「Spawn Actor from Class」ノードの Spawn Transform に渡した Rotation は、生成されるアクターのルートコンポーネントのワールド回転の初期値として使われます。重要なのは、これがあくまで生成タイミングでの初期化であり、その後アクター内部で実行される処理は一切考慮しない、という点です。したがって、スポーン直後に回転を変更する仕組みがアクター側に存在すると、Spawn Transform で指定した値はすぐに別の値へ置き換えられます。

「正しい値を渡しているのに反映されない」と感じる場面の多くは、この上書きが原因です。以下では、上書きを引き起こす代表的な要素を順に見ていきます。

原因1:Pawn の制御回転(Control Rotation)による上書き

スポーンする対象が Pawn や Character の場合、制御回転(Control Rotation)が関係していることがあります。カメラ用の SpringArm(Camera Boom)やカメラコンポーネントには「Use Pawn Control Rotation」という設定があり、これが有効だと、そのコンポーネントの向きは Spawn Transform の Rotation ではなく Controller の制御回転に追従します。結果として、アクター本体の回転を指定しても、カメラやそれに紐づく見た目が指定どおりに向かない、という状況が起こり得ます。

また、Pawn をスポーンしたうえで Controller に Possess させる構成では、Possess のタイミングや AI 側の挙動によって向きが上書きされることもあります。スポーン時に意図した向きを保ちたい場合は、Spawn ノードに渡す Rotation と、Controller 側に設定する制御回転(Get Control Rotation で取得できる値)の整合を取る、もしくはスポーン後に明示的に向きを設定する方法が確実です。

原因2:MovementComponent が向きを制御している

CharacterMovementComponent や FloatingPawnMovement などの MovementComponent を持つアクターでは、移動に応じてアクターの向きを自動制御する設定が原因になることがあります。代表的なのが CharacterMovementComponent の Orient Rotation to Movement(移動方向にアクターを向ける)や、Pawn 側の Use Controller Rotation Yaw といった設定です。これらが有効だと、スポーン直後に移動入力や制御回転に基づいて Yaw が更新され、Spawn Transform で指定した回転が短時間で上書きされます。

この種の上書きは、スポーン直後ではなく最初の Tick 以降に発生することが多いため、「スポーンした瞬間は合っているのに、すぐ向きが変わる」という症状として現れます。意図した向きを維持したい場合は、対象の MovementComponent や Pawn の回転制御フラグを見直し、必要であれば該当設定を無効化するか、向きを固定する処理を別途用意します。

原因3:BeginPlay や Construction Script での回転設定

アクターのブループリント内で、BeginPlayConstruction Script、あるいは初期化系のイベントで Set Actor Rotation や Set Relative Rotation を呼んでいると、当然ながらその値が優先されます。Spawn Transform の Rotation は生成時に設定されますが、BeginPlay はその直後に実行されるため、BeginPlay 内で固定値や別ロジックの回転を設定していれば、Spawn 側の指定は上書きされます。

特に、テンプレートやサンプルを流用したブループリントでは、意図せず初期回転をリセットする処理が残っていることがあります。まずは対象アクターの BeginPlay と Construction Script を確認し、回転を設定しているノードがないかをチェックしてください。回転を扱う処理が見つかった場合は、それが Spawn Transform の値を尊重する設計になっているか(たとえば Get Actor Rotation を基準にしているか、固定値で上書きしていないか)を確認します。

原因4:ルートと子コンポーネントの構成・ピボットのずれ

アクターの回転自体は正しく適用されているのに、見た目だけがずれて見えるケースもあります。これは Spawn の問題ではなく、ルートコンポーネントと子コンポーネントの相対関係に起因します。

ブループリントのルートが SceneComponent(DefaultSceneRoot など)で、その子にメッシュコンポーネントがぶら下がっている構成を考えます。Spawn Transform の Rotation はルートのワールド回転を設定しますが、子メッシュにローカルの相対回転(Relative Rotation)が設定されていたり、メッシュ自体のピボット(原点)が中心からずれていたりすると、ルートを回しても見た目の向きや位置が想定とずれます。アクターの回転は数値上は正しくても、メッシュのアセット側のオフセットがそのまま反映されるためです。

この場合の確認ポイントは次のとおりです。

  • 子メッシュコンポーネントの Relative Rotation が 0 になっているか(意図しない相対回転が入っていないか)。
  • メッシュアセットのピボットが想定した位置(多くは中心や底面)にあるか。ずれている場合は DCC ツール側で原点を調整するか、子コンポーネントの相対トランスフォームで補正する。
  • ルートを SceneComponent にしている場合と、メッシュ自体をルートにしている場合とで、回転の基準が変わる点を理解しておく。

最も確実な対処:スポーン後に Set Actor Rotation で明示する

原因の切り分けに時間がかかる場合や、何が上書きしているか分からない場合に、最も再現性が高いのがスポーン直後に明示的に向きを設定する方法です。「Spawn Actor from Class」の戻り値(生成されたアクター)に対して、Set Actor Rotation を呼び、意図した回転を上書きします。

// 処理の流れ(Blueprint のイメージ)

Spawn Actor from Class → 戻り値(Return Value) を取得

→ Set Actor Rotation (Target = 戻り値, New Rotation = 適用したい回転)

ただし、これはあくまで「生成時点で一度向きを設定し直す」対処であり、原因1や原因2のように毎フレーム向きを制御している仕組みが存在する場合は、Set Actor Rotation を一度呼んでもすぐに再び上書きされます。その場合は、根本原因である MovementComponent や制御回転の設定そのものを見直す必要があります。Set Actor Rotation は万能な解決策ではなく、「上書き処理が一度きりのケース」に有効な対処であると理解しておくと、無駄な試行錯誤を減らせます。

原因切り分けの進め方

複数の原因が重なっていることもあるため、次の順序で切り分けると効率的です。

確認ステップ確認内容
1. 値の確認Spawn Transform に渡している Rotation が本当に意図した値か(Make Rotator の入力やピン接続を確認)。
2. タイミングの確認スポーン直後は合っているか。直後は合っていて後からずれるなら MovementComponent や制御回転が疑わしい。
3. イベントの確認対象アクターの BeginPlay / Construction Script に回転を設定する処理がないか。
4. 構成の確認ルートと子コンポーネントの相対回転、メッシュのピボットにずれがないか。
5. 上書きの確認Set Actor Rotation を直後に追加して直るか。直るなら一度きりの上書き、直らないなら継続的な制御が原因。

落とし穴と注意点

つまずきやすいポイント
  • スポーン直後の上書き処理を見落とす:BeginPlay や最初の Tick で向きが変わる構成では、Spawn Transform の値は一瞬で消える。スポーン直後と数フレーム後の向きを比べて切り分ける。
  • Set Actor Rotation を呼べば必ず直ると思い込む:毎フレーム制御している MovementComponent や制御回転が原因の場合は、一度設定し直してもすぐ戻る。根本設定を見直す。
  • アクターの回転とメッシュの見た目を混同する:数値上は正しく回っていても、子メッシュの相対回転やピボットのずれで見た目だけがずれることがある。アクター回転とメッシュのローカル回転を分けて確認する。
  • Pawn の制御回転を考慮しない:カメラやコントローラに紐づく向きは Spawn Transform ではなく制御回転に従う場合がある。Pawn 系は制御回転との整合を意識する。
  • Spawn Collision Handling による位置調整と混同する:コリジョン処理で調整されるのは主に位置であり、回転が反映されない主因とは限らない。設定変更で直らない場合は別の原因を疑う。

よくある質問(FAQ)

Q1. スポーン直後は正しい向きなのに、すぐ別の方向を向いてしまいます。原因は?

MovementComponent の Orient Rotation to Movement や、Pawn の Use Controller Rotation Yaw など、毎フレーム向きを制御する設定が有効になっている可能性が高いです。これらは最初の Tick 以降に回転を更新するため、スポーン時の向きが上書きされます。該当する設定を見直すか、向きを固定する仕組みを別途用意してください。

Q2. Set Actor Rotation をスポーン直後に呼んでも向きが戻ってしまいます。

回転を毎フレーム制御している処理が存在する場合、一度設定し直してもすぐ上書きされます。この場合は Set Actor Rotation を繰り返すのではなく、上書き元(MovementComponent の回転制御や制御回転の追従など)の設定そのものを無効化・調整するのが根本的な対処です。

Q3. アクターの回転値は正しいのに、見た目だけが斜めにずれています。

アクター(ルート)の回転は正しくても、子メッシュコンポーネントに相対回転が入っていたり、メッシュアセットのピボットが中心からずれていると、見た目がずれます。子コンポーネントの Relative Rotation を確認し、必要ならアセットのピボットを調整するか、相対トランスフォームで補正してください。

Q4. どのバージョンの UE5 でも同じ挙動ですか?

Spawn Transform がルートのワールド回転を初期化するという基本的な仕組みは共通ですが、コンポーネントのデフォルト設定や細かな挙動はバージョンやテンプレートによって異なる場合があります。断定せず、使用中のバージョンの公式ドキュメントとエディタ上での実機確認を併用することをおすすめします。

まとめ

UE5 の SpawnActor で Rotation が反映されない場合、その多くは「Spawn Transform に渡した値が間違っている」のではなく、「生成後にアクター側の処理が回転を上書きしている」ことが原因です。Pawn の制御回転、MovementComponent による向きの制御、BeginPlay や Construction Script での回転設定、そしてルートと子コンポーネントの構成という4つの観点で切り分ければ、ほとんどのケースで原因を特定できます。まずはスポーン直後と数フレーム後の向きを比較し、一度きりの上書きであれば Set Actor Rotation を、継続的な制御であれば原因コンポーネントの設定見直しを行うのが確実な対処です。挙動の最終確認は、使用中のバージョンの公式ドキュメントとエディタ上の検証で行ってください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ