オブジェクトを回転させたい時、いきなり目標の角度に設定すると、動きがカクついて見えます。
滑らかに回転させたいけど、どうすればいいのか分からない。
そんな悩みを抱えていませんか。
オブジェクトを滑らかに回転させるには、補間(Interpolation)という技術を使います。
Unityでは、Lerp(線形補間)とSlerp(球面線形補間)の2つの方法があり、それぞれ適した場面が異なります。
この記事では、オブジェクトを滑らかに回転させる方法を、Unity実装例とともに解説します。
滑らかな回転とは何か(ゲーム制作目線)

滑らかな回転とは、現在の回転状態から目標の回転状態へ、一定の速度で徐々に変化させることです。
いきなり目標の角度に設定するのではなく、中間状態を計算して、フレームごとに更新していきます。
ゲームでは、キャラクターの向き変更、カメラの回転、ドアの開閉、武器の向き調整など、様々な場面で滑らかな回転が必要です。
Unityでは、クォータニオンを使った回転補間が一般的です。
クォータニオンは、3D空間での回転を表現するための数学的な表現方法です。
オイラー角(角度で表す方法)と違い、ジンバルロックという問題が起きにくいのが特徴です。
LerpとSlerpの使い分け
滑らかな回転を実現する方法には、大きく2つあります。
Lerp(Linear Interpolation、線形補間)は、2つのクォータニオンを直線的に補間する方法です。
計算が簡単で、パフォーマンスに優れています。
ただし、回転角度が大きい場合、回転速度が一定にならないため、見た目が不自然になることがあります。
Slerp(Spherical Linear Interpolation、球面線形補間)は、球面上を等速で移動する補間方法です。
回転速度が一定になるため、滑らかで自然な回転を実現できます。
ただし、計算コストが高く、パフォーマンスへの影響があります。
使い分けの目安として、回転角度が小さい(30度以下)場合はLerp、大きい(90度以上)場合はSlerpがおすすめです。
ゲームでの具体的な使い道

滑らかな回転が、ゲームでどう使われているか、具体的なシーンを確認してみましょう。
キャラクターの向き変更
プレイヤーキャラクターが、マウスの方向を向く時、滑らかな回転が必要です。
TPSゲームやアクションゲームで、キャラクターがカメラの方向を向く場面です。
いきなり向きが変わると、操作感が悪くなります。
滑らかに回転させることで、自然な動きになります。
カメラの視点切り替え
カメラが特定の方向へ回転する時も、滑らかな回転が重要です。
ボス戦の開始時や、イベントシーンでカメラが視点を切り替える場面です。
カメラが急に回転すると、プレイヤーが迷子になってしまいます。
滑らかに回転させることで、見やすい演出になります。
ドアや宝箱の開閉
ドアや宝箱が開く時の回転アニメーションでも、滑らかな回転が使われます。
開き始めから閉じ終わりまで、一定の速度で回転すれば、見た目が自然です。
武器の向き調整
FPSゲームで、武器が敵を向く時にも、滑らかな回転が役立ちます。
武器の向きを、プレイヤーの視線方向に滑らかに合わせることで、狙いやすくなります。
急に向きが変わると、狙いが取りづらくなってしまうんです。
- キャラクターの向き変更
- カメラの視点切り替え
- ドアや宝箱の開閉アニメーション
- 武器の向き調整
- UI要素の回転アニメーション
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

滑らかな回転の仕組みは、「補間による中間状態の計算」という考え方で理解できますね。
補間の基本概念
補間とは、2つの値の間を、指定した割合で計算することです。
例えば、0度から90度まで回転する時、補間係数tが0.5の場合は、45度の中間状態を計算します。
毎フレーム、補間係数を更新すれば、徐々に目標の角度に近づいていきます。
Lerpによる補間
Lerpは、2つのクォータニオンを直線的に補間します。
計算式は、以下のようになります。
Lerp(q₁, q₂, t) = q₁ + (q₂ – q₁) × t
ここで、q₁は現在の回転、q₂は目標の回転、tは補間係数(0.0〜1.0)です。
tが0なら現在の回転、tが1なら目標の回転になります。
Slerpによる補間
Slerpは、球面上を等速で移動する補間方法です。
計算式は、以下のようになります。
Slerp(q₁, q₂, t) = (sin((1-t)θ) / sin(θ)) × q₁ + (sin(tθ) / sin(θ)) × q₂
ここで、θは2つのクォータニオン間の角度です。
この式により、球面上を等速で移動できるため、回転速度が一定になります。
毎フレームの更新
滑らかな回転を実現するには、毎フレーム補間を更新します。
Update関数内で、現在の回転を目標の回転に向けて補間します。
Time.deltaTimeを使うことで、フレームレートに依存しない一定の速度で回転できますね。
- 補間係数tを毎フレーム同じ値で更新すると、ゴールに到達しない場合がある
- Time.deltaTimeを使った固定速度か、一定の割合を適用することが重要
- 回転角度が小さい場合はLerp、大きい場合はSlerpを使う
Unityで実装する際の注意点(代表例)

