【Unreal Engine】Spring Arm入門:壁を避ける三人称カメラと肩越し視点を作る

作成: 2026-07-20最終更新: 2026-09-06

UE5のThird Personテンプレートで、カメラの距離・肩越しの位置・体の向きを順に調整。Spring Armが壁を避ける仕組みを図解し、右クリックで滑らかに視点を切り替えるBlueprintを作ります。

キャラクターの背中を映すカメラを、もう少し近づけたい。右へずらして肩越しにしたい。でも、壁際でカメラがめり込んでしまうと、せっかく調整した画面が見づらくなります。

こうした三人称カメラの位置をまとめて扱うのが Spring Arm Component です。キャラクターとカメラの間に「伸び縮みする腕」を挟み、普段は離しておき、壁があれば手前へ寄せます。

この記事では、Third Personテンプレートのカメラを題材に、距離・左右のずれ・体の向きを順に調整します。最後に、右クリックを押している間だけ肩越しへ寄るカメラを作り、壁際や素早い押し直しでも自然につながるか確かめましょう。

キャラクターとカメラの間に腕を挟む、Spring Armの三人称カメラのイメージ

この記事でわかること

  • Spring ArmとCameraの役割、距離とOffsetの使い分け
  • 壁を避けてカメラが近づく仕組み
  • カメラの向きとキャラクターの体の向きを分ける設定
  • Timelineで通常視点と肩越し視点を滑らかに切り替える方法

Sponsored

まずは「腕」と「カメラ」を見つける

練習には、BlueprintのThird Personテンプレートを使います。最初にPlayし、移動キーで歩けること、マウスで視点を回せることを確認してください。この記事では、その入力処理を使ってカメラを調整します。

停止したら、Content Browserで BP_ThirdPersonCharacter を探して開きます。「Components」にある CameraBoom がSpring Arm、そこにつながる FollowCamera がCameraコンポーネントです。

Capsuleの子にMeshとCameraBoom、その子にFollowCameraがある構成と、腕とカメラの役割

CameraBoomはカメラの置き場所を決め、FollowCameraはその位置からゲームの景色を映します。腕は仕組みを理解するための例えで、ゲーム中に棒が描画されるわけではありません。

カメラの追従を確かめるときは、FollowCameraがCameraBoomの子になっているかを見ます。子は、親の位置や向きに合わせて動く部品です。カメラをキャラクター直下に置くだけでは、この腕による位置の調整を受けられません。

FollowCameraの「Transform」は、相対的なLocationとRotationをどちらも (0, 0, 0)、Scaleを (1, 1, 1) にしておきます。「相対的」とは、親の取り付け位置を基準にした値のことです。横へずらすときも、後でCameraBoom側を調整します。

距離と画面内の位置を調整する

距離を変える:Target Arm Length

CameraBoomを選び、「Details」で Target Arm Length を探します。これは 障害物がなければ伸ばしたい腕の長さ です。UEの標準の長さの単位では、400 は400cm、つまり4mです。

まず 400 にしてPlayし、停止してから 180 に変えてもう一度Playします。壁のない場所で比べると、180のほうがカメラが近くなり、キャラクターが大きく映ります。試したら400へ戻しましょう。

Target Arm Lengthが400なら遠く、180なら近くにカメラを置く距離の比較

ここから使う数値は、違いを確かめるための練習用です。テンプレートの初期値と一致しなくても、その値に設定して進められます。

位置をずらす:2種類のOffset

Offset(オフセット) は、基準の位置からどれだけずらすかを表す値です。Spring Armには、ずらす場所が違う2つのOffsetがあります。以下の「腕が向く方向」は、カメラが景色を見る方向だと考えてください。

設定ずらす場所と基準今回の使い方
Socket Offset腕の先端。腕が向く方向を基準にずらすカメラを右へ寄せ、キャラの横に視界を空ける
Target Offset腕の根元。ワールドの軸を基準にずらすカメラの支点を上げる
Socket Offsetは腕の先端を右へずらし、Target Offsetは根元とカメラをワールドの上へ平行に移す

肩越しを試すなら、CameraBoomの Socket Offset(X=0, Y=55, Z=30) にします。カメラが水平なら、右へ55cm、上へ30cmずれます。カメラが右へ動くぶん、キャラクターは画面の左寄りに映ります。

