【Unity2D】プレイヤーを追従させるカメラの実装方法|コード全文・解説つき

Unity2D実装解説(テクニック)

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);
    }
  • LateUpdateUpdateのあとに毎フレーム呼ばれる処理
  • カメラの位置を計算後、横方向(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でプレイヤーを追従するカメラの作り方を解説しました👾

実装の内容をまとめると以下の通りです。

  1. プレイヤーのTransform(位置情報等)を取得する
  2. LateUpdateでプレイヤーの位置を取得してカメラを動かす量を計算
  3. カメラの位置をプレイヤーに合わせて移動する

この処理を入れることで、
プレイヤーの動きに合わせてカメラが自然に追従するようになります。

2Dアクションゲームでは必須の処理なので
ぜひ実装してみてください!

少しでもゲーム制作のお役に立てたらうれしいです🦖

コメント

タイトルとURLをコピーしました