[Unity] #10 プレイヤー追従カメラの正しい実装(Cinemachine + StarterAssets)

はじめに

Unity 6 日目、後半戦。

初期の頃、挫折して上手くできなかったプレイヤーに追従するFPS風カメラの実装。

これまでのUnity学習でかなり仕組みや実装方法が分かるようになり、改めてチャレンジしたところ出来るようになったので備忘録を兼ねた学習メモです。

前回の記事:

動画

1. はじめに — 何が難しいのか?

Unity で「プレイヤー追従カメラ」を作りたいだけなのに、

  • どのカメラが本物なのか分からない
  • AudioListener が 2 個あると怒られる
  • FreeLookCamera と本物の Camera の違いが不明
  • ThirdPersonController の CameraTarget が謎
  • Three.js と仕組みが違いすぎて意味不明

という問題に確実にぶつかる。

今回の記事では、 Unity 6 / StarterAssets / Cinemachine の最新構成に合わせた、 TPSカメラの正しい作り方 をまとめる。

2. 事前準備 — 今の Unity で必要なもの

Unity 6(2023LTS / 6000.3 以降)では、 古いチュートリアルで紹介されていた “ThirdPersonFollowCamera” がメニューから消えたため、 最新手順に合わせるための準備 が必要になる。

プレイヤー追従カメラを作るために必須なのは以下の 2 つ。


① StarterAssets(ThirdPersonController)

プレイヤー操作を一から書かなくても、

  • WASD移動
  • ジャンプ
  • 走る
  • 向き変更
  • Input System の統合
  • PlayerArmature(アニメ用構造)

がすべて揃っているパッケージ。

プレイヤーの動きとカメラは連動するので必須。


② Cinemachine(カメラ制御パッケージ)

Unity公式の “カメラ制御システム”。 TPS / FPS / RTS / カットシーンなど、あらゆるカメラを作れる。

今回使うのは Cinemachine FreeLook Camera。

特徴:

  • プレイヤーの周囲を自然に回転
  • スムーズな補間
  • プレイヤー追従
  • 壁とぶつかると自動で寄る
  • カメラ軌道(Rig)を自動管理
  • マウス反転(Invert)の設定も可能

Unity で TPS カメラを作るなら、これが唯一の選択肢。


事前チェック

StarterAssets が入っている

(ThirdPersonController.prefab が使える)

Cinemachine がインストール済み

(Package Manager → Unity Registry → “Cinemachine”)

もしこの時点で「Cinemachine が見当たらない」という場合は、 Unity のバージョンが古いのでアップデートが必要。

3. Unity のカメラは “2種類ある” — この理解がすべての鍵

Three.js と Unity の最大の違いはここ。

Unity のカメラは 2層構造 になっている。


① 実際に画面を描画する “本物の Camera”

役割:

  • 実際にレンダリングを行う
  • AudioListener を持つ
  • CinemachineBrain を持つ(超重要)
  • 映像を出力するのはこっちだけ

これは 普通の Unity Camera。


② カメラの動きを指示する “Virtual Camera(仮想カメラ)”

Cinemachine FreeLook Camera はこっち。

役割:

  • 回転したい角度
  • プレイヤーを中心に回りたい軌道
  • 上下の角度制限
  • スムーズ補間
  • 追従の強さ

など “カメラの動作” だけを管理する存在。

仮想カメラは 描画しない。 命令だけ出す。


■ Three.js の感覚で例えると

  • 本物の Camera = PerspectiveCamera そのもの
  • Virtual Camera = カメラ操作ロジックだけ書く関数

Unity はこれを オブジェクトとして分離 している。

これを理解していないと、

  • どのカメラが映してるの?
  • Virtual Camera を動かしても画面が変わらない
  • AudioListener が 2 個になって怒られる

という地獄に落ちる。

4. よくあるエラー「AudioListener が 2 つあります」の原因

初心者が 100% つまずくポイント。

StarterAssets を入れると:

Main Camera(シーンに元からある)
PlayerArmature 内の Camera(StarterAssetsが持っている)

の 2つの Camera が同時に存在する。

どちらにも AudioListener が付いているため、

There are 2 audio listeners in the scene.

と怒られる。


正しい解決法

Main Camera を無効化 or 削除する。

使うべきカメラは:

PlayerArmature
 └ PlayerCameraRoot
      └ Camera(本物のカメラ)

StarterAssets と組み合わせるなら、 この構造が必須。

5. 正しいカメラ構成の作り方(最新 Unity6 版)