この「右」は、キャラクターの体ではなく、腕が向いている方向から見た右です。カメラだけを回せる設定では、常にキャラクターの右肩の上にいるわけではありません。腕を上下に傾けたときは、Socket Offsetの上下方向も一緒に傾きます。

一方、Target Offset のZを 50 にすると、腕の根元がワールドの上方向へ50cm移ります。「ワールドの上」は、カメラを回しても変わらないゲーム空間の上方向です。これだけで見下ろす向きにはなりません。支点の高さを変えることと、カメラを下へ向けることは別の調整です。

2種類を一度に動かすと効果が混ざるので、片方ずつ試してください。違いが分かったら、両方とも (0, 0, 0) に戻します。

壁があると、カメラはどこまで近づく?

腕を4m伸ばしたいとき、その途中に壁があったらどうするでしょうか。Spring Armの Do Collision Test は、腕の根元からカメラを置きたい位置まで障害物を調べ、壁の手前へカメラを寄せる機能です。

壁があるとカメラの実際の位置が手前へ寄るが、Target Arm Lengthの設定は400のまま

判定には、見えない小さな球を使います。点だけで調べるよりも、カメラの周囲に余裕を持たせて止められます。

CameraBoomの設定練習で使う値意味
Do Collision Testオンカメラの通り道を調べる
Probe Size12判定に使う球の半径。ここでは12cm
Probe ChannelCamera壁に「カメラを止めるか」を問い合わせるときの種類

Cameraチャンネル は、「この物体はカメラを遮るか」を決めるための当たり判定の分類です。壁側がCameraに対して Block なら腕が縮み、Ignore なら素通りします。キャラクター自身を止める設定とは分けて扱えます。

練習用の壁は、レベルに置いたCubeを伸ばして作り、「Collision Presets」を BlockAll にします。自作の壁で効かない場合は、CameraがBlockかに加え、壁に当たり判定の形があるか、Collision EnabledQuery Only または Query and Physics かを確認します。ここでの Query は、物体を物理的に押すのではなく「そこに何かあるか調べる」処理のことです(Collision Profileとチャンネル)。

壁で近づいても、Target Arm Lengthは400のままです。

この値は「伸ばしたい長さ」です。衝突処理が変えるのは、実際にカメラを置く位置。壁がなくなると、再び設定した長さまで伸びられるようになります。

また、カメラを横へ寄せるときにSocket Offsetを使うのは、ずらした先も含めて障害物を調べてもらうためです。FollowCamera自体の相対位置を動かすと、判定した位置と実際のカメラ位置がずれてしまいます。

Sponsored

カメラの向きと体の向きを分ける

マウスで周囲を見回したとき、キャラクターの体は元の方向を向いたままにするのか。それとも、銃を構えたゲームのように視点と一緒に回すのか。この違いは、カメラの距離とは別に決められます。

まず知っておきたいのが Control Rotation です。プレイヤーが「どちらを見たいか」を表す向きで、Third Personテンプレートではマウス入力に応じて更新されます。キャラクターの体の向きとは別に持っています。

カメラだけを回して体の向きを保つ方式と、体もカメラが見ている方向へ合わせる方式の比較

CameraBoomの Use Pawn Control Rotation は、この視点の向きを腕に使う設定です。名前の Pawn はプレイヤーなどが操作する対象を指し、今回のCharacterもその仲間です。

体は移動する方向へ向ける

周囲を見回しながら走るアクションゲーム向けの設定です。今回はこの組み合わせを土台にします。

操作する場所設定
CameraBoomUse Pawn Control Rotationオン
FollowCameraUse Pawn Control Rotationオフ。向きは腕から受け取る
Blueprint上部の「Class Defaults」Use Controller Rotation Yawオフ
Character MovementOrient Rotation to Movementオン
Character MovementUse Controller Desired Rotationオフ

Yaw は左右を向く回転です。体を視点のYawへ直接合わせる設定をオフにし、Character Movementへ「移動しようとする方向に体を向ける」役割を任せます。

Playして、立ち止まったままマウスを動かします。カメラが周囲を回っても、体は元の方向を向いたままです。次に移動キーを押すと、体が移動する方向へ向き直ります。

体も視点と同じ方向へ向ける

TPSのように正面へ狙いをつけたまま横へ移動したい場合は、上の設定から Use Controller Rotation Yaw をオン、Orient Rotation to Movement をオフへ変えます。ほかの項目はそのままです。

