【Unreal Engine】Spring Armで作る三人称カメラ:追従・壁ぬけ回避・肩越し視点

作成: 2026-07-20

UE5の三人称カメラをSpring Armで図解。Target Arm LengthとSocket Offsetの違い、Do Collision Testが壁ぬけを防ぐ仕組み、そして初心者が必ず混乱する「体の向き」と「カメラの向き」を分ける3つのフラグまで。

Third Personテンプレートのキャラクターは、マウスを動かすとカメラがぐるりと回ります。壁に近づいても、カメラは壁の中へ入っていきません。ところが自分でPawnにCameraコンポーネントを1つ足しただけのキャラクターを作ると、カメラは頭に貼りついたまま動かず、壁があれば平気ですり抜けます。

この差を作っているのが Spring Arm Component です。カメラを直接キャラに付けるのではなく、伸び縮みする棒の先に付ける、という部品です。この記事では、Spring Armの各パラメータが何を決めているか、壁ぬけを防ぐ仕組み、そして「体の向き」と「カメラの向き」を分ける3つのフラグを解説します。

キャラクターの背後に伸びた棒の先にカメラが付いているイメージ

この記事でわかること

  • Spring Armは 伸び縮みする棒 。カメラは棒の先にぶら下がっている
  • Target Arm Length / Socket Offset / Target Offset の違い
  • Do Collision Test が壁ぬけを防ぐ仕組みと、効かないときの原因
  • 初心者が必ず混乱する 回転の主導権を持つ3つのフラグ
  • 実践: 肩越し視点へ切り替わるカメラを作り、狭い通路でも壁にめり込ませない

Sponsored

Spring Armは伸び縮みする棒

BP_ThirdPersonCharacter のコンポーネントタブを開くと、カメラは次のようにぶら下がっています。

CapsuleComponentの下にCameraBoom(Spring Arm)があり、そのさらに下にFollowCamera(Camera)がぶら下がる親子構造の図
CapsuleComponent(本体)
├─ Mesh(見た目)
└─ CameraBoom(Spring Arm Component)
   └─ FollowCamera(Camera Component)

CameraBoom が棒、FollowCamera がその先に付いたカメラです。役割ははっきり分かれています。

コンポーネント担当していること
Spring Armカメラを どこに置くか 。距離・オフセット・回転・障害物の回避
Cameraそこから どう写すか 。画角(Field of View)や被写界深度

カメラの位置に関する調整は、ほぼすべてSpring Arm側で行います。Camera側で位置を動かしたくなったら、たいていSpring Armの設定を見落としています。

「Spring(バネ)」という名前は、この棒が 固い棒ではなく、状況に応じて伸び縮みする ことから来ています。障害物があれば縮み、キャラが急に動けば少し遅れて追いつく。この2つがSpring Armの本体です。

Sponsored

位置を決める3つのオフセット

Spring Armの詳細パネルには、位置に関わる項目が3つ並んでいます。名前が似ているため混同されがちですが、効く場所がまったく違います。

Target Arm Lengthが棒の長さ、Socket Offsetがカメラ側のずらし、Target Offsetが注視点側のずらしであることを、キャラと棒とカメラの位置関係で示した図
項目既定値効く場所使いどころ
Target Arm Length300.0棒の長さそのもの引きの強さ。近づける/遠ざける
Socket Offset(0, 0, 0)カメラ側 の端をずらす。棒と一緒に回る肩越し視点。横にずらす
Target Offset(0, 0, 0)根元側 をずらす。ワールド基準で回らない注視点を上げる。頭より上を見る

Third Personテンプレートでは Target Arm Length400.0 に設定されています。クラス既定の300より少し引いた画になっています。

2つのOffsetの違いは、 カメラを回したときに一緒に回るかどうか です。

  • Socket Offset はカメラと一緒に回ります。Yに 60 を入れると、カメラを右へ回しても左へ回しても「キャラの右肩の上」に居続けます。これが肩越し視点です
  • Target Offset は回りません。Zに 50 を入れると、カメラの向きに関係なく常に「50cm上を見る」状態になります

見下ろし気味の画にしたいときは Target Offset のZを上げ、TPSのような肩越しにしたいときは Socket Offset のYを使う、と覚えると迷いません。

Do Collision Testが壁ぬけを防ぐ

Do Collision Test は既定で オン です。この1つのチェックが、三人称カメラで最も面倒な問題を解決しています。

壁に近づいたとき、Do Collision Testがオフではカメラが壁の中へ入り、オンでは棒が縮んでキャラの手前に寄ることを示した対比図

