Unityでは、プレイヤーやオブジェクトにカメラを追従させるためのさまざまな方法が用意されており、簡単なコードから高度なツールであるCinemachineまで、状況に応じて最適な手法を選択することができます。
この記事では、基本的な追従カメラの作成方法、さらにはCinemachineを使った高度なカメラ制御まで、詳細なガイドとともに解説します。
- カメラを追従対象の子オブジェクトに設定する方法
- スクリプトからカメラ位置を指定する方法
- Cinemachineを使用する方法

それぞれ見ていきましょう!
追従方法
1. カメラをプレイヤーの子オブジェクトに設定する
最も基本的なカメラ追従の実装は、カメラの位置をターゲットオブジェクトの位置に合わせて更新する方法です。この方法では、カメラがターゲットに対して固定された位置関係を保持しながら追従します。
カメラをプレイヤーの子オブジェクトに設定することで、子オブジェクトが移動すると、カメラの位置も追従します。

Cubeを動かすと、カメラが追従します。

ただし、簡単にできる分デメリットもあり、回転の影響も受けます。
これだとボールが転がる際に、カメラも一緒に回転してしまいます。

また、もう一つのデメリットとして、追従がリアルタイムで行われるため、オブジェクトの動きが激しい場合はカメラが急激に移動してしまい、プレイヤーに違和感を与えることがあります。このようなケースでは、カメラの動きをスムーズにする必要があります。
スクリプトでカメラの位置を指定して回転を固定する方法
回転を固定するには、スクリプトからカメラの位置を制御する方法が有効です。
さらに、カメラの移動も滑らかに行うことが可能です。
以下のスクリプトをカメラにアタッチします。
using UnityEngine;
public class CameraController : MonoBehaviour
{
public Transform player; // プレイヤーのTransform
public Vector3 offset; // プレイヤーとカメラの相対位置
public float smoothTime = 0.3f; // カメラがプレイヤーを追跡する際のスムーズさの調整用パラメータ
private Vector3 velocity = Vector3.zero; // カメラ移動時の速度ベクトル
// プレイヤー移動後にカメラ移動をさせたいので、LateUpdateを使う
void LateUpdate()
{
// プレイヤーの位置にカメラを追従させる
Vector3 targetPosition = player.position + offset;
targetPosition.z = transform.position.z;
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
}
}
インスペクターでプレイヤーのTransformとプレイヤーとカメラの相対位置を指定してください。

offsetには、プレイヤーとカメラの相対位置をベクトルで指定します。
斜め上からプレイヤーをカメラで撮りたいなど、角度をつけたい場合は、事前にインスペクターでカメラの角度を設定しておきましょう。

smoothTimeは、カメラがプレイヤーに追従する際のスムーズさを調整するためのパラメータです。値を大きくすると、追従がゆっくりとなり、値を小さくすると、追従が速くなります。

カメラの制御にはLateUpdateを使う
カメラの追従は物理的な動作が反映された後に行うことが推奨されます。具体的には、Update()
ではなく LateUpdate()
を使用してカメラの位置を更新することで、キャラクターの動きがすべて反映された後にカメラの位置が調整され、滑らかな追従が実現します。
3. Cinemachineを利用する
回転を固定させるもう一つの方法は、Cinemachineを使用する方法です。
Cinemachineとは、Unity公式のアセットで、様々なカメラの制御がノーコードで簡単にできます。
Cinemachineのインポート
使用するには、Window > Package Managerを開き、Unity Registryからインポートします。


バーチャルカメラの作成
ヒエラルキーから、バーチャルカメラを作成します。

作成したバーチャルカメラのインスペクターから、FollowとLook Atに、追従させる対象のオブジェクトをドラッグ&ドロップします。

位置と角度の設定
カメラと追従対象との相対距離については、以下のオフセットから設定できます。
Bodyが位置、Aimが回転の設定です。

実行結果
スムーズに追従しました!

おわりに
カメラを追従させる方法の紹介でした。Unityでカメラをオブジェクトに追従させる方法は、基本的な追従方法から、スムーズな補間を使ったテクニック、Cinemachineを活用した高度なカメラ制御まで多岐にわたります。カメラの動きはゲームプレイの品質に直結するため、状況に応じて最適な方法を選択し、調整することが重要です。
おすすめは、Cinemachineを使った方法です。ノーコードでカメラの追従の仕方も自在に設定できます。
2Dゲームでの、高度なカメラ制御ができるアセットはこちらです。