これで、マウスで左右を見たときに体も同じ方向へ回ります。カメラの置いてある場所に振り向くのではなく、カメラが見ている方向へ体を合わせる設定です。横移動・後退を自然に見せるには、対応するアニメーションも用意します(Anim BPとBlend Space)。

両方の回転方式を一度に有効にするより、まずはこの2パターンのどちらかで役割を揃えましょう。違いを試したら、実践用にパターンAへ戻します。

自作のPawnでは、チェックを入れるだけでマウス入力が追加されるわけではありません。視点入力から Add Controller Yaw Input / Add Controller Pitch Input などを呼んで、Control Rotationを更新する処理が必要です。テンプレートでは、すでにある入力処理を利用できます。

Camera Lagで追いかけ方を調整する

カメラの位置と向きが決まったら、走り出しや止まり際の動きを見ます。キャラクターとぴったり一緒に動く画面が硬く感じるなら、Camera Lag で少し遅れて追いかける動きにできます。

キャラクターが止まった後、遅れていたカメラが近づいて追いつくCamera Lagのイメージ

CameraBoomの Enable Camera Lag をオンにし、Camera Lag Speed10 で試した後、5 に変えて同じ場所を走ってみてください。5のほうがゆっくり追いつきます。止まった後の景色の動きにも注目すると、違いが見つけやすくなります。

項目調整の考え方
Camera Lag Speed0より大きい範囲では、大きいほど素早く追いつく。0 は例外で、遅れなし
Camera Lag Max Distance位置の遅れをどこまで許すか。まず 100 cmで試す。0 は距離制限なし
Enable Camera Rotation Lag視点の回転も遅らせる設定。最初はオフのまま

Lagを強くすれば遊びやすくなる、というわけでもありません。急に方向を変えたとき、見たい場所が画面に入るまで待たされないかを確かめます。狙いを細かく合わせるゲームでは、回転の遅れを加えないほうが操作に合うこともあります。

次の実践では、視点を切り替える動きだけを比べるため、位置と回転のLagを両方オフに戻します。完成後に、好みに合わせて足してください。

実践:右クリックで肩越し視点へ寄せる

通常時は周囲を広く映し、右クリックを押すと手元に近い視点へ寄ります。離すと元へ戻り、切り替え途中で押し直しても、その位置から折り返すカメラを作ります。

通常視点から右クリックで近づき、キャラクターが画面の左寄りに映る肩越し視点の完成イメージ

図は構図の変化を示すイメージです。今回はカメラの構図を切り替える部分を作ります。体の向きはパターンAのままなので、完成画を比べるときは、前へ少し歩いてキャラクターと視点の向きを揃えてから止まってください。武器の照準や横歩きのアニメーションは、カメラができた後に組み合わせられます。

準備:通常時と肩越し時の値を決める

BP_ThirdPersonCharacter のCameraBoomを、次の通常時の値にします。FollowCameraの相対Location・Rotationは0、回転方式はパターンAです。

項目通常時肩越し時
Target Arm Length400180
Socket Offset(0, 0, 0)(0, 55, 30)
Target Offset(0, 0, 0)変更しない
Do Collision Testオン変更しない
Probe Size / Probe Channel12 / Camera変更しない

右クリックの入力も準備します。

  1. Content Browserの「Input」からInput Actionを作り、IA_Aim と命名します。「Value Type」は Digital (Bool)。押しているかどうかを扱う型です。
  2. テンプレートが実際に使っている Input Mapping Context を開き、IA_Aimに Right Mouse Button を割り当てます。Mapping Contextはキーと操作名の対応表です。IMC_Default など、移動・ジャンプに使っている既存の対応表へ追加します。
  3. 今回はIA_Aimと割り当て側の「Triggers」を空にしておきます。Holdなどの長押し条件は追加しません。

対応表を新しく作った場合は、プレイヤーへの登録も必要です。まずは使用中のものを編集すると、登録漏れを避けられます。入力の作成・登録を確認したい場合は Enhanced Input入門 を参照してください。

手順1:0から1へ進むTimelineを作る