Unityで滑らかな回転を実装する場合の注意点を見ていきましょう。
Lerpを使った基本的な実装
回転角度が小さい場合、Lerpを使った実装がおすすめです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class SmoothRotation : MonoBehaviour { public Transform target; public float rotationSpeed = 5f; void Update() { if (target == null) return; // 目標の回転を計算 Vector3 direction = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(direction); // Lerpで滑らかに回転 transform.rotation = Quaternion.Lerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |
このコードでは、オブジェクトがターゲットの方向を向くように、滑らかに回転します。
Slerpを使った実装
回転角度が大きい場合、Slerpを使った実装がおすすめです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class SmoothRotationSlerp : MonoBehaviour { public Transform target; public float rotationSpeed = 5f; void Update() { if (target == null) return; // 目標の回転を計算 Vector3 direction = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(direction); // Slerpで滑らかに回転(回転速度が一定) transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |
このコードでは、Slerpを使うことで、回転速度が一定になります。
回転角度による使い分け
回転角度に応じて、LerpとSlerpを自動で使い分ける実装です。
|
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 |
public class AdaptiveSmoothRotation : MonoBehaviour { public Transform target; public float rotationSpeed = 5f; public float angleThreshold = 45f; // この角度を超えたらSlerpを使う void Update() { if (target == null) return; // 目標の回転を計算 Vector3 direction = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(direction); // 現在の回転と目標の回転の角度差を計算 float angle = Quaternion.Angle(transform.rotation, targetRotation); // 角度に応じてLerpとSlerpを使い分け if (angle > angleThreshold) { // 角度が大きい場合、Slerpを使用 transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } else { // 角度が小さい場合、Lerpを使用 transform.rotation = Quaternion.Lerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } } |
このコードでは、回転角度に応じて、自動でLerpとSlerpを切り替えます。
補間の終了判定
目標の回転に近づいたら、補間を終了する処理を追加します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
void Update() { Vector3 direction = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(direction); // 角度差を計算 float angle = Quaternion.Angle(transform.rotation, targetRotation); // 十分近づいたら直接設定 if (angle < 0.1f) { transform.rotation = targetRotation; } else { // 滑らかに回転 transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |
このコードでは、角度差が0.1度以下になったら、直接目標の回転を設定します。
これにより、無限に補間し続けることを防げます。
カメラの回転への応用
カメラを滑らかに回転させる例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class SmoothCameraRotation : MonoBehaviour { public Transform target; public float rotationSpeed = 2f; void Update() { if (target == null) return; // カメラからターゲットへの方向 Vector3 direction = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(direction); // Slerpで滑らかに回転(カメラはSlerpが推奨) transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |
カメラの回転には、Slerpが推奨されます。
理由は、回転角度が大きくなることが多く、回転速度を一定に保ちたいためです。

まとめ

この記事では、オブジェクトを滑らかに回転させる方法について見てきました。
重要なポイントをおさらいします。
- 滑らかな回転は、補間(Interpolation)という技術で実現できる
- LerpとSlerpの2つの方法があり、回転角度に応じて使い分けることが重要
- 回転角度が小さい(30度以下)場合はLerp、大きい(90度以上)場合はSlerpが推奨
- 毎フレーム補間を更新すれば、滑らかな回転が実現できる
- カメラの回転など、回転速度を一定に保ちたい場面ではSlerpが有効
滑らかな回転は、ゲームの操作感や見た目を大きく左右する重要な要素です。
LerpとSlerpを適切に使い分けることで、より自然で滑らかな動きを実現できます。
まずは、基本的な実装から始めて、実際の動作を確認してみましょう。
実際に試してみることで、LerpとSlerpの違いを実感できるはずです。
数学的な理論だけでなく、実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、クォータニオンを含む回転処理を、実装しながら体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント