カメラを滑らかに移動させたいけど、どう計算すればいいのか分からない。
イベントシーンで、カメラが特定の位置へ移動し、特定の方向を向く時、急に移動すると不自然に見える。
そんな悩みを抱えていませんか。
カメラを滑らかに補間するには、Lerp(位置)とSlerp(回転)を使います。
Lerpで位置を補間し、Slerpで回転を補間すれば、滑らかな視点移動が実現できます。
この記事では、カメラを滑らかに補間する計算方法を、Unity実装例とともに解説します。
カメラ補間とは何か(ゲーム制作目線)

カメラ補間とは、現在のカメラの状態から目標の状態へ、一定の速度で滑らかに変化させることです。
位置と回転の両方を補間すれば、自然な視点移動が実現できます。
ゲームでは、イベントシーンの視点切り替え、ボス戦の開始時、カメラの視点変更など、様々な場面でカメラ補間が使われます。
Unityでは、Vector3.Lerp(位置の補間)とQuaternion.Slerp(回転の補間)を使うことで、簡単に実装できます。
位置と回転の補間
カメラ補間では、位置と回転を別々に補間します。
位置の補間には、Vector3.Lerpを使います。
回転の補間には、Quaternion.Slerpを使います。
回転の補間にSlerpを使う理由は、回転速度を一定に保つためです。
Lerpを使うと、回転角度が大きい場合、回転速度が一定にならないことがあります。
ゲームでの具体的な使い道

カメラ補間が、ゲームでどう使われているかを確認してみましょう。
イベントシーンの視点切り替え
イベントシーンで、カメラが特定の位置へ移動し、特定の方向を向く時、カメラ補間が使われます。
急に移動すると、プレイヤーが迷子になってしまいます。
滑らかに補間すれば、見やすい演出になります。
ボス戦の開始時
ボス戦の開始時に、カメラがプレイヤーからボスに向けて回転する時、カメラ補間が使われます。
カメラの回転にSlerpを使うことで、一定速度で滑らかに移動します。
カメラの視点変更
プレイヤーが特定のアイテムや場所を見る時、カメラがその方向へ移動する場面です。
カメラ補間を使うことで、自然な視点移動が実現できます。
シーンの切り替え
シーンが切り替わる時、カメラの位置や向きを滑らかに変更する場面です。
フェードイン・フェードアウトと組み合わせることで、滑らかなシーン遷移が実現できます。
- イベントシーンの視点切り替え
- ボス戦の開始時
- カメラの視点変更
- シーンの切り替え
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

カメラ補間の仕組みは、「位置と回転の独立した補間」という考え方で理解できますね。
位置の補間
カメラの位置を補間する時、現在の位置から目標の位置へ、Lerpで補間します。
補間係数t(0.0〜1.0)を使って、中間位置を計算します。
毎フレーム、tの値を更新すれば、徐々に目標の位置に近づいていきます。
回転の補間
カメラの回転を補間する時、現在の回転から目標の回転へ、Slerpで補間します。
Slerpを使うことで、回転速度が一定になり、自然な動きになります。
補間の終了判定
補間が完了したかを判定するため、位置と回転の距離を計算します。
位置の距離が一定以下、回転の角度差が一定以下になったら、補間を終了します。
補間速度の制御
補間の速度を制御するため、Time.deltaTimeを使います。
Time.deltaTimeを使うことで、フレームレートに依存しない一定の速度で補間できますね。
- 位置の補間にはLerp、回転の補間にはSlerpを使う
- 補間係数tを毎フレーム同じ値で更新すると、ゴールに到達しない場合がある
- Time.deltaTimeを使った固定速度か、一定の割合を適用することが重要
- 補間の終了判定を追加すれば、無限に補間し続けることを防げる
Unityで実装する際の注意点(代表例)