Timeline は、時間に合わせて値を変える仕組みです。ここでは0.25秒かけて、0から1へ進む数値を1つ作ります。0なら通常時、1なら肩越し時、0.5ならその中間です。

  1. CharacterのEvent Graphで右クリックし、「Add Timeline」を選び、名前を AimBlend にします。
  2. ダブルクリックして開き、「Float Track」を追加して Alpha と命名します。Floatは、小数を扱える数値です。
  3. トラック上で右クリックしてキーを2つ追加します。キーは「何秒のとき、どの値にするか」という目印です。それぞれ選択し、Time / Valueを (0, 0)(0.25, 1) にします。
  4. 2つのキーを選び、右クリックで補間を「Linear」にします。キーの間を一定の割合で変える設定です。「Length」は 0.25、「Loop」と「AutoPlay」はオフです。
IA_AimのStartedをPlay、CompletedとCanceledをReverseへ接続し、Alphaを0秒の0から0.25秒の1へ変える

Event Graphへ戻り、右クリックして IA_Aim のイベントを追加します。Started をAimBlendの PlayCompletedReverse につなぎます。Canceled も同じReverseにつないでおきます。

今回のように特別なTriggerを付けないボタンでは、Startedが押し始め、Completedが離したタイミングです。Canceledは入力の判定が途中で取り消された場合の戻り先に使います。

PlayとReverseは、どちらも現在の再生位置から進みます。 Play from Start にすると、戻っている途中で押し直したときに、いったん通常視点の値へ飛んでしまいます。滑らかに折り返したいので、ここではPlayを使います。

手順2:同じAlphaで距離とずれを変える

Alphaは、切り替えの進み具合です。この0から1の値を、腕の長さとSocket Offsetへ変換します。その役を担うのが Lerp です。AとBの間の値を作る計算で、Alphaが0ならA、1ならB、0.5ならちょうど中間を返します。

まず値を計算するノードを2つ作ります。Float版は検索結果では「Lerp」と表示されます。図ではVector版と区別するため、Lerp (Float)と表記しています。ここでは追加の変数を作らず、AとBの入力欄へ数値を直接入れます。

ノードA:通常時B:肩越し時Alpha
Lerp (Float)400180AimBlendのAlpha出力
Lerp (Vector)(0, 0, 0)(0, 55, 30)同じAlpha出力

Vector はX・Y・Zをひと組にした値です。VectorのLerpでは3つの数値が一緒に変わります。Alphaが0.5のとき、腕の長さは290、Socket Offsetは (0, 27.5, 15) になります。

次に、その計算結果をCameraBoomへ設定します。接続図は長さとOffsetの2枚に分けていますが、同じEvent Graphの続きです。

AimBlendのUpdateでSet Target Arm Lengthを実行し、Alphaで400から180の間を計算した値をCameraBoomへ設定する
  1. ComponentsからCameraBoomをEvent Graphへドラッグし、参照ノードを置きます。これは「どの腕を変更するか」を指定するためのものです。
  2. その青い出力からドラッグして Set Target Arm LengthSet Socket Offset を作ります。両方の Target にCameraBoomをつなぎます。
  3. FloatのLerpの Return Value を、Set Target Arm Lengthの値の入力へつなぎます。VectorのLerpのReturn Valueは、Set Socket Offsetの値の入力へつなぎます。
  4. 白い実行線を、AimBlendのUpdate → Set Target Arm Length → Set Socket Offsetの順につなぎます。 Updateは、Timelineが値を更新したタイミングです。
前のSetの実行出力からSet Socket Offsetへ進み、同じAlphaで0,0,0から0,55,30の間を計算して設定する

2枚目の左側にあるAimBlendとSet Target Arm Lengthは、1枚目と同じノードです。新しく作り直さず、Alphaの出力からもう1本引き出し、最初のSetの実行出力を次のSetへつないでください。図中の「①の続き」「②へ続く」は、接続箇所を示す注記です。

白い線は「いつ、どの順で設定するか」、色付きの線は「何の値を使うか」を表します。Targetは操作する腕、Return ValueはLerpが計算した結果です。この2つを取り違えないようにしてください。

Finished は再生が終わったときの出力なので、今回は使いません。毎回の途中の値を反映したいのでUpdateにつなぎます。また、Lerpは値の計算だけをするノードで、白い実行線をつなぐピンはありません。

Compileして保存します。Event Tickに計算を並べる必要はありませんが、Timeline自体は再生中にフレームごとの更新を行っています。

Sponsored

動かして、壁際と押し直しを確かめる