Step 1:PlayerCameraRoot の下に「本物の Camera」を作成

PlayerArmature
 └ PlayerCameraRoot
       └ Camera(本物のカメラ)

付けるコンポーネント

  • Camera(自動)
  • AudioListener(自動)
  • CinemachineBrain(手動で追加)

Step 2:Cinemachine → FreeLook Camera を作成

Unity6 では古い “ThirdPersonFollowCamera” は廃止。 代わりに FreeLook Camera が TPS 用。

GameObject → Cinemachine → FreeLook Camera

Step 3:FreeLook Camera の設定

Follow

PlayerCameraRoot

LookAt

PlayerCameraRoot


Step 4:ThirdPersonController の CameraTarget を設定

PlayerArmature を選択 → Inspector

Cinemachine Camera Target → PlayerCameraRoot

これでプレイヤーの向きとカメラ回転が統合される。

6. FreeLook Camera の挙動を調整する(回転・反転・角度制限)

TPS カメラが最低限動くようになったら、 次に行うのが 操作感の調整。

Cinemachine FreeLook Camera は、そのままだと

  • マウス左右回転が逆方向になる
  • 上下の角度に違和感がある
  • 三人称としての視点操作がしっくりこない

という状態になることが多い。

ここでは、実際に私がハマったポイントも含めて 必ず見直すべき設定 をまとめる。


6-1. 左右回転が逆のときは “Invert” を調整する

FreeLook Camera を選択 → Inspector → Axis Control → X Axis

X Axis
    Speed: 300 くらい
    Invert: [✔/✖]

環境によってはデフォルトが逆になるため、 Invert(反転)を ON/OFF 切り替えるだけで修正できる。

今回のケースでは:

  • デフォルト → 回転が逆
  • Invert のチェックを外す → FPS と同じ操作感に修正

となった。

これは全ユーザーが一度は通るポイント。


6-2. 上下の視点角度(Top Clamp / Bottom Clamp)

プレイヤーをどの角度から見下ろせるかを決める設定。

ThirdPersonController(PlayerArmature)にある:

Top Clamp: 70
Bottom Clamp: -30

で角度を制限できる。

  • Top Clamp → 上に向ける限界
  • Bottom Clamp → 下に向ける限界

TPSゲームの自然な値は:

Top Clamp: 70〜80
Bottom Clamp: -20〜-40

あまり広げすぎると操作が不安定になる。


6-3. 回転速度の調整(X/Y の Speed)

FreeLookCamera → AxisControl

X Axis → Speed
Y Axis → Speed

ここを上げると、マウス感度が上昇する。 Three.js で言えば “横回転感度・縦回転感度” に相当。

  • マウス重め → 200〜300
  • 反応良くしたい → 300〜500
  • FPS 寄りの操作感 → 500〜600

自分の手に合わせて調整すべきポイント。


6-4. 絶対に触ってはいけない設定(初心者が壊す罠)

FreeLookCamera の “Orbits” の Height をいじると カメラの軌道が不自然になる。

Rig 0 (Top)
Rig 1 (Middle)
Rig 2 (Bottom)

ここは “距離” と “高さ” で細かく制御されているため、 最初は Radius 以外は触らない のが正解。

(後でズームを追加するときに維持したい形でもある)


6章 まとめ

FreeLook Camera の調整は

  1. X Axis の反転(Invert)
  2. Top/Bottom Clamp(上下限界)
  3. X/Y 軸の Speed(感度)

この 3 点を抑えるだけで、 ほぼ AAA TPS カメラと同じ操作感 にできる。

ズーム機能を追加するとさらに完成度が上がるので、 次はそれをやる。

7. マウスホイールで距離(ズーム)を調整できるようにする

TPS カメラがある程度動くようになると、 次に必ず欲しくなるのが ズーム(距離調整)。

  • キャラの近くで“半FPS視点”
  • 遠くで“見下ろし視点(やや見下げTPS)”
  • シーンに合わせて距離を変えたい
  • 建物内 / 屋外で自然に視点を変えたい

こういう用途に必須の機能。

しかし、Cinemachine FreeLook Camera には ズーム機能が標準で搭載されていない。

そこで、FreeLookCamera の「半径(Radius)」を マウスホイールで変更する方法を自作する。


7-1. FreeLookCamera の “Radius” を動かせばズームになる

FreeLook Camera は 3つの軌道(Rig)を持つ。

Rig 0 (Top)
Rig 1 (Middle)
Rig 2 (Bottom)

それぞれに

Height
Radius

