横スクロールゲームを作るときに欠かせないのが「カメラの追従処理」です。
プレイヤーが動いてもカメラが止まったままだと、すぐに画面の外に出てしまいます。
今回は「プレイヤーに合わせてカメラを動かす基本処理」を実装していきます📝
↓実装イメージ↓
この記事でやること
- プレイヤーの位置に追従するカメラを作る
- 画面端の戻り防止に片方向クランプ(左端固定)
- カメラのオフセットで見やすい画角をキープ
- つまずきポイント(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のあとに毎フレーム呼ばれる処理
- プレイヤーの移動が終わったあとにカメラを動かすので、画面がガタつきにくいです。
処理の流れ
- プレイヤーの位置を取得
Vector3 target = _playerT.position + offset;
- プレイヤーの位置に「オフセット」を足して、カメラが映すべき座標を計算します。
offset = (0, 0, -10)
→ プレイヤーを中心にしてカメラを後ろから見る
- 横だけ追従、縦は固定
float nextX = target.x; float nextY = transform.position.y; float nextZ = target.
- X(横方向)だけプレイヤーに合わせる
- Yは固定(上下にカメラが動くと見づらい)
- Zは-10固定(2Dカメラの距離)
- 左端固定(戻らないスクロール)
nextX = Mathf.Clamp(nextX, _initPos.x, float.PositiveInfinity);
Clamp
は数値を範囲に制限する関数- 最初の位置
_initPos.x
を下限にすることで、カメラが左に戻らなくなります
→ 横スクロールアクションらしい演出ができます
- カメラを実際に移動
transform.position = new Vector3(nextX, nextY, nextZ);
- 計算した座標をカメラに反映させて、画面を動かします。
まとめ
- Start:最初に一度だけ呼ばれる → 追従先を設定&初期位置を覚える
- LateUpdate:Updateのあとに毎フレーム呼ばれる → プレイヤー移動後にカメラを追従
- offset:プレイヤーを画面のどこに映すか調整できる
- Clamp:左端固定で横スクロールらしい演出に
動作確認
- カメラに
CameraManager
をアタッチ Player
を Inspector にドラッグして割り当て- ゲームを再生し、プレイヤーを左右に歩かせる
- 右に歩くとカメラが追従する
- 左に戻ってもカメラは戻らない
👉マップを作ることでゲーム感が一気に増しました!
つまずき対策(よくあるQ&A)
- カメラがガクつく/遅れて見える
- 追従は LateUpdate に置く(物理/アニメーション確定後に追従)
- 左へも戻ってほしい(往復型ステージ)
lockLeftEdge = false
にする
- 上下にも追従したい
nextY = target.y;
に変更(必要ならMathf.Clamp
で上下範囲を制限)
- マップ外が映る
- タイルマップの矩形やカメラ用の境界Min/Maxを用意し、
nextX = Mathf.Clamp(nextX, minX, maxX);
で制限(拡張項目で後述)
- タイルマップの矩形やカメラ用の境界Min/Maxを用意し、
まとめ
- プレイヤーの位置を基準にカメラを動かす
- 縦と奥行きは固定、横だけ追従
- 左端に戻らないように制御して、横スクロールらしい画面にする
次回の記事では、いよいよ敵を使っていこうと思います!👾
コメント