Unity_Lesson

いろんな回転方法

1. 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));
    }
}

特徴

注意点


AddTorqueについて



2. 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);
    }
}

特徴

使用例




3. 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);
    }
}

特徴


補間の計算処理について




4. 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);
    }
}

特徴




5. LookAt メソッドによる回転

LookAtを使用すると、オブジェクトが常に特定のターゲットを向くように回転します。ターゲット追跡やカメラ制御によく使用されます。

サンプルコード

public class LookAtTarget : MonoBehaviour {
    public Transform target;

    void Update() {
        transform.LookAt(target);
    }
}

特徴

使用例

注意点




6. 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;
    }
}

特徴



ダメな回転の例と改善方法

1. 回転が不安定なコード(Time.deltaTimeを誤用した場合)

// ダメな例: Time.deltaTimeを回転量に直接適用する
yRot += new Vector3(0, inputX, 0);
transform.rotation = Quaternion.Euler(yRot * Time.deltaTime * rotationSpeed);

問題点

改善方法

Time.deltaTime速度にのみ適用し、回転角度には直接適用しないように修正します。

yRot += new Vector3(0, inputX * rotationSpeed * Time.deltaTime, 0);
transform.rotation = Quaternion.Euler(yRot);





まとめ

  1. 物理シミュレーションが必要な場合などはRigidbodyを使った回転。
  2. 滑らかな回転が必要ならQuaternion.SlerpRotateTowardsを活用できる。
  3. ターゲットを常に追跡させる場合LookAtが使える。
  4. クォータニオンを直接操作したい場合はQuaternion.AngleAxisやクォータニオン演算を使用。




ルーレット