Third Personテンプレートのキャラクターは、マウスを動かすとカメラがぐるりと回ります。壁に近づいても、カメラは壁の中へ入っていきません。ところが自分でPawnにCameraコンポーネントを1つ足しただけのキャラクターを作ると、カメラは頭に貼りついたまま動かず、壁があれば平気ですり抜けます。
この差を作っているのが Spring Arm Component です。カメラを直接キャラに付けるのではなく、伸び縮みする棒の先に付ける、という部品です。この記事では、Spring Armの各パラメータが何を決めているか、壁ぬけを防ぐ仕組み、そして「体の向き」と「カメラの向き」を分ける3つのフラグを解説します。
この記事でわかること
- Spring Armは 伸び縮みする棒 。カメラは棒の先にぶら下がっている
- Target Arm Length / Socket Offset / Target Offset の違い
Do Collision Testが壁ぬけを防ぐ仕組みと、効かないときの原因- 初心者が必ず混乱する 回転の主導権を持つ3つのフラグ
- 実践: 肩越し視点へ切り替わるカメラを作り、狭い通路でも壁にめり込ませない
Spring Armは伸び縮みする棒
BP_ThirdPersonCharacter のコンポーネントタブを開くと、カメラは次のようにぶら下がっています。

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の本体です。
位置を決める3つのオフセット
Spring Armの詳細パネルには、位置に関わる項目が3つ並んでいます。名前が似ているため混同されがちですが、効く場所がまったく違います。

| 項目 | 既定値 | 効く場所 | 使いどころ |
|---|---|---|---|
| Target Arm Length | 300.0 | 棒の長さそのもの | 引きの強さ。近づける/遠ざける |
| Socket Offset | (0, 0, 0) | カメラ側 の端をずらす。棒と一緒に回る | 肩越し視点。横にずらす |
| Target Offset | (0, 0, 0) | 根元側 をずらす。ワールド基準で回らない | 注視点を上げる。頭より上を見る |
Third Personテンプレートでは Target Arm Length が 400.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つのチェックが、三人称カメラで最も面倒な問題を解決しています。

仕組みは単純です。Spring Armは毎フレーム、 根元からカメラの位置へ向かって球を1つ飛ばして います。途中で何かにぶつかったら、その手前までしか腕を伸ばしません。
| 項目 | 既定値 | 意味 |
|---|---|---|
| Do Collision Test | オン | 障害物のチェックをするかどうか |
| Probe Size | 12.0 | 飛ばす球の半径。大きいほど壁から離れて止まる |
| Probe Channel | Camera | どのチャンネルで判定するか |
ここで見落としやすいのが Probe Channel です。判定に使うのは通常のコリジョンではなく Camera チャンネル なので、 壁側のCollision Presetで Camera が Block になっていないと、カメラは素通りします 。 BlockAll や BlockAllDynamic なら問題ありませんが、自作のプリセットを使っている場合は確認してください(→ Collision Profileの記事)。
逆に、 カメラだけをすり抜けさせたい物 もあります。手前の草、柵、透明な結界などです。こうしたアクタは、Collision Presetで Camera だけ Ignore にすると、プレイヤーとはぶつかったままカメラには無視されます。
Probe Size を大きくすると、壁のかなり手前でカメラが止まるようになります。薄い壁を貫通して向こう側が見えてしまうときは、まずここを 12 から 20 前後まで上げてみてください。
回転の主導権を持つ3つのフラグ
ここが三人称カメラで最大のつまずきどころです。UEには キャラの体を回すもの と カメラを回すもの が別々に存在し、しかも設定場所が3箇所に散っています。

| フラグ | 設定場所 | 回すもの |
|---|---|---|
| Use Pawn Control Rotation | Spring Arm | カメラ をコントローラの向き(マウス)に合わせる |
| Use Controller Rotation Yaw | Pawn(Characterの詳細パネル) | 体 をコントローラの向きに合わせる |
| Orient Rotation to Movement | Character 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フレームの遅れもなく追従します。正確ではありますが、動きが硬く見えます。

| 項目 | 既定値 | 効果 |
|---|---|---|
| Enable Camera Lag | オフ | 位置の追従を遅らせる |
| Camera Lag Speed | 10.0 | 追いつく速さ。小さいほどゆったり |
| Enable Camera Rotation Lag | オフ | 回転の追従を遅らせる |
| Camera Rotation Lag Speed | 10.0 | 同上 |
| Camera Lag Max Distance | 0.0 | 遅れの上限距離。0は無制限 |
Enable Camera Lag をオンにして Camera Lag Speed を 5.0 まで下げると、走り出しでカメラがわずかに置いていかれ、止まるとゆっくり追いつきます。ほんの数フレームの遅れですが、映像としての気持ちよさが変わります。
この Lag Speed は、Blueprintの VInterp To / RInterp To の Interp Speed と同じ考え方です(大きいほど速く追いつき、近づくほど減速する)。自分で同じ追従を組みたくなったら 回転と補間の基礎 が使えます。
ただし 回転のラグは付けすぎると酔います 。マウスの動きと画面のずれは、位置のずれよりずっと敏感に感じ取られるためです。まずは位置のラグだけをオンにして、回転はそのままにしておくのが安全です。
高速で移動するキャラでは、Camera Lag Max Distance に 100 程度を入れておくと、遅れが際限なく広がるのを防げます。
実践:肩越し視点へ切り替わるカメラ
TPSで銃を構える瞬間、アクションRPGで敵にロックオンする瞬間、ホラーゲームで狭い廊下に入る瞬間。 ジャンルは違っても「寄って、肩越しに する」という動きは同じ です。ここでは、ボタンを押している間だけカメラが肩越しへ寄る仕組みを作り、狭い通路でも壁にめり込まないことを確認します。
完成形
キーを押すとカメラが0.25秒かけて手前へ寄り、キャラの右肩の上へずれます。離すと元の位置に戻ります。その状態で幅の狭い通路に入っても、カメラは壁の中に入りません。

