ゲーム開発でカメラを実装しようとすると、カメラがカクついて見えることがあります。
「カメラの動きを滑らかにするには?」
「補間ってどうやって計算するの?」
「LerpとSlerpの違いは?」
そんな疑問を抱えている方に向けて、カメラ補間の計算方法について、初心者でも理解できるように解説します。
\読むだけで終わらせない!実際にゲームを作って実力をつけよう/
トレンド×入門に最適
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。今もっとも人気のデッキ構築型ゲームをJRPGと組み合わせて実装。初心者が最初に選ぶ一本として最適です。
王道アクションに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
ロックマン風の本格横スクロールACTをスマホ化・広告実装まで対応。7ステージ+ラスボスという市販ゲームに近い本格構成で、リリースまで見据えて作れます。
3D入門に最適
ゼルダ風3Dアクションゲーム
の作り方講座
ゼルダの伝説・モンハン・原神のような3Dアクションをスマホ対応で作れる入門講座。初心者でも全16回でしっかり3D開発の基礎を習得できます。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
カメラ補間とは何か
カメラ補間とは、カメラの現在位置と目標位置の間を滑らかに移動させる技術です。
補間を使わずにカメラを移動させると、カメラが目標位置に即座にジャンプしてしまい、動きが不自然に見えます。
補間を使うことで、カメラが滑らかに移動し、プレイヤーにとって快適な視点を提供できるんです。
補間の必要性
カメラが目標位置に直接移動すると、以下のような問題が発生します。
- カクつき:カメラが突然ジャンプして、動きが不自然
- 酔い:急激な動きで、プレイヤーが気分が悪くなる
- 追従の遅れ:プレイヤーの動きに対して、カメラが追いつけない
補間を使うことで、これらの問題を解決できます。
補間の種類
カメラ補間には、主に以下のような方法があります。
- 線形補間(Lerp):2点間を直線的に補間
- 球面線形補間(Slerp):回転を滑らかに補間
- イージング:減速や加速を加えた補間
- カメラの動きを滑らかにする技術
- プレイヤーにとって快適な視点を提供
- LerpやSlerpなどの補間方法がある
- 適切な補間速度の設定が重要
線形補間(Lerp)の基礎
線形補間(Linear Interpolation、略してLerp)は、最も基本的な補間方法です。
Lerpの数学的基礎
Lerpは、2つの値の間を一定の割合で補間します。
数式で表すと以下の通りです。
|
1 2 |
result = start + (end - start) * t |
tは0から1の間の値で、0の場合はstart、1の場合はendになります。
tが0.5の場合は、startとendのちょうど中間の値になります。
UnityでのLerp
Unityでは、Vector3.LerpやMathf.Lerpが提供されています。
|
1 2 3 4 5 6 7 |
// 位置の補間 Vector3 currentPosition = transform.position; Vector3 targetPosition = new Vector3(10, 5, 0); float t = 0.5f; // 50%の割合で補間 Vector3 interpolatedPosition = Vector3.Lerp(currentPosition, targetPosition, t); |
時間ベースのLerp
カメラ補間では、時間ベースでLerpを適用するのが一般的です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public float smoothSpeed = 5.0f; // 補間速度 void Update() { Vector3 currentPosition = transform.position; Vector3 targetPosition = target.transform.position; // 時間ベースで補間 float t = smoothSpeed * Time.deltaTime; transform.position = Vector3.Lerp(currentPosition, targetPosition, t); } |
Time.deltaTimeを使うことで、フレームレートに依存しない滑らかな補間が可能になります。
滑らかなカメラ追従の実装
Lerpを使った滑らかなカメラ追従を実装する方法を見ていきましょう。
基本的な追従カメラ
|
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 |
using UnityEngine; public class SmoothFollowCamera : MonoBehaviour { [Header("追従設定")] public Transform target; public Vector3 offset = new Vector3(0, 5, -10); public float smoothSpeed = 5.0f; void LateUpdate() { if (target == null) return; // 目標位置を計算 Vector3 desiredPosition = target.position + offset; // 滑らかに移動 transform.position = Vector3.Lerp( transform.position, desiredPosition, smoothSpeed * Time.deltaTime ); // 対象を見る transform.LookAt(target); } } |
この実装では、カメラが目標位置に向かって滑らかに移動します。
位置と向きの両方を補間
カメラの位置だけでなく、向きも滑らかに補間できます。
|
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 |
using UnityEngine; public class SmoothCameraController : MonoBehaviour { public Transform target; public Vector3 offset = new Vector3(0, 5, -10); public float positionSmoothSpeed = 5.0f; public float rotationSmoothSpeed = 5.0f; void LateUpdate() { if (target == null) return; // 位置の補間 Vector3 desiredPosition = target.position + offset; transform.position = Vector3.Lerp( transform.position, desiredPosition, positionSmoothSpeed * Time.deltaTime ); // 向きの補間(回転) Quaternion desiredRotation = Quaternion.LookRotation(target.position - transform.position); transform.rotation = Quaternion.Lerp( transform.rotation, desiredRotation, rotationSmoothSpeed * Time.deltaTime ); } } |
Quaternion.Lerpを使うことで、回転も滑らかに補間できます。
独立したX/Y/Z軸の補間速度
各軸ごとに異なる補間速度を設定することもできます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public Vector3 smoothSpeed = new Vector3(5.0f, 3.0f, 5.0f); // X, Y, Z軸ごとの速度 void LateUpdate() { Vector3 currentPosition = transform.position; Vector3 desiredPosition = target.position + offset; // 各軸ごとに補間 float newX = Mathf.Lerp(currentPosition.x, desiredPosition.x, smoothSpeed.x * Time.deltaTime); float newY = Mathf.Lerp(currentPosition.y, desiredPosition.y, smoothSpeed.y * Time.deltaTime); float newZ = Mathf.Lerp(currentPosition.z, desiredPosition.z, smoothSpeed.z * Time.deltaTime); transform.position = new Vector3(newX, newY, newZ); } |
これにより、Y軸方向(上下)の動きを遅くして、X/Z軸方向(水平)の動きを速くするなど、細かな調整が可能になります。
球面線形補間(Slerp)の活用
回転を補間する際には、球面線形補間(Spherical Linear Interpolation、略してSlerp)が適しています。
LerpとSlerpの違い
Quaternionの補間では、LerpとSlerpの違いが重要になります。
- Lerp:角度が小さい場合に適している(高速)
- Slerp:角度が大きい場合に適している(滑らか)
Slerpを使った回転補間
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public float rotationSmoothSpeed = 5.0f; void LateUpdate() { Quaternion currentRotation = transform.rotation; Quaternion desiredRotation = Quaternion.LookRotation(target.position - transform.position); // Slerpで滑らかに回転 transform.rotation = Quaternion.Slerp( currentRotation, desiredRotation, rotationSmoothSpeed * Time.deltaTime ); } |
Quaternion.Slerpを使うことで、回転がより滑らかになります。
LerpとSlerpの使い分け
一般的には、回転角が小さい場合はLerp、大きい場合はSlerpが適しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Quaternion currentRotation = transform.rotation; Quaternion desiredRotation = Quaternion.LookRotation(target.position - transform.position); float angle = Quaternion.Angle(currentRotation, desiredRotation); if (angle < 10f) { // 角度が小さい場合はLerp transform.rotation = Quaternion.Lerp(currentRotation, desiredRotation, smoothSpeed * Time.deltaTime); } else { // 角度が大きい場合はSlerp transform.rotation = Quaternion.Slerp(currentRotation, desiredRotation, smoothSpeed * Time.deltaTime); } |
これにより、状況に応じて最適な補間方法を選択できます。
イージング関数の活用
イージング関数を使うことで、より自然なカメラの動きを実現できます。
イージングとは
イージングは、補間に加速や減速を加える技術です。
等速で移動するのではなく、最初はゆっくりで徐々に速くなる、または最初は速くて徐々に遅くなるなどの動きを実現できます。
イージング関数の実装
|
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 |
// Ease-In(最初は遅く、徐々に速くなる) float EaseIn(float t) { return t * t; } // Ease-Out(最初は速く、徐々に遅くなる) float EaseOut(float t) { return 1f - (1f - t) * (1f - t); } // Ease-In-Out(最初と最後が遅く、中間が速い) float EaseInOut(float t) { return t < 0.5f ? 2f * t * t : 1f - Mathf.Pow(-2f * t + 2f, 2f) / 2f; } // Lerpと組み合わせて使用 void Update() { Vector3 currentPosition = transform.position; Vector3 targetPosition = target.position + offset; float distance = Vector3.Distance(currentPosition, targetPosition); float maxDistance = 10f; float t = Mathf.Clamp01(distance / maxDistance); t = EaseOut(t); // イージングを適用 transform.position = Vector3.Lerp(currentPosition, targetPosition, smoothSpeed * Time.deltaTime * (1f + t)); } |
イージング関数を使うことで、より自然なカメラの動きを実現できます。
アニメーションカーブを使ったイージング
UnityのAnimationCurveを使うと、より柔軟なイージングが可能です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public AnimationCurve easingCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); void Update() { Vector3 currentPosition = transform.position; Vector3 targetPosition = target.position + offset; float distance = Vector3.Distance(currentPosition, targetPosition); float normalizedDistance = Mathf.Clamp01(distance / maxDistance); float easingValue = easingCurve.Evaluate(normalizedDistance); float adjustedSpeed = smoothSpeed * (1f + easingValue); transform.position = Vector3.Lerp(currentPosition, targetPosition, adjustedSpeed * Time.deltaTime); } |
インスペクターでカーブを編集できるため、細かな調整が可能になります。
Unityでの実装例(C#コード)
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
using UnityEngine; public class AdvancedFollowCamera : MonoBehaviour { [Header("追従設定")] public Transform target; public Vector3 offset = new Vector3(0, 5, -10); [Header("補間設定")] public float positionSmoothSpeed = 5.0f; public float rotationSmoothSpeed = 5.0f; public bool useSlerpForRotation = true; [Header("軸ごとの補間速度")] public bool useIndependentAxes = false; public Vector3 axisSmoothSpeed = new Vector3(5.0f, 3.0f, 5.0f); [Header("イージング")] public bool useEasing = false; public AnimationCurve easingCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); public float maxDistanceForEasing = 10f; void LateUpdate() { if (target == null) return; Vector3 desiredPosition = target.position + offset; Vector3 currentPosition = transform.position; // イージングの適用 float adjustedSpeed = positionSmoothSpeed; if (useEasing) { float distance = Vector3.Distance(currentPosition, desiredPosition); float normalizedDistance = Mathf.Clamp01(distance / maxDistanceForEasing); float easingValue = easingCurve.Evaluate(normalizedDistance); adjustedSpeed = positionSmoothSpeed * (1f + easingValue); } // 位置の補間 if (useIndependentAxes) { float newX = Mathf.Lerp(currentPosition.x, desiredPosition.x, axisSmoothSpeed.x * Time.deltaTime); float newY = Mathf.Lerp(currentPosition.y, desiredPosition.y, axisSmoothSpeed.y * Time.deltaTime); float newZ = Mathf.Lerp(currentPosition.z, desiredPosition.z, axisSmoothSpeed.z * Time.deltaTime); transform.position = new Vector3(newX, newY, newZ); } else { transform.position = Vector3.Lerp( currentPosition, desiredPosition, adjustedSpeed * Time.deltaTime ); } // 回転の補間 Quaternion desiredRotation = Quaternion.LookRotation(target.position - transform.position); if (useSlerpForRotation) { transform.rotation = Quaternion.Slerp( transform.rotation, desiredRotation, rotationSmoothSpeed * Time.deltaTime ); } else { transform.rotation = Quaternion.Lerp( transform.rotation, desiredRotation, rotationSmoothSpeed * Time.deltaTime ); } } } |
このクラスでは、様々な補間オプションを組み合わせて、柔軟なカメラ制御が可能になります。
- LateUpdateを使うことで、プレイヤーの移動後にカメラを更新できる
- Time.deltaTimeを掛けることで、フレームレートに依存しない補間になる
- 補間速度が速すぎると、カメラがブレる可能性がある
- 補間速度が遅すぎると、カメラが追従しきれなくなる
カメラ補間の実装手順
※この順番を守らずに作り始めると、だいたい後で全部作り直すことになります。
- STEP1基本的な追従を実装
まず、補間を使わない基本的な追従カメラを実装します。目標位置を直接設定して、動作を確認しましょう。
- STEP2Lerpの追加
Vector3.Lerpを使って、位置の補間を追加します。Time.deltaTimeを掛けて、フレームレートに依存しない補間にしましょう。
- STEP3回転の補間
Quaternion.LerpまたはSlerpを使って、回転も補間します。必要に応じて、LerpとSlerpを使い分けましょう。
- STEP4パラメータの調整
補間速度などのパラメータを調整して、快適な動きにします。インスペクターで調整できるようにしておくと便利です。
- STEP5イージングの追加(オプション)
必要に応じて、イージング関数を追加します。AnimationCurveを使うと、柔軟な調整が可能になります。
よくある問題と解決方法
カメラ補間を実装する際によくある問題と、その解決方法を紹介します。
カメラが目標位置に到達しない
Lerpは、完全に目標位置に到達することはありません(理論上は無限に近づくだけ)。
一定の距離以下になったら、直接設定する方法があります。
|
1 2 3 4 5 6 7 8 9 10 11 |
float distance = Vector3.Distance(transform.position, targetPosition); if (distance < 0.01f) { transform.position = targetPosition; // 直接設定 } else { transform.position = Vector3.Lerp(transform.position, targetPosition, smoothSpeed * Time.deltaTime); } |
カメラがブレる
補間速度が速すぎると、カメラがブレる可能性があります。
|
1 2 3 4 5 6 |
// ❌ 速すぎる補間速度 float smoothSpeed = 50.0f; // ブレる可能性がある // ✅ 適切な補間速度 float smoothSpeed = 5.0f; // 滑らかに動く |
一般的には、3.0〜10.0の範囲が使いやすいです。
低フレームレートで不自然な動き
Time.deltaTimeを使っていても、低フレームレートでは不自然な動きになることがあります。
|
1 2 3 4 |
// Time.deltaTimeをクランプして、極端な値に対応 float deltaTime = Mathf.Min(Time.deltaTime, 0.1f); // 最大0.1秒 transform.position = Vector3.Lerp(transform.position, targetPosition, smoothSpeed * deltaTime); |
カメラが壁を通り抜ける
補間中にカメラが壁を通り抜ける場合は、レイキャストで衝突を検出します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Vector3 currentPosition = transform.position; Vector3 targetPosition = desiredPosition; Vector3 direction = targetPosition - currentPosition; float distance = direction.magnitude; RaycastHit hit; if (Physics.Raycast(currentPosition, direction.normalized, out hit, distance)) { // 壁にぶつかった場合は、壁の手前で止める targetPosition = hit.point - direction.normalized * 0.5f; } transform.position = Vector3.Lerp(currentPosition, targetPosition, smoothSpeed * Time.deltaTime); |
- カメラが到達しない → 一定距離以下で直接設定する
- カメラがブレる → 補間速度を下げる(3.0〜10.0の範囲)
- 低フレームレートで不自然 → Time.deltaTimeをクランプする
- 壁を通り抜ける → レイキャストで衝突を検出する
カメラ補間の学習を深めるには
カメラ補間の基礎を理解した後は、さらに深く学んでいくことが大切です。
Unity入門の森では、ゲーム開発に必要な知識を体系的に学べる環境が整っています。
特に、FPSゲーム講座(弓矢3D)では、カメラ制御の実践的な使い方を学べます。
また、永久会員チケットでは、ゲーム開発全般に関する知識を幅広くカバーしているため、カメラ補間以外にも応用できる知識が身につきます。
カメラ補間の基礎から応用まで、実際のコードと紐付けて学べるので、理解が深まりやすいはずです。
- カメラ補間の基本的な概念と必要性
- LerpとSlerpの違いと使い分け
- 滑らかなカメラ追従の実装方法
- イージング関数の活用方法
- Unityでの実装例(C#コード)
記事を読んで「作ってみたい!」と思ったら!人気ゲームを題材にした講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。人気タイトルをモデルにした講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!トレンドのデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも取り組みやすい丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つを合わせて学ぶのがおすすめ
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、今もっともトレンドのデッキ構築型ゲームシステムをJRPGと組み合わせて実装する方法を学べる講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、コラムやTIPSで読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「Slay the Spireみたいなゲームを自分でも作ってみたい!」という人の最初の一歩として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
トレンドのデッキ構築×JRPGを最速で実装しよう
→ スレスパ風デッキ構築JRPG講座を見てみる
スマホ対応の最新環境で、ゲーム開発の第一歩を踏み出そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!スマホ化・広告実装まで対応した本格横スクロールACTを作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの市販ゲームに近い本格的なゲーム設計
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを開発できるようになる本格的な講座です。
TIPSやコラムで学んだ当たり判定・物理挙動・敵AIの知識を、実際のゲームコードとして実装する体験が全16回に凝縮されています。スマホ化・広告実装まで対応しているため、作って終わりではなくリリースまで見据えた実践スキルが身につきます。
「読んで理解した知識を、動くゲームとして形にしたい」という人に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
ロックマン風の2Dアクションゲームをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
広告収益まで視野に入れた実践スキルを今すぐ手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを作りたい人におすすめの入門講座です。
コラム・TIPSで「3Dゲームはなんとなく難しそう」と感じていた人でも、全16回の丁寧な解説で確実に完成まで到達できます。スマホ化対応で実機で動かせるため、作った達成感がひときわ大きい講座です。
「3Dゲームの仕組みを理解した次は、実際に自分で作ってみたい」という人の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の第一歩を踏み出そう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
3D開発の壁を一気に突破!スマホで動くオリジナルゲームを完成させよう!
まとめ

この記事では、カメラ補間の計算方法について解説しました。
カメラ補間は、LerpやSlerpを使うことで、カメラの動きを滑らかにする技術です。
適切な補間速度を設定することで、プレイヤーにとって快適な視点を提供できます。
「カメラ補間って難しそう💧」と感じる方もいるかもしれませんが、Unityの便利な機能を使えば、比較的簡単に実装できます。
まずは基本的なLerpから始めて、徐々に高度な補間技術に挑戦していきましょう。
- カメラ補間は、カメラの動きを滑らかにする技術
- Lerpは位置の補間、Slerpは回転の補間に適している
- Time.deltaTimeを使うことで、フレームレートに依存しない補間になる
- 補間速度は3.0〜10.0の範囲が一般的に使いやすい
- イージング関数を使うことで、より自然な動きを実現できる
まずは基本的な実装から始めて、徐々に応用的な機能に挑戦していきましょう。
Unity入門の森では、カメラ補間の基礎から応用まで、実践的な知識を体系的に学べる環境が整っています。
疑問があれば、ぜひ活用してみてください。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。





コメント