仕組みは単純です。Spring Armは毎フレーム、 根元からカメラの位置へ向かって球を1つ飛ばして います。途中で何かにぶつかったら、その手前までしか腕を伸ばしません。

項目既定値意味
Do Collision Testオン障害物のチェックをするかどうか
Probe Size12.0飛ばす球の半径。大きいほど壁から離れて止まる
Probe ChannelCameraどのチャンネルで判定するか

ここで見落としやすいのが Probe Channel です。判定に使うのは通常のコリジョンではなく Camera チャンネル なので、 壁側のCollision Presetで Camera が Block になっていないと、カメラは素通りしますBlockAllBlockAllDynamic なら問題ありませんが、自作のプリセットを使っている場合は確認してください(→ Collision Profileの記事)。

逆に、 カメラだけをすり抜けさせたい物 もあります。手前の草、柵、透明な結界などです。こうしたアクタは、Collision Presetで Camera だけ Ignore にすると、プレイヤーとはぶつかったままカメラには無視されます。

Probe Size を大きくすると、壁のかなり手前でカメラが止まるようになります。薄い壁を貫通して向こう側が見えてしまうときは、まずここを 12 から 20 前後まで上げてみてください。

Sponsored

回転の主導権を持つ3つのフラグ

ここが三人称カメラで最大のつまずきどころです。UEには キャラの体を回すものカメラを回すもの が別々に存在し、しかも設定場所が3箇所に散っています。

Spring ArmのUse Pawn Control Rotation、PawnのUse Controller Rotation Yaw、CMCのOrient Rotation to Movementが、それぞれカメラと体のどちらを回すかを矢印で示した図
フラグ設定場所回すもの
Use Pawn Control RotationSpring Armカメラ をコントローラの向き(マウス)に合わせる
Use Controller Rotation YawPawn(Characterの詳細パネル) をコントローラの向きに合わせる
Orient Rotation to MovementCharacter Movement を進行方向に向ける

下の2つはどちらも「体」を回します。 両方オンにすると互いに打ち消し合い、キャラがぶるぶる震えたり、進行方向を向かなくなったりします。 必ずどちらか一方だけをオンにしてください。

組み合わせは実質2通りです。

パターンA:体は進む方を向く(アクション向け)

フラグ
Spring Arm: Use Pawn Control Rotationオン
Pawn: Use Controller Rotation Yawオフ
CMC: Orient Rotation to Movementオン

Third Personテンプレートの既定がこれです。マウスでカメラをぐるりと回してもキャラは正面を向いたままで、Wを押すと カメラが向いている方向へ走り出し、体もそちらへ向き直ります 。アクションゲームやアクションRPGの標準構成です。

向き直る速さは、CMCの Rotation Rate のZ(Yaw)で決まります。テンプレートは 500.0 です。

パターンB:体は常にカメラの方を向く(TPS向け)

フラグ
Spring Arm: Use Pawn Control Rotationオン
Pawn: Use Controller Rotation Yawオン
CMC: Orient Rotation to Movementオフ

カメラを回すと体も一緒に回ります。横入力を入れると、キャラは体を正面に向けたまま横歩き(ストレイフ)します。銃を構えるTPSや、ロックオン中の近接戦闘がこれです。

パターンBに切り替えたときは、アニメーション側にも横歩きと後退のモーションが要ります。方向つきの移動アニメーションはBlend Spaceで扱います(→ Anim BPの記事)。

補足: Spring Armの Use Pawn Control Rotation は、クラス既定では オフ です。テンプレートの CameraBoom ではオンに変更されています。自分でPawnへSpring Armを追加した場合、ここをオンにしないとマウスでカメラが回りません。

Camera Lagで追従を柔らかくする

既定のSpring Armは、キャラの動きに1フレームの遅れもなく追従します。正確ではありますが、動きが硬く見えます。

Camera Lagがオフのとき棒がキャラに完全追従し、オンのとき少し遅れて滑らかに追いつくことを示した図
項目既定値効果
Enable Camera Lagオフ位置の追従を遅らせる
Camera Lag Speed10.0追いつく速さ。小さいほどゆったり
Enable Camera Rotation Lagオフ回転の追従を遅らせる
Camera Rotation Lag Speed10.0同上
Camera Lag Max Distance0.0遅れの上限距離。0は無制限

Enable Camera Lag をオンにして Camera Lag Speed5.0 まで下げると、走り出しでカメラがわずかに置いていかれ、止まるとゆっくり追いつきます。ほんの数フレームの遅れですが、映像としての気持ちよさが変わります。

この Lag Speed は、Blueprintの VInterp To / RInterp ToInterp Speed と同じ考え方です(大きいほど速く追いつき、近づくほど減速する)。自分で同じ追従を組みたくなったら 回転と補間の基礎 が使えます。

