【Unity入門⑥】プレイヤーにカメラを追従させて2Dアクションゲーム感を出そう

Unity入門

こんにちは!怪獣です🦖

横スクロールゲームを作るときに欠かせないのがプレイヤーの歩行に合わせて追従する「カメラの追従処理」です。
プレイヤーが動いてもカメラが止まったままだと、すぐに画面の外に出てしまいます。
今回は「プレイヤーに合わせてカメラを動かす基本処理」を実装していきます📝

↓実装イメージ↓

この記事でやること

  • プレイヤーの横移動に合わせて追従するカメラ処理を作る

完成コード(CameraManager.cs)

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;
  • Unity上の設定で、プレイヤーオブジェクト(追従対象)をドラッグします
 [Header("カメラ位置オフセット")]
 public Vector3 offset = new Vector3(0f, 0f, -10f);
  • カメラとプレイヤーの距離(ずれ)を設定しているもの
  • カメラをプレイヤーと同じX・Y位置にして、Z方向に10だけ離した位置に置く(=2Dゲームでちょうどいい距離)

Start()

  • ゲーム開始時に1回だけ呼ばれる処理
  • ここでは「プレイヤーを探して変数に入れる」「初期のカメラ位置を覚える」ことをしています。

LateUpdate()

  • Updateのあとに毎フレーム呼ばれる処理
  • プレイヤーの移動が終わったあとにカメラを動かすので、画面がガタつきにくいです。

処理の流れ

1.プレイヤーオブジェクトを取得

 if (_player == null)
   _player = FindObjectOfType<Player>();

 if (_player != null)
  _playerT = _player.transform;
  • もし _player がまだ何も設定されていなければ、
    シーンの中から Player スクリプトを持つオブジェクトを探して 自動で設定する。
  • Unity上の設定で「CameraManager」のInspector内の_playerがドラッグして設定されていなければ、シーンの中から自動で探すということをしています。(設定し忘れても自動でプレイヤーを見つけて追いかけるようにする保険です◎)

2.カメラの位置設定

 Vector3 target = _playerT.position + offset;
  • プレイヤーの位置に「オフセット」を足して、「カメラがどの位置に動くべきか」を計算
  • 「カメラが移動したい位置」=プレイヤーの位置+少しずらす距離(オフセット)

3.横だけ追従、縦は固定

 float nextX = target.x; 
 float nextY = transform.position.y; 
 float nextZ = target.z;
  • nextX(横方向)はプレイヤーに合わせる
  • nextY(縦方向)は動かさず固定
  • nextZ(奥行き)は-10で固定(2Dゲームの標準的なカメラ距離)
    これで横スクロール専用のカメラワークになります🏃

4.カメラを実際に移動

transform.position = new Vector3(nextX, nextY, nextZ);
  • 計算した座標をカメラに反映させて、画面を動かします。

まとめ

  • Start:最初に一度だけ呼ばれる → 追従先を設定&初期位置を覚える
  • LateUpdate:Updateのあとに毎フレーム呼ばれる → プレイヤー移動後にカメラを追従
  • offset:プレイヤーを画面のどこに映すか調整できる

動作確認

  1. カメラに CameraManager をアタッチ
  2. Player を Inspector にドラッグして割り当て
  3. ゲームを再生し、プレイヤーを左右に歩かせる
    • 右に歩くとカメラが追従する

👉プレイヤーに合わせてカメラを追従させることが出来ました!

つまずき対策(よくあるQ&A)

  • カメラがガクつく/遅れて見える
    • 追従は LateUpdate に置く(物理/アニメーション確定後に追従)
  • 上下にも追従したい
    • nextY = target.y; に変更(必要なら Mathf.Clamp で上下範囲を制限)

まとめ

  • プレイヤーの位置を基準に、カメラを動かす処理を作成した
  • 縦と奥行きは固定、横だけ追従

次回の記事では、いよいよ敵を使っていこうと思います!👾

コメント

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