Lerpで滑らかな移動を実装したいけど、計算式がどうなっているのか分からない。
UnityのVector3.Lerpを使うだけでいいのか、それとも手動で計算する必要があるのか。
そんな疑問を抱えていませんか。
Lerpの計算式は、「開始値 + (終了値 – 開始値) × 補間係数」というシンプルな式です。
この記事では、Lerpの計算式の仕組みと、Unityでの実装方法を見ていきましょう。
Lerpの計算式とは何か(ゲーム制作目線)

ゲーム制作においてLerpの計算式は、2つの値の間を直線的につなぎ、その途中の値を割り出すために使われます。
Unityでは内部でどのような計算が行われているのか、2つの数式からその仕組みを紐解いていきましょう。
1. 変化量から考える計算式
まずは、プログラミングで一般的に使われる、直感的な数式です。
result = a + (b - a) × tここで、各変数は以下の意味を持ちます。
- a:開始値(スタート地点)
- b:終了値(ゴール地点)
- t:補間係数(0.0〜1.0の「割合」)
この式は、「スタート地点(a)から、ゴールまでの距離(b – a)の、tパーセント分だけ進む」という考え方に基づいています。
たとえば、tが0.5ならちょうど中間、tが1ならゴールに到達するというわけですね。
2. 重み付けで考える「数学的に美しい」計算式
もう一歩踏み込んで、数学的な「内分点」の考え方で表すと、以下のような式になります。
数学ブログや論文などでは、こちらの形式で書かれることも多い「格調高い」表現です。
この式は、「aとbをどのくらいの比率で混ぜるか」という重み付けを表しています。
- $t=0$ のとき: $1 \times a + 0 \times b = a$ (100%スタート地点)
- $t=0.1$ のとき: $0.9 \times a + 0.1 \times b$ (aを9割、bを1割混ぜる)
- $t=1$ のとき: $0 \times a + 1 \times b = b$ (100%ゴール地点)
実は、計算機(コンピュータ)の世界では、こちらの式のほうが「tが1のときに、浮動小数点の誤差に邪魔されず確実にゴール(b)へ到達しやすい」という隠れたメリットもあります。
Unityでの自動計算
Unityでは、Vector3.LerpやMathf.Lerpなどの関数が標準で用意されており、これらの計算をすべて自動で行ってくれます。
「わざわざ手動で計算しなくてもいいのでは?」と思うかもしれませんが、計算式の仕組み(特に割合tの意味)を理解しておくことで、後述する「滑らかな加速・減速」や「独自カスタマイズ」が格段に実装しやすくなります。
ゲームでの具体的な使い道

Lerpの計算式が、ゲームでどう活用されているか確認してみましょう。
位置の補間計算
キャラクターの位置を滑らかに移動させる際、Lerpの計算式を使って、現在位置から目標位置までの間を補間します。
毎フレーム、補間係数を更新すれば、徐々に目標位置に近づいていきます。
カメラの追従や、UI要素の移動でも同様の計算が行われます。
色の補間計算
画面のフェードイン・フェードアウトでは、アルファ値を0から1(または1から0)へ補間します。
Lerpの計算式を使えば、滑らかな色の変化を実現できますね。
回転の補間計算
オブジェクトの回転を滑らかに変化させる際も、Lerpの計算式が使われます。
ただし、回転の補間にはSlerp(球面線形補間)を使う方が自然な場合が多いです。
数値の補間計算
HPゲージや経験値ゲージの増減でも、Lerpの計算式が活用されます。
現在の値を目標値へ、一定の割合で補間すれば、滑らかな変化を実現できます。
Lerpの計算式が使われる場面
- 位置の補間(移動、カメラの追従など)
- 色の補間(フェードイン・フェードアウト、色の遷移など)
- スケールの補間(拡大・縮小アニメーション)
- 数値の補間(ゲージの増減、スコア表示など)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

Lerpの計算式は、「2点間を直線で結ぶ」という考え方で理解できます。
基本的な計算の流れ
例えば、開始値が0、終了値が10の場合を考えましょう。
補間係数tが0.3の時:
– result = 0 + (10 – 0) × 0.3
– result = 0 + 10 × 0.3
– result = 3
補間係数tが0.7の時:
– result = 0 + (10 – 0) × 0.7
– result = 0 + 10 × 0.7
– result = 7
このように、補間係数に応じて、開始値と終了値の間の値を計算できます。
ベクトルでの計算
3D空間での位置の補間では、X、Y、Zの各成分を独立して補間します。
Vector3.Lerpは、内部的に各成分に対してLerpの計算を行っています。
毎フレームの補間係数の更新
滑らかな移動を実現するには、毎フレーム補間係数を更新します。
Time.deltaTimeを使った固定速度で移動する場合と、一定の割合を適用する場合があります。
どちらを使うかは、目的に応じて選択します。
⚠️ 重要なポイント
- Lerpの計算式は「a + (b – a) × t」で表される
- 補間係数tは0.0〜1.0の範囲で、0なら開始値、1なら終了値が返される
- 毎フレーム同じtの値を使うと、ゴールに到達しないため注意が必要
- ベクトルの補間では、各成分を独立して補間する
Unityで実装する際の注意点(代表例)