ただし 回転のラグは付けすぎると酔います 。マウスの動きと画面のずれは、位置のずれよりずっと敏感に感じ取られるためです。まずは位置のラグだけをオンにして、回転はそのままにしておくのが安全です。

高速で移動するキャラでは、Camera Lag Max Distance100 程度を入れておくと、遅れが際限なく広がるのを防げます。

Sponsored

実践:肩越し視点へ切り替わるカメラ

TPSで銃を構える瞬間、アクションRPGで敵にロックオンする瞬間、ホラーゲームで狭い廊下に入る瞬間。 ジャンルは違っても「寄って、肩越しにする」という動きは同じ です。ここでは、ボタンを押している間だけカメラが肩越しへ寄る仕組みを作り、狭い通路でも壁にめり込まないことを確認します。

完成形

キーを押すとカメラが0.25秒かけて手前へ寄り、キャラの右肩の上へずれます。離すと元の位置に戻ります。その状態で幅の狭い通路に入っても、カメラは壁の中に入りません。

通常視点から肩越し視点へ寄る前後比較と、狭い通路で棒が縮んでカメラが壁の手前に留まる様子を示した図

再現条件

Third PersonテンプレートContent/ThirdPerson/Blueprints/BP_ThirdPersonCharacter を開きます。コンポーネントタブで CameraBoom を選んだときの初期状態は次のとおりです。

パラメータ初期値
Target Arm Length400.0
Socket Offset(0, 0, 0)
Do Collision Testオン
Probe Size12.0
Use Pawn Control Rotationオン

レベル側には、幅 150cm ほどの通路を作っておきます。床のCubeを細長く伸ばし、両側にCubeで壁を立てるだけで十分です。壁のCollision Presetは既定の BlockAll のままにします。

Blueprintには次の変数を追加します。

変数名既定値用途
DefaultArmLengthFloat400.0通常時の腕の長さ
AimArmLengthFloat180.0肩越し時の腕の長さ
DefaultSocketOffsetVector(0, 0, 0)通常時のオフセット
AimSocketOffsetVector(0, 55, 30)肩越し時のオフセット(右へ55、上へ30)

入力は IA_Aim(Value Type: Digital / Bool)を作り、IMC_Default右マウスボタン に割り当てます(→ Enhanced Inputの記事)。

手順1:Timelineを作る

イベントグラフを右クリックして Add Timeline... を選び、名前を AimBlend にします。ダブルクリックで開き、次のように設定します。

設定
トラックFloat Track を1本追加し、名前を Alpha
キー時間 0.0 で値 0.0、時間 0.25 で値 1.0
Length0.25

これで「0.25秒かけて0から1へ動く数字」ができました。この値を使って、通常時の値と肩越し時の値を混ぜます。

手順2:ノードを組む

IA_AimからTimelineを再生・逆再生し、UpdateでLerpした値をSet Target Arm LengthとSet Socket Offsetへ流すノードグラフ図
Event: EnhancedInputAction IA_Aim
  ├ [Started]   → AimBlend(Timeline)の Play from Start ピン
  └ [Completed] → AimBlend(Timeline)の Reverse ピン

AimBlend(Timeline)
  └ [Update] ─┬→ Set Target Arm Length
              │    Target: Camera Boom
              │    Target Arm Length ← Lerp (Float)
              │        A: DefaultArmLength(400.0)
              │        B: AimArmLength(180.0)
              │        Alpha: AimBlend の Alpha 出力
              │
              └→ Set Socket Offset
                   Target: Camera Boom
                   Socket Offset ← Lerp (Vector)
                       A: DefaultSocketOffset(0, 0, 0)
                       B: AimSocketOffset(0, 55, 30)
                       Alpha: AimBlend の Alpha 出力

Set Target Arm LengthSet Socket Offset は、コンポーネントタブの CameraBoom をイベントグラフへドラッグし、そこから引き出して検索すると出てきます。

Started はボタンを押した瞬間に1回、Completed は離した瞬間に1回だけ発火します。Timelineの Play from StartReverse に割り当てるだけで、押している途中で離しても、その地点から滑らかに戻ります。

Tickを使っていない点 が重要です。Timelineは再生中だけ動き、終われば止まります(→ Tickを減らす設計)。

手順3:狭い通路で確かめる

Playして、次の3点を見てください。

  • 右クリックを 押すと0.25秒でカメラが寄り、キャラが画面の左寄りに来る 。離すと同じ時間で戻る
  • 幅150cmの通路に入ると、 カメラが自動で手前に寄り、壁の向こう側は見えない
  • 通路を抜けると、カメラは自然に 400 の位置まで伸び直す

