Unityで2Dアクションゲームを作っていると、
- 「プレイヤーの歩行に合わせてカメラも追従させたい」
- 「プレイヤーを歩かせてもカメラが追従しない」
- 「横だけ追従したい」
といったことはありませんか?
この記事では、プレイヤーにカメラを追従させる基本実装を、コード全文つきで、
一行ずつわかりやすく解説します!
①この記事でやること
- プレイヤーの横移動に合わせて追従するカメラ処理を作る
②完成コード
カメラの動きを管理するCameraManager.csを用意します。
以下のような処理を書きます。(コピペOK!)
using UnityEngine;
public class CameraManager : MonoBehaviour
{
[Header("追従対象")]
[SerializeField] private Player _player; // Inspector側でPlayerオブジェクトをドラッグ
[Header("カメラ位置オフセット")]
public Vector3 offset = new Vector3(0f, 0f, -10f); // Zは-10で2D既定の距離
private Transform _playerT; // プレイヤーの位置情報を扱うための変数
void Start()
{
// 1) 追従対象の参照を安全に確保
if (_player == null)
_player = FindObjectOfType<Player>();
if (_player != null)
_playerT = _player.transform;
}
// Update のあとに毎フレーム呼ばれる処理
void LateUpdate()
{
if (_playerT == null) return;
// 2) 「プレイヤーの位置 + オフセット」を 目標位置 として計算
Vector3 target = _playerT.position + offset;
// 3) 横スクロール想定
// Y座標(縦方向)とZ座標(奥行き) は固定にして「横スクロール専用カメラ」にする
float nextX = target.x;
float nextY = transform.position.y; // 縦は固定(必要なら追従に変更可)
float nextZ = target.z; // -10固定
// 4) 実際にカメラを移動
transform.position = new Vector3(nextX, nextY, nextZ);
}
}
③各処理の説明(初心者向け)
変数の定義
[Header("追従対象")]
[SerializeField] private Player _player;- SerializeFieldを定義し、Unity上の設定できるようにします。
- プレイヤーオブジェクト(追従対象)をドラッグします
[Header("カメラ位置オフセット")]
public Vector3 offset = new Vector3(0f, 0f, -10f);- カメラとプレイヤーの距離(ずれ)を設定しているもの
- カメラをプレイヤーと同じX・Y位置にして、Z方向に10だけ離した位置に置く(=2Dゲームでちょうどいい距離)
Start()
void Start()
{
// 1) 追従対象の参照を安全に確保
if (_player == null)
_player = FindObjectOfType<Player>();
if (_player != null)
_playerT = _player.transform;
}- Startはゲーム開始時に1回だけ呼ばれる処理
- ここでは「プレイヤーを探して変数に入れる」「初期のカメラ位置を覚える」ことをしています。
- もし
_playerがまだ何も設定されていなければ、
シーンの中から Player スクリプトを持つオブジェクトを探して 自動で設定する。 - Unity上の設定で「CameraManager」のInspector
内の_playerがドラッグして設定されていなければ、シーンの中から自動で探すということをしています。(設定し忘れても自動でプレイヤーを見つけて追いかけるようにする保険です◎)
LateUpdate()
void LateUpdate()
{
if (_playerT == null) return;
// 2) 「プレイヤーの位置 + オフセット」を 目標位置 として計算
Vector3 target = _playerT.position + offset;
// 3) 横スクロール想定
// Y座標(縦方向)とZ座標(奥行き) は固定にして「横スクロール専用カメラ」にする
float nextX = target.x;
float nextY = transform.position.y; // 縦は固定(必要なら追従に変更可)
float nextZ = target.z; // -10固定
// 4) 実際にカメラを移動
transform.position = new Vector3(nextX, nextY, nextZ);
}- LateUpdateはUpdateのあとに毎フレーム呼ばれる処理
- カメラの位置を計算後、横方向(nextX)の変数に代入し、実際にカメラを移動しています
- プレイヤーの移動が終わったあとにカメラを動かすので、画面がガタつきにくくなります
処理の流れ
1.カメラの位置設定
Vector3 target = _playerT.position + offset;- プレイヤーの位置に「オフセット」を足して、「カメラがどの位置に動くべきか」を計算
- 「カメラが移動したい位置」=プレイヤーの位置+少しずらす距離(オフセット)
2.横だけ追従、縦は固定
float nextX = target.x;
float nextY = transform.position.y;
float nextZ = target.z;nextX(横方向)はプレイヤーに合わせるnextY(縦方向)は動かさず固定nextZ(奥行き)は-10で固定(2Dゲームの標準的なカメラ距離)
これで横スクロール専用のカメラワークになります🏃
3.カメラを実際に移動
transform.position = new Vector3(nextX, nextY, nextZ);- 計算した座標をカメラに反映させて、画面を動かします。
なぜ LateUpdate を使うのか
LateUpdateは「Updateの処理が終わった後」に実行されます。
今回のように、
プレイヤーが移動する
↓
その後カメラが追従する
という処理の場合は
LateUpdateを使うことで自然な動きになります!
④上下にも追従させたい場合は?
このままだと上下移動が激しいと見切れてしまうので、
ジャンプに合わせてカメラも上下させたい場合は、Yを固定せずに追従させます。
以下のように設定すれば上にもカメラが付いてきます💡
float nextY = target.y;⑤よくあるエラーと対処法
エラー1:カメラが動かない
原因として多いのは、追従対象が設定されていないことです。
以下を確認してみてください。
- Main Cameraにスクリプトを適用しているか
targetにプレイヤーを入れているか- プレイヤーの Transform を参照できているか
エラー2:カメラがガクつく
原因としては
- プレイヤーの移動とカメラ追従のタイミングがズレている
Update()に書いている- Rigidbody2D の移動方法と噛み合っていない
といったものがあります。
⑥まとめ
今回の記事では
Unityでプレイヤーを追従するカメラの作り方を解説しました👾
実装の内容をまとめると以下の通りです。
- プレイヤーのTransform(位置情報等)を取得する
- LateUpdateでプレイヤーの位置を取得してカメラを動かす量を計算
- カメラの位置をプレイヤーに合わせて移動する
この処理を入れることで、
プレイヤーの動きに合わせてカメラが自然に追従するようになります。
2Dアクションゲームでは必須の処理なので
ぜひ実装してみてください!
少しでもゲーム制作のお役に立てたらうれしいです🦖

コメント