が設定されており、 この Radius が「プレイヤーとの距離」になる。

つまり:

マウスホイールで Radius を増減させれば、TPS のズームになる。


7-2. ズーム機能スクリプトを作成する(FreeLookZoom.cs)

Project ウィンドウで新しい C# スクリプトを作成。

FreeLookZoom.cs

内容:

using UnityEngine;
using Cinemachine;

public class FreeLookZoom : MonoBehaviour
{
    public CinemachineFreeLook freeLook;
    public float zoomSpeed = 2f;
    public float minRadius = 1f;
    public float maxRadius = 10f;

    void Update()
    {
        float scroll = Input.mouseScrollDelta.y;
        if (scroll == 0) return;

        // Middle Rig の現在値を基準にする
        float newRadius = freeLook.m_Orbits[1].m_Radius - scroll * zoomSpeed;
        newRadius = Mathf.Clamp(newRadius, minRadius, maxRadius);

        // 全 Rig に半径を反映
        for (int i = 0; i < 3; i++)
        {
            freeLook.m_Orbits[i].m_Radius = newRadius;
        }
    }
}

7-3. FreeLook Camera に Add Component する

  1. FreeLook Camera を選択
  2. Inspector → Add Component → 「FreeLookZoom」
  3. スクリプトの freeLook フィールドへ 自分自身(FreeLook Camera)をドラッグしてセット

これだけでズーム用カメラが動く。


7-4. ズームの挙動をカスタマイズする

スクリプト内の値を調整するだけで操作感が変わる。

フィールド 意味 推奨値
zoomSpeed ズームの速さ 1.5〜3
minRadius キャラに最接近できる距離 1〜2
maxRadius 最も離れる距離 8〜15

Radius を小さくすると “半FPS視点” Radius を大きくすると “見下ろし視点”

となり、1つのゲームで複数のカメラ感覚を自由に切り替えられる。


7-5. FPS 寄り視点にしたい場合の調整例

minRadius = 0.5f;
maxRadius = 5f;
zoomSpeed = 2f;

プレイヤー頭の近くに寄せることで、 FPS 視点に近い感覚になる(ただし完全なFPS視点にするなら別の仕組みが必要)。


7章 まとめ

  • FreeLook Camera はズーム機能を持っていない
  • 代わりに “Radius” を変更して距離調整する
  • マウスホイールの入力だけで簡単に実装できる
  • TPS〜半FPSまで柔軟な視点が作れる
  • 完全にあなたの好みの操作感が実現できる

8. プレイヤー追従カメラを安定させるための追加 Tips(よくある罠と改善ポイント)

TPS カメラが “動いた” だけではまだ不十分。 実際のゲーム制作では、

  • 地形によってカメラが埋まる
  • 回転の軸がズレる
  • プレイヤーの中心点がずれる
  • カメラが暴れる(特に屋内)
  • 小道・狭い場所でめり込む

といった問題が頻発する。

ここでは プレイヤー追従カメラを安定させるために絶対に知っておくべきポイント をまとめておく。

あなたが今回の構築で「たしかに変だ」と感じた部分の答えにもなっている。


8-1. PlayerCameraRoot の位置が“回転軸”になる

一番大事なポイント。

PlayerArmature
 └ PlayerCameraRoot  ← ここが視点回転の中心!

この Transform の位置によって:

  • 視点の中心高さ
  • キャラとの距離感の自然さ
  • 回転した時の感覚
  • 俯瞰・見下ろし時の角度の自然さ

がすべて決まる。


最適な位置の目安

TPS の標準は プレイヤーの肩〜頭付近。

キャラの頭頂の少し下あたりに置くと自然になる。

逆にこの位置が低すぎると:

  • 見上げる動作が不自然
  • カメラが地面に近すぎて揺れる
  • 小刻みに視点がブレる

というトラブルが起きる。


8-2. 地形や壁にめり込む場合 → Cinemachine Collider を使う

FreeLookCamera には CinemachineCollider(拡張)を付けられる。

FreeLook Camera → Add Component:

Cinemachine Collider

設定項目:

  • Minimum Distance From Target
  • Avoid Obstacles
  • Camera Radius
  • Strategy(Pull Camera Forward 推奨)

これを ON にすると、

  • 壁に近づいたらカメラが手前に寄る
  • 狭い場所で自然に動く
  • キャラの背中を貫通しない

など、市販ゲームのようなカメラ挙動になる。


8-3. 屋内・洞窟・廊下でカメラが暴れる → CameraRadius を上げる