最初は壁のない場所で、次の順に試します。

  1. 前へ歩いてから止まり、右クリックを押し続けます。0.25秒でカメラが寄り、キャラクターが画面の左寄りに映れば成功です。
  2. ボタンを離し、通常時の距離と構図へ戻ることを確かめます。
  3. 短く押して途中で離し、戻り切る前にもう一度押します。端の位置へ飛ばず、今の位置から切り替わるかを見ます。

0.25秒は、通常時から肩越し時まで端から端へ進む時間です。途中で折り返す場合は、残りの区間だけ進むので、毎回0.25秒かかるわけではありません。

続いて、Cubeで作った壁を背にして立ちます。マウスでカメラを回し、壁がキャラクターとカメラの間に入る向きにしてください。壁の近くではカメラが手前へ寄り、壁から離れたり視点を回したりして通り道が空くと、腕が伸び直します。肩越しの状態でも同じように試します。

「狭い通路に入るだけ」では、カメラの通り道に壁が入らず、何も変わらない場合があります。腕が壁をまたごうとする配置で確かめるのがポイントです。

通常と肩越しで腕の長さが変わる様子と、壁が腕をまたぐときにカメラが手前へ寄る様子
症状確認するところ
右クリックで変わらないIA_Aimを使用中のMapping Contextへ追加したか。実行中のCharacterを編集しているか
最後に一瞬で切り替わるFinishedではなくUpdateからSetを実行しているか
距離だけ変わり、横へ寄らない2つ目のSet Socket Offsetまで白い実行線がつながっているか
押し直すと構図が飛ぶPlay from StartではなくPlayにつないでいるか
離しても戻らないCompletedがReverseにつながり、HoldなどのTriggerが付いていないか
壁をすり抜けるDo Collision Test、壁のCameraへのBlock、Queryを含むCollision Enabled、当たり判定の形状を確認
壁には反応するが画面の端がめり込むFollowCameraの相対位置を0に戻し、Probe Sizeを少しずつ大きくして比べる

Probe Sizeを大きくしても、判定そのものが無効な壁には効きません。先に「壁を検出しているか」、次に「壁から十分離れて止まるか」の順で調整すると、原因を追いやすくなります。

おまけ:先に知っておくと良いこと

回転のチェックを入れても上下に動かない

CameraBoomの Inherit Pitch / Yaw / Roll は、上下・左右・傾きの回転を受け継ぐ設定です。今回の練習では3つともオン、TransformのRotationはRelativeのままにします。Use Pawn Control Rotation がオンでも、Inherit側の制限は関係します。

Character側の Use Controller Rotation Pitch / Roll はオフのままにしてください。カメラを上へ向ける操作で、キャラクターの体まで傾ける必要はありません。

一人称に近い視点も試せる

試作なら、Target Arm LengthとSocket Offsetを0にし、腕の根元を目の高さへ移すと一人称に近い配置になります。ただし、三人称用のモデルが視界を塞ぐ場合は、体の見せ方も調整が必要です。

Owner No See は、そのモデルを所有するプレイヤーの視点から隠す設定です。腕だけを見せる本格的な一人称視点まで作るなら、専用モデルやアニメーションも含めて設計すると扱いやすくなります。

距離と画角は別の調整

Camera側の Field of View(画角) は、一度にどれだけ広い範囲を映すかの設定です。腕の長さを変えるとカメラの位置が変わり、画角を変えると同じ位置から映す広さが変わります。ダッシュの速度感を足したいときなどに試せますが、最初は片方ずつ動かして比較しましょう。

まとめ

Spring Armでは、まず「カメラをどこに置きたいか」を距離とOffsetで決めます。その場所へ伸ばせるかをDo Collision Testが調べ、壁があれば実際のカメラ位置を手前へ調整します。

  • Target Arm Length は伸ばしたい長さ。壁で近づいた距離そのものではない。
  • Socket Offset は腕の先端、Target Offset は根元をずらす。
  • カメラと体の向きは分けて考え、移動方向へ向けるか、視点へ合わせるかを選ぶ。
  • 肩越しへの切り替えは、同じAlphaで長さとOffsetを変える。Play / Reverseなら途中でも折り返せる。

カメラの構図ができたら、歩く・止まる・急に振り向く・壁際で操作する、の順に試してみてください。静止画で好きな位置と、操作しながら見やすい位置の両方を探すと、自分のゲームに合うカメラへ近づけます。

参考:Spring ArmのAPITimelineの再生・逆再生Enhanced InputCollision Response Reference

Unreal Engine このセクションのノート98