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

Unity入門

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

↓実装イメージ↓

この記事でやること

  • プレイヤーの位置に追従するカメラを作る
  • 画面端の戻り防止に片方向クランプ(左端固定)
  • カメラのオフセットで見やすい画角をキープ
  • つまずきポイント(Update/LateUpdateの違い、参照切れ)を回避

完成コード(CameraManager.cs)

CameraManager.csを新規作成し、カメラ処理をこちらに書いていきます。

using UnityEngine;

public class CameraManager : MonoBehaviour
{
    [Header("追従対象")]
    [SerializeField] private Player _player;     // Inspectorで指定可(未指定ならStartで検索)

    [Header("カメラ位置オフセット")]
    public Vector3 offset = new Vector3(0f, 0f, -10f); // Zは-10で2D既定の距離

    [Header("左端を固定(戻らない演出用)")]
    [SerializeField] private bool lockLeftEdge = true;

    private Vector3 _initPos;      // 開始時のカメラ位置(左端の基準)
    private Transform _playerT;    // 高頻度アクセス用にTransformをキャッシュ

    void Start()
    {
        // 1) 追従対象の参照を安全に確保
        if (_player == null)
            _player = FindObjectOfType<Player>();

        if (_player != null)
            _playerT = _player.transform;

        // 2) 左端固定の基準として初期カメラ位置を保持
        _initPos = transform.position;

    }
    // Update のあとに毎フレーム呼ばれる処理
    void LateUpdate()
    {
        if (_playerT == null) return;

        // 3) 「プレイヤーの位置 + オフセット」を 目標位置 として計算
        Vector3 target = _playerT.position + offset;

        // 4) 横スクロール想定
        //    Y座標(縦方向)とZ座標(奥行き) は固定にして「横スクロール専用カメラ」にする
        float nextX = target.x;
        float nextY = transform.position.y;   // 縦は固定(必要なら追従に変更可)
        float nextZ = target.z;               // -10固定

        // 5) 左端固定:一度進んだらカメラが左へ戻らない
        if (lockLeftEdge)
            nextX = Mathf.Clamp(nextX, _initPos.x, float.PositiveInfinity);

        // 6) 実際にカメラを移動
        transform.position = new Vector3(nextX, nextY, nextZ);
    }
}


各処理の説明(初心者向け)

Start()

  • ゲーム開始時に1回だけ呼ばれる処理
  • ここでは「プレイヤーを探して変数に入れる」「初期のカメラ位置を覚える」ことをしています。
  • 左端固定を使うときに、この最初の位置が基準になります。

LateUpdate()

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

処理の流れ

  1. プレイヤーの位置を取得
Vector3 target = _playerT.position + offset;
  • プレイヤーの位置に「オフセット」を足して、カメラが映すべき座標を計算します。
  • offset = (0, 0, -10) → プレイヤーを中心にしてカメラを後ろから見る

  1. 横だけ追従、縦は固定
float nextX = target.x; float nextY = transform.position.y; float nextZ = target.
  • X(横方向)だけプレイヤーに合わせる
  • Yは固定(上下にカメラが動くと見づらい)
  • Zは-10固定(2Dカメラの距離)

  1. 左端固定(戻らないスクロール)
nextX = Mathf.Clamp(nextX, _initPos.x, float.PositiveInfinity);
  • Clamp は数値を範囲に制限する関数
  • 最初の位置 _initPos.x を下限にすることで、カメラが左に戻らなくなります
    → 横スクロールアクションらしい演出ができます

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

まとめ

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

動作確認

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

👉マップを作ることでゲーム感が一気に増しました!

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

  • カメラがガクつく/遅れて見える
    • 追従は LateUpdate に置く(物理/アニメーション確定後に追従)
  • 左へも戻ってほしい(往復型ステージ)
    • lockLeftEdge = false にする
  • 上下にも追従したい
    • nextY = target.y; に変更(必要なら Mathf.Clamp で上下範囲を制限)
  • マップ外が映る
    • タイルマップの矩形やカメラ用の境界Min/Maxを用意し、
      nextX = Mathf.Clamp(nextX, minX, maxX); で制限(拡張項目で後述)

まとめ

  • プレイヤーの位置を基準にカメラを動かす
  • 縦と奥行きは固定、横だけ追従
  • 左端に戻らないように制御して、横スクロールらしい画面にする

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

コメント

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