CinemachineCollider の中にある:

Camera Radius(デフォルト 0.1〜0.2)

これを 0.5〜1.0 に上げると、 壁の判定が強くなり視点が安定する。

3Dマップを作るとこれが超重要。


8-4. カメラが勝手に揺れる・浮く → Rig の Height を安定化させる

FreeLookCamera の Orbits にある Height は 軌道の高さを決めるパラメータ。

Rig 0 → 高い位置
Rig 1 → 中間
Rig 2 → 下の位置

Height の差が大きすぎると:

  • 視点が上下に揺れる
  • 回転中に高さが勝手に変わる
  • 追従が不自然になる

TPSらしい動きをしたいなら:

Rig0 Height : 3.5
Rig1 Height : 1.5
Rig2 Height : 0.0

くらいの シンプルな三角形軌道 を作ると良い。


8-5. 感度(Speed)は FPS と TPS で別物

X/Y Axis の Speed 調整は非常に重要。

  • FPS → 高速(500〜700)
  • TPS → 中速(200〜400)
  • 俯瞰寄り → 低速(100〜200)

TPS と FPS は視点の目的が違うため、 まったく同じ感度にすると違和感が出る。

今回あなたが感じた「回転が逆」もその一例。


8章 まとめ

TPS カメラは実装しただけでは完成ではない。

本来必要なのは:

  • CameraRoot の位置
  • FreeLook Camera の回転軸
  • Invert の有無
  • Sensitivity(感度)
  • Cinemachine Collider
  • Orbits(軌道)の安定化
  • Radius(ズーム)

これらを総合的に調整すること。

Unity の強みは、すべて Inspector 上で可視化できること。 Three.js 時代に手書きしていたコードの苦労が、 Unity なら“数値いじり”で済む。

9. 完成形のカメラ構造とまとめ(備忘録として必須の要点)

今回作った TPS プレイヤー追従カメラは、 Unity 6(2023LTS/6000系)、StarterAssets、Cinemachine の 最新仕様に完全対応した構成 になっている。

これは、Unity の標準的な TPS カメラとして 「最適解に近い構成」。

Three.js で毎回苦労して書いていた 「追従・回転・補間・ズーム・衝突回避」の処理が、 Unity ではオブジェクト構造と数値設定で完結する。

ここでは、この記事全体のまとめとして 完成形の構造 と 重要ポイントの総整理 を残しておく。


9-1. 完成したカメラ構造(理想形)

実際のシーン階層はこのようになる:

PlayerArmature
 └ PlayerCameraRoot    ← カメラ回転の中心(CameraTarget)
       └ Camera        ← 本物のカメラ(Brain + AudioListener)
CinemachineFreeLook    ← 仮想カメラ(操作ロジック)
FreeLookZoom.cs        ← ズーム制御

各パーツの役割:

オブジェクト 役割
PlayerCameraRoot カメラの“中心点”。プレイヤーの頭や肩の位置に置く。
Camera 実際の描画。AudioListener + CinemachineBrain を持つ。
CinemachineFreeLook 回転/追従/補間などのカメラ挙動を管理。
FreeLookZoom マウスホイールで距離を変える機能。

9-2. プレイヤー追従が安定するための設定 checklist

この記事で扱った内容を 未来のあなたのためにチェックリスト化しておく。


カメラの基本

  • Main Camera は無効化 or 削除
  • PlayerCameraRoot の下に Camera を作る
  • Camera に CinemachineBrain を追加
  • AudioListener は Camera 1つに絞る

Cinemachine FreeLook Camera

  • Follow → PlayerCameraRoot
  • LookAt → PlayerCameraRoot
  • Invert(左右反転)を正しい方向に設定
  • X/Y Axis Speed を好みに調整
  • Orbits(Height)は大きく変えない
  • Cinemachine Collider を必要に応じて追加
  • CameraRadius を 0.5〜1.0 で安定化

ThirdPersonController 側

  • Cinemachine Camera Target → PlayerCameraRoot
  • TopClamp / BottomClamp が適切な角度
  • Look Sensitivity が低すぎ/高すぎない

ズーム(FreeLookZoom)

  • freeLook に FreeLook Camera をドラッグ
  • minRadius / maxRadius が適切
  • zoomSpeed が自然な値
  • FPS寄り or TPS寄りに自由変更可

9-3. Three.js と比べたときのメリット(理解を固定するために)

最後に、Three.js で追従カメラを組んでいたあなたにとって Unity TPS カメラの優位性を明確にしておく。


① カメラの論理と描画が完全に分離されている

Three.js では 追従処理を自分で書く必要があった。

Unity では:

  • 描画 → 本物の Camera
  • 制御 → Virtual Camera(Cinemachine)

この構造が圧倒的に楽。


② 衝突回避が標準搭載

Three.js では Raycast で自作した部分。

Unity は CinemachineCollider で一発。


③ キャラクターの向きとカメラの向きが連動

Three.js では Vector3 でベクトルとクォータニオンを組み合わせて実装。

Unity は ThirdPersonController が自動同期してくれる。


④ 角度制限(Clamp)を Inspector で即変更

コードを書く必要ゼロ。


⑤ ズームも半手動で簡単に追加可能

Three.js の OrbitControls 的な動きを Unity でも同じように作れる。


9-4. 記事を書き終えたあなたへのメッセージ

今回あなたは、

Unity の “カメラ構造” を根本から理解しながら構築できた。

これが Unity における中級者への入り口。

実際、カメラこそが Unity・Unreal・Godot すべての3D環境で “最難関” の項目。

この章をクリアできたということは、 今後のマップ制作・エフェクト・アニメ制御などの 高レベル技術へ進む準備が整ったということ。


9章 まとめ

  • TPS カメラは Unity で最も重要な仕組みのひとつ
  • Unity 6 では設定方法が変わり、古い記事が役に立たない
  • 正しいカメラ構造を理解すると毎回数分で構築できる
  • Three.js で苦労していた処理を Unity は標準で持っている
  • 今回の構成は “最新 & ベストプラクティス” に近い完成形

記事としては以上で完結。 必要なら、次に書く記事 (#11) のテーマ案も出せるよ。

10. まとめ(備忘録として大事なポイント)

今回の TPS プレイヤー追従カメラ構築は、 Unity 6 / StarterAssets / Cinemachine の “最新構成” に沿った内容。

Three.js で自作していた追従カメラが、 Unity では コンポーネント構成 + 最小限のスクリプト で再現できるようになった。

将来また Unity を触ったときに役立つよう、 この記事全体の要点をまとめておく。


Unity のカメラは「本物」と「仮想」の2層構造

  • Camera(本物):描画・Brain・AudioListener
  • Virtual Camera(仮想):動作や追従ロジック(Cinemachine)

この構造を理解しないとカメラが暴れる。


PlayerCameraRoot が視点の中心(CameraTarget)になる

PlayerArmature の中にある PlayerCameraRoot が、 TPS カメラの回転軸となる。

これがズレると視点もズレる。


MainCamera は使わない(AudioListener問題)

StarterAssets を使う場合、 Main Camera は Disable or 削除 するのが正解。

PlayerCameraRoot 下の Camera を使う。


CinemachineFreeLook が TPS カメラの中核

Unity 6 では “ThirdPersonFollowCamera” が廃止され、 FreeLook Camera が標準 TPS カメラ になった。


Follow と LookAt は PlayerCameraRoot に設定

FreeLookCamera の必須設定:

Follow  → PlayerCameraRoot
LookAt → PlayerCameraRoot

これだけで追従が成立する。


ThirdPersonController の CameraTarget も PlayerCameraRoot

カメラ回転・キャラの向き同期のため、

Cinemachine Camera Target → PlayerCameraRoot

が必須。


挙動の調整は Invert と Sensitivity(Speed)で決まる

  • X Axis → Invert(反転 ON/OFF)
  • X/Y Axis → Speed(マウス感度)

今回のケースでは Invert のチェックを外す ことで 正しい回転方向に修正できた。


ズーム機能は自作スクリプトで追加すると最強

FreeLookCamera はズームを持たないが、 Orbit の Radius を動かせば実現できる。

minRadius / maxRadius / zoomSpeed

を調整することで TPS~半FPSまで自在に扱える視点に進化する。


一度理解すれば、毎回5分で構築できる

  • CameraRoot に Camera を作る
  • Brain を付ける
  • FreeLook Camera を置く
  • Follow / LookAt を設定
  • Target を渡す
  • Invert と Speed を調整
  • 必要ならズームも追加

という 固定の流れ ができるため、 次に作るときは迷わない。


結論

Unity の TPS カメラは複雑に見えるが、 “構造さえ理解すれば” とても単純。

Three.js のようにコードを大量に書かなくても、 コンポーネントと設定だけで プロレベルの追従カメラが手に入る。

あなたは今回その全体像を掴んだので、 次の Unity 領域へ進む準備は完全に整っている。