数字で確かめたいときは、Camera BoomGet Target Arm LengthPrint String に流します。通路内では 400 より小さい値に変わっているはずです。

うまくいかないときは、症状から切り分けます。

  • カメラが壁の中へ入る → 壁のCollision Presetで Camera が Block になっていないNoCollision や独自プリセットを疑う)
  • Do Collision Testはオンなのに貫通する → 壁が薄すぎる。Probe Size12 から 20 へ上げる
  • カメラが一瞬でワープするように寄る → Timelineの Update ではなく Finished につないでいる
  • 離しても戻らないCompletedReverse ではなく Stop につないでいる
  • 肩越しにならず、上下にずれるだけ → Socket Offsetの Y ではなくZに値を入れている(Yが左右)

ポイントは2つです。

  • カメラの「寄り」は棒の長さで作る: カメラ自体を動かすのではなく、Target Arm Length を縮めます。こうすると Do Collision Test がそのまま働き続けるため、寄った状態でも壁の判定が生きています。カメラを直接移動させると、この恩恵をすべて失います
  • 肩越しは Socket Offset のY: Socket Offsetは棒と一緒に回るので、カメラをどちらへ向けても「右肩の上」を保ちます。ここを Target Offset でやると、カメラを回した瞬間に位置関係が崩れます

寄ったカメラで戦うなら、次は当てた瞬間の手応えです。ヒットストップや画面シェイクで「当たった感じ」を作る手順は ヒットストップ・画面シェイク・ノックバック に、画面全体の色味を変える演出は Post Process Volumeの記事 にまとめています。

Sponsored

一人称視点へ切り替える

一人称は、Spring Armを捨てるのではなく 長さを0にして頭の位置へ移す と考えると簡単です。

やること設定
1. 棒を縮めるSpring Armの Target Arm Length0.0
2. 目の高さへ上げるSpring Armの Location のZを 60 前後に(カプセル中心から頭まで)
3. 体をカメラに合わせるPawnの Use Controller Rotation Yawオン 、CMCの Orient Rotation to Movementオフ
4. 自分の体を消すMesh の詳細パネルで Owner No Seeオン

手順4を飛ばすと、 自分の首から下や、まばたきの内側が視界を埋めますOwner No See は「所有しているプレイヤーからだけ見えなくする」設定なので、マルチプレイでは他プレイヤーからは普通に見えたままになります。

腕だけを表示したいときは、腕モデル専用のSkeletal Mesh Componentをもう1つ追加し、そちらを Only Owner See にします。

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

カメラの映像をUIやメッシュに出したいとき。 ミニマップ・監視カメラ・バックミラーのように「カメラが見ているものを別の場所に映す」用途では、Camera ではなく Scene Capture Component 2D を使います(→ Render Targetでミニマップと監視カメラを作る)。

  • カメラの切り替えは Set View Target with Blend: 監視カメラやイベントシーンへ切り替えたいときは、Player Controllerの Set View Target with Blend を使います。Blend Time を指定すると、その時間をかけて滑らかに移ります
  • Inherit Pitch / Yaw / Roll: Spring Armの3つのチェックは、親(キャラ)の回転をどこまで受け継ぐかです。既定は全部オンですが、Use Pawn Control Rotation がオンのときはコントローラの回転が優先されます
  • 画角はCamera側: 遠近感を変えたいときは Field of View(既定 90.0)です。ダッシュ中だけ少し広げると、速度感が強く出ます
  • Spring Arm + CameraはComponent設計の見本: 「棒」と「カメラ」に分かれているおかげで、両方を1セットで別のPawnへ移植できます。この考え方は Componentの再利用 につながります
  • カメラが震えるときは回転の競合を疑う: Use Controller Rotation YawOrient Rotation to Movement が両方オンになっていないか、まず確認してください

まとめ

  • Spring Armは 伸び縮みする棒 。位置の調整はCamera側ではなくSpring Arm側で行う
  • Target Arm Length が引きの強さ、 Socket Offset が肩越し、 Target Offset が注視点
  • Do Collision TestCameraチャンネル で判定する。壁側のプリセットが効いていないと素通りする
  • 体を回すフラグは2つあり、 Use Controller Rotation YawOrient Rotation to Movement は同時にオンにしない
  • 寄りの演出は 棒を縮める 。カメラを直接動かすと壁の判定が効かなくなる

いま作っているゲームで、プレイヤーはキャラの背中とカメラの向き、どちらを頼りに操作しているでしょうか。そこが決まると、3つのフラグの答えも決まります。