Rigidbody
を使った回転Rigidbody
を使用することで、物理エンジンを介した回転を制御することができます。この方法は、物理的な力を使って回転させたいときに適しています。
public class RotateWithRigidbody : MonoBehaviour {
public float rotationSpeed = 100f;
private Rigidbody rb;
void Start() {
rb = GetComponent<Rigidbody>();
}
void FixedUpdate() {
float inputX = Input.GetAxis("Horizontal");
rb.MoveRotation(rb.rotation * Quaternion.Euler(0, inputX * rotationSpeed * Time.fixedDeltaTime, 0));
}
}
Rigidbody
のMoveRotation
は、物理エンジンによって制御され、コリジョンや物理的な力(トルク)との相互作用を考慮します。Quaternion.Slerp
(球面線形補間)Quaternion.Slerp
は、2つの回転の間をスムーズに補間(徐々に変化)させる手法です。滑らかな回転を実現したいときに使います。
ターゲットと同じ方向を向くサンプルコードです
public class SmoothRotation : MonoBehaviour {
public Transform target;
public float rotationSpeed = 1.0f;
void Update() {
// 現在の回転とターゲットの回転の間を補間する
transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, rotationSpeed * Time.deltaTime);
}
}
Slerp
は線形補間と違い、球面上での回転の補間を行うため、角度が大きく異なる場合でも滑らかに補間が可能です。Lerp
による回転Lerp
(線形補間)は、2つの値の間を徐々に変化させる手法で、回転にも応用できます。厳密にはQuaternion.Slerp
の方が回転には適していますが、軽い処理にはLerp
も使われます。
public class LerpRotation : MonoBehaviour {
public Transform target;
public float lerpSpeed = 1.0f;
void Update() {
// 現在の回転とターゲットの回転の間を線形補間する
transform.rotation = Quaternion.Lerp(transform.rotation, target.rotation, lerpSpeed * Time.deltaTime);
}
}
Lerp
は2つの値の間を直線的に補間するため、回転角度が小さい場合には滑らかな動作が期待できます。Slerp
よりも計算コストが少ないため、処理の軽量化が求められる場面では使用できますが、回転の大きな変化には不向きです。Quaternion.RotateTowards
RotateTowards
は、現在の回転から目標の回転へと一定速度で回転させる手法です。Slerp
と似ていますが、回転速度を一定にしたいときに使います。
ターゲットと同じ方向を向くように動くサンプルコードです
public class RotateTowardsTarget : MonoBehaviour {
public Transform target;
public float rotationSpeed = 1.0f;
void Update() {
// ターゲットに向けて一定速度で回転
transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, rotationSpeed * Time.deltaTime);
}
}
RotateTowards
は、一定の速度でターゲット方向に向けて回転させるため、時間に依存しない安定した回転が可能です。LookAt
メソッドによる回転LookAt
を使用すると、オブジェクトが常に特定のターゲットを向くように回転します。ターゲット追跡やカメラ制御によく使用されます。
public class LookAtTarget : MonoBehaviour {
public Transform target;
void Update() {
transform.LookAt(target);
}
}
Euler
を使わずにQuaternion
で直接回転オブジェクトを回転させる際、オイラー角を使わずにクォータニオン演算を直接行う方法もあります。これは、オイラー角の変換を避けてクォータニオンで直接回転を扱うため、より精密な回転が可能です。
public class QuaternionDirectRotation : MonoBehaviour {
public float rotationSpeed = 100f;
void Update() {
float inputX = Input.GetAxis("Horizontal");
// 直接クォータニオンで回転
Quaternion deltaRotation = Quaternion.AngleAxis(inputX * rotationSpeed * Time.deltaTime, Vector3.up);
transform.rotation = transform.rotation * deltaRotation;
}
}
Quaternion.AngleAxis
は、指定した軸 (Vector3
) に対して角度で回転させます。この方法は、複雑な回転や連続的な回転に強いです。Time.deltaTime
を誤用した場合)// ダメな例: Time.deltaTimeを回転量に直接適用する
yRot += new Vector3(0, inputX, 0);
transform.rotation = Quaternion.Euler(yRot * Time.deltaTime * rotationSpeed);
Time.deltaTime
を回転角度に直接掛け算することで、フレーム間の差異により不安定な挙動を引き起こす可能性があります。フレームレートが変動すると、回転の速さが不規則になります。Time.deltaTime
は速度にのみ適用し、回転角度には直接適用しないように修正します。
yRot += new Vector3(0, inputX * rotationSpeed * Time.deltaTime, 0);
transform.rotation = Quaternion.Euler(yRot);
Rigidbody
を使った回転。Quaternion.Slerp
やRotateTowards
を活用できる。LookAt
が使える。Quaternion.AngleAxis
やクォータニオン演算を使用。