Unityでカメラ補間を実装する場合の注意点を見ていきましょう。
基本的なカメラ補間
位置と回転を補間する基本的な実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class CameraInterpolation : MonoBehaviour { public Vector3 targetPosition; public Quaternion targetRotation; public float interpolationSpeed = 2f; void Update() { // 位置を補間(Lerp) transform.position = Vector3.Lerp( transform.position, targetPosition, Time.deltaTime * interpolationSpeed ); // 回転を補間(Slerp) transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * interpolationSpeed ); } } |
このコードでは、位置と回転を別々に補間しています。
補間の終了判定を追加
補間が完了したかを判定する実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class CameraInterpolationWithCheck : MonoBehaviour { public Vector3 targetPosition; public Quaternion targetRotation; public float interpolationSpeed = 2f; public float arrivalDistance = 0.1f; public float arrivalAngle = 1f; void Update() { // 位置の距離を計算 float positionDistance = Vector3.Distance(transform.position, targetPosition); // 回転の角度差を計算 float rotationAngle = Quaternion.Angle(transform.rotation, targetRotation); // 十分近づいたら直接設定 if (positionDistance < arrivalDistance && rotationAngle < arrivalAngle) { transform.position = targetPosition; transform.rotation = targetRotation; } else { // 位置を補間(Lerp) transform.position = Vector3.Lerp( transform.position, targetPosition, Time.deltaTime * interpolationSpeed ); // 回転を補間(Slerp) transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * interpolationSpeed ); } } } |
このコードでは、位置と回転の距離をチェックし、十分近づいたら補間を終了しています。
イベントシーンでの使用例
イベントシーンでカメラを移動させる実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public class EventCamera : MonoBehaviour { public Transform eventTarget; public float interpolationSpeed = 2f; private bool isInterpolating = false; private Vector3 startPosition; private Quaternion startRotation; public void StartInterpolation() { isInterpolating = true; startPosition = transform.position; startRotation = transform.rotation; } void Update() { if (!isInterpolating || eventTarget == null) return; // 目標の位置と回転を計算 Vector3 targetPosition = eventTarget.position + eventTarget.forward * -5f + Vector3.up * 2f; Quaternion targetRotation = Quaternion.LookRotation(eventTarget.position - targetPosition); // 位置を補間 transform.position = Vector3.Lerp( transform.position, targetPosition, Time.deltaTime * interpolationSpeed ); // 回転を補間 transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * interpolationSpeed ); // 補間の終了判定 if (Vector3.Distance(transform.position, targetPosition) < 0.1f) { isInterpolating = false; } } } |
このコードでは、イベントターゲットを設定し、カメラを滑らかに移動させています。
異なる補間速度の設定
位置と回転で異なる補間速度を設定する実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class CameraInterpolationSeparate : MonoBehaviour { public Vector3 targetPosition; public Quaternion targetRotation; public float positionSpeed = 5f; // 位置の補間速度 public float rotationSpeed = 2f; // 回転の補間速度 void Update() { // 位置を補間(速い速度) transform.position = Vector3.Lerp( transform.position, targetPosition, Time.deltaTime * positionSpeed ); // 回転を補間(遅い速度) transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |
このコードでは、位置と回転で異なる補間速度を設定しています。

まとめ

この記事では、カメラを滑らかに補間する計算方法について見てきました。
重要なポイントをおさらいします。
- カメラ補間は、位置と回転を別々に補間することで実現できる
- 位置の補間にはLerp、回転の補間にはSlerpを使う
- Time.deltaTimeを使った固定速度か、一定の割合を適用することが重要
- 補間の終了判定を追加すれば、無限に補間し続けることを防げる
- イベントシーンや視点切り替えなど、様々な場面で活用できる
カメラ補間は、ゲームの演出に欠かせない重要な技術です。
位置と回転を別々に補間すれば、滑らかな視点移動が実現できます。
まずは、基本的な実装から始めて、実際の動作を確認してみましょう。
実際に試してみることで、カメラ補間の効果を実感できるはずです。
数学的な理論だけでなく、実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、シェーダーと描画処理を実装とセットで学べるUnity入門の森・永久会員講座への導線を用意しています。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント