こんにちは!怪獣です🦖
横スクロールゲームを作るときに欠かせないのがプレイヤーの歩行に合わせて追従する「カメラの追従処理」です。
プレイヤーが動いてもカメラが止まったままだと、すぐに画面の外に出てしまいます。
今回は「プレイヤーに合わせてカメラを動かす基本処理」を実装していきます📝
↓実装イメージ↓
この記事でやること
- プレイヤーの横移動に合わせて追従するカメラ処理を作る
完成コード(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:プレイヤーを画面のどこに映すか調整できる
動作確認
- カメラに
CameraManagerをアタッチ Playerを Inspector にドラッグして割り当て- ゲームを再生し、プレイヤーを左右に歩かせる
- 右に歩くとカメラが追従する
👉プレイヤーに合わせてカメラを追従させることが出来ました!
つまずき対策(よくあるQ&A)
- カメラがガクつく/遅れて見える
- 追従は LateUpdate に置く(物理/アニメーション確定後に追従)
- 上下にも追従したい
nextY = target.y;に変更(必要ならMathf.Clampで上下範囲を制限)
まとめ
- プレイヤーの位置を基準に、カメラを動かす処理を作成した
- 縦と奥行きは固定、横だけ追従
次回の記事では、いよいよ敵を使っていこうと思います!👾


コメント