再現条件
Third Personテンプレート で Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter を開きます。コンポーネントタブで CameraBoom を選んだときの初期状態は次のとおりです。
| パラメータ | 初期値 |
|---|---|
| Target Arm Length | 400.0 |
| Socket Offset | (0, 0, 0) |
| Do Collision Test | オン |
| Probe Size | 12.0 |
| Use Pawn Control Rotation | オン |
レベル側には、幅 150cm ほどの通路を作っておきます。床のCubeを細長く伸ばし、両側にCubeで壁を立てるだけで十分です。壁のCollision Presetは既定の BlockAll のままにします。
Blueprintには次の変数を追加します。
| 変数名 | 型 | 既定値 | 用途 |
|---|---|---|---|
DefaultArmLength | Float | 400.0 | 通常時の腕の長さ |
AimArmLength | Float | 180.0 | 肩越し時の腕の長さ |
DefaultSocketOffset | Vector | (0, 0, 0) | 通常時のオフセット |
AimSocketOffset | Vector | (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 |
| Length | 0.25 |
これで「0.25秒かけて0から1へ動く数字」ができました。この値を使って、通常時の値と肩越し時の値を混ぜます。
手順2:ノードを組む

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 Length と Set Socket Offset は、コンポーネントタブの CameraBoom をイベントグラフへドラッグし、そこから引き出して検索すると出てきます。
Started はボタンを押した瞬間に1回、Completed は離した瞬間に1回だけ発火します。Timelineの Play from Start と Reverse に割り当てるだけで、押している途中で離しても、その地点から滑らかに戻ります。
Tickを使っていない点 が重要です。Timelineは再生中だけ動き、終われば止まります(→ Tickを減らす設計)。
手順3:狭い通路で確かめる
Playして、次の3点を見てください。
- 右クリックを 押すと0.25秒でカメラが寄り、キャラが画面の左寄りに来る 。離すと同じ時間で戻る
- 幅150cmの通路に入ると、 カメラが自動で手前に寄り、壁の向こう側は見えない
- 通路を抜けると、カメラは自然に
400の位置まで伸び直す
数字で確かめたいときは、Camera Boom → Get Target Arm Length を Print String に流します。通路内では 400 より小さい値に変わっているはずです。
うまくいかないときは、症状から切り分けます。
- カメラが壁の中へ入る → 壁のCollision Presetで Camera が Block になっていない(
NoCollisionや独自プリセットを疑う) - Do Collision Testはオンなのに貫通する → 壁が薄すぎる。
Probe Sizeを12から20へ上げる - カメラが一瞬でワープするように寄る → Timelineの
UpdateではなくFinishedにつないでいる - 離しても戻らない →
CompletedをReverseではなくStopにつないでいる - 肩越しにならず、上下にずれるだけ → Socket Offsetの Y ではなくZに値を入れている(Yが左右)
ポイントは2つです。
- カメラの「寄り」は棒の長さで作る: カメラ自体を動かすのではなく、
Target Arm Lengthを縮めます。こうするとDo Collision Testがそのまま働き続けるため、寄った状態でも壁の判定が生きています。カメラを直接移動させると、この恩恵をすべて失います - 肩越しは Socket Offset のY: Socket Offsetは棒と一緒に回るので、カメラをどちらへ向けても「右肩の上」を保ちます。ここを Target Offset でやると、カメラを回した瞬間に位置関係が崩れます
寄ったカメラで戦うなら、次は当てた瞬間の手応えです。ヒットストップや画面シェイクで「当たった感じ」を作る手順は ヒットストップ・画面シェイク・ノックバック に、画面全体の色味を変える演出は Post Process Volumeの記事 にまとめています。
一人称視点へ切り 替える
一人称は、Spring Armを捨てるのではなく 長さを0にして頭の位置へ移す と考えると簡単です。
| やること | 設定 |
|---|---|
| 1. 棒を縮める | Spring Armの Target Arm Length を 0.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 YawとOrient Rotation to Movementが両方オンになっていないか、まず確認してください
まとめ
- Spring Armは 伸び縮みする棒 。位置の調整はCamera側ではなくSpring Arm側で行う
- Target Arm Length が引きの強さ、 Socket Offset が肩越し、 Target Offset が注視点
Do Collision Testは Cameraチャンネル で判定する。壁側のプリセットが効いていないと素通りする- 体を回すフラグは2つあり、
Use Controller Rotation YawとOrient Rotation to Movementは同時にオンにしない - 寄りの演出は 棒を縮める 。カメラを直接動かすと壁の判定が効かなくなる
いま作っているゲームで、プレイヤーはキャラの背中とカメラの向き、どちらを頼りに操作しているでしょうか。そこが決まると、3つのフラグの答えも決まります。