カメラの追従を実現する方法はいくつかありますが、最も簡単で一般的なのは、「親子関係」を利用する方法と、「専用のスクリプト」を使う方法の2つです。
1. 👫 方法A: 親子関係を利用する(簡易的な追従)
これは、カメラをプレイヤーの子オブジェクトにすることで、親であるプレイヤーが動けば、カメラも自動的にその移動・回転についていくようにする、最も手軽な方法です。
- Hierarchyビューで、メインカメラ(通常は
Main Camera)をプレイヤーオブジェクト(例:Cube)の上にドラッグ&ドロップします。 - これにより、カメラがプレイヤーの子になり、プレイヤーが親になります。
- 利点: スクリプトは不要です。プレイヤーが移動・回転すると、カメラも同じように移動・回転します。
- 欠点: プレイヤーが回転すると、カメラも一緒に回転してしまい、視点が固定されません。三人称視点(TPS)ゲームでは使いにくい場合があります。
2. 📝 方法B: スクリプトによるスムーズな追従(推奨)
カメラの位置をプレイヤーの少し後ろに保ちつつ、プレイヤーの動きに合わせて滑らかに移動させる、より本格的な方法です。これには専用のC#スクリプトが必要です。
Step 1: CameraFollow.csの作成
- 新しいC#スクリプトを作成し、「
CameraFollow」という名前を付けます。 - このスクリプトをMain Cameraにアタッチします。
Step 2: コードの記述
CameraFollow.csを開き、以下のコードを記述します。
C#
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
// Inspectorからプレイヤーオブジェクトを設定できるようにする
public Transform target;
// Inspectorからカメラとプレイヤーとの距離を調整できるようにする
public Vector3 offset = new Vector3(0f, 5f, -10f);
// カメラがターゲットに追いつく速さ
public float smoothSpeed = 0.125f;
// 物理移動(FixedUpdate)後にカメラを動かすのがベストプラクティス
void LateUpdate()
{
if (target == null) return; // ターゲットが設定されていなければ何もしない
// 1. 追跡すべき理想的な位置を計算
// ターゲットの位置にオフセットを加算した場所が理想位置
Vector3 desiredPosition = target.position + offset;
// 2. 現在の位置から理想位置へ、滑らかに(Lerpを使って)移動させる
// Vector3.Lerp(現在の位置, 理想の位置, 補間係数)
Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
// 3. カメラの位置を更新
transform.position = smoothedPosition;
// (オプション) 常にターゲットを見るようにする
transform.LookAt(target);
}
}
Step 3: Inspectorでの設定
- Unityエディタに戻り、Main Cameraを選択します。
- Inspectorビューの
Camera Followコンポーネントを見てください。 - Targetという空欄があるので、Hierarchyビューからプレイヤーオブジェクト(例:Cube)をドラッグ&ドロップして設定します。
- Offsetの値を変更して、カメラがプレイヤーからどのくらい離れた位置に配置されるかを調整できます。
- 例:
Y: 5(プレイヤーより5m上)、Z: -10(プレイヤーより10m後方)
- 例:
💡 LateUpdate()の重要性
このスクリプトではUpdate()ではなく**LateUpdate()**を使っています。これはUnityの処理順序に関係します。
Update()/FixedUpdate():プレイヤーの移動処理(PhysicsMovementスクリプトなど)が実行される。LateUpdate():すべてのUpdate()処理が終わった後に実行される。
カメラの追従は「プレイヤーが完全に移動を終えた後の位置」を基に行う必要があるため、LateUpdate()を使うのが最も滑らかで安定したカメラワークを実現するベストプラクティスです。
これで、プレイヤーが移動しても、カメラがスムーズに追いかけてくるようになりました!


コメント