UnityでLerpを使いこなすためには、関数の使い方だけでなく、目的の動きに合わせた「t(補間係数)」の制御を知っておくことが不可欠です。
UnityのLerp関数の使い方
Unityには、数値用の Mathf.Lerp やベクトル用の Vector3.Lerp など、型に合わせた関数が用意されています。
これらを使うことで、複雑な成分計算を一行で記述できます。
|
1 2 3 4 5 6 7 8 |
// 数値の補間(0から10の50%の位置を取得) float result = Mathf.Lerp(0f, 10f, 0.5f); // 結果: 5 // ベクトルの補間(開始地点と終了地点の中間座標を取得) Vector3 startPos = new Vector3(0, 0, 0); Vector3 endPos = new Vector3(10, 10, 10); Vector3 currentPos = Vector3.Lerp(startPos, endPos, 0.5f); // 結果: (5, 5, 5) |
手動で計算する場合
自作のクラスや特定の最適化が必要な場合、計算式を直接コードに書くこともあります。
先ほど解説した「変化量」を使った基本式をそのまま適用します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
float ManualLerp(float a, float b, float t) { // 基本式:開始値 + 差分 × 割合 return a + (b - a) * t; } Vector3 ManualLerpVector3(Vector3 a, Vector3 b, float t) { // 各成分ごとに計算を行う return new Vector3( a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t ); } |
第3引数「t」による挙動の違い:一定速度 vs 減速
ここが最も重要なポイントです。
Lerpで移動を実装する場合、「第1引数(現在地)を毎フレーム更新するかどうか」で動きが劇的に変わります。
1. 一定の速度で移動させる(線形補間)
スタート地点を固定し、経過時間を累積して $t$ に渡すパターンです。
等速でパキッとした動きになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class LinearMovement : MonoBehaviour { public Vector3 startPosition; public Vector3 targetPosition; float t = 0; void Update() { // 時間を蓄積して0から1へ進める t += Time.deltaTime * 0.5f; // 2秒かけて移動 transform.position = Vector3.Lerp(startPosition, targetPosition, t); } } |
2. 滑らかに減速して近づける(イージング)
第1引数に「現在の自分の位置」を渡し続けるパターンです。
目標に近づくほど移動距離が短くなるため、吸い込まれるような滑らかな減速(指数減速)になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void Update() { // 毎フレーム、現在地から目標へ10%ずつ近づく // 第1引数に自分自身の現在地を入れるのがコツ transform.position = Vector3.Lerp(transform.position, targetPosition, 0.1f); // 十分近づいたらピタッと合わせる if (Vector3.Distance(transform.position, targetPosition) < 0.01f) { transform.position = targetPosition; } } |
Unclamped Lerpとの違い
通常のLerpは、もし $t$ に 1.5 などの範囲外の数値が入っても、自動的に 0〜1 の間に制限(クランプ)してくれます。
対して、制限をかけずに「突き抜けた値」が欲しい場合は LerpUnclamped を使用します。
|
1 2 3 4 5 6 |
// 通常のLerp:tが1.0を超えても1.0として扱われる float result1 = Mathf.Lerp(0f, 10f, 1.5f); // 結果: 10 // Unclamped Lerp:tが1.0を超えた分だけ外側へ突き抜ける float result2 = Mathf.LerpUnclamped(0f, 10f, 1.5f); // 結果: 15 |

まとめ

この記事では、Lerpの計算式について見てきました。
重要なポイントをおさらいします。
重要なポイント:
- Lerpの計算式は「a + (b – a) × t」で、2つの値の間を直線的に補間する
- 補間係数tは0.0〜1.0の範囲で、0なら開始値、1なら終了値が返される
- UnityではVector3.LerpやMathf.Lerpなどの関数が用意されている
- 毎フレーム同じtの値を使うとゴールに到達しないため、Time.deltaTimeを使った速度や一定の割合を適用する
- 計算式を理解すれば、より柔軟で効果的な実装が可能になる
Lerpの計算式は、ゲーム開発で頻繁に使われる重要な技術です。
シンプルな式ながら、様々な場面で活用できます。
Unityの関数を使う場合も、計算式を理解しておくことで、より効果的に使えるようになりますね。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、Lerpを含む補間処理を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント