Unity_Lesson

Unityにおける回転処理に関する解説資料

回転のさせ方

Unityでは、以下のようにさまざまな回転方法があります。 具体的にその一部のプログラムを見ていきます。

1. transform.localEulerAngles で回転

//①
transform.localEulerAngles += new Vector3(0, inputX, 0) * yRotSpeed * Time.deltaTime;

ジンバルロックの動き(youtube)

解説

改善点

ジンバルロックを避けたい場合は、Quaternionを使って回転を処理する方法が一般的です。




2. Quaternion を使用した回転

//②
yRot += new Vector3(0, inputX * yRotSpeed * Time.deltaTime, 0);
transform.rotation = Quaternion.Euler(yRot); // ワールド座標での回転

解説

改善点

回転の処理において、Time.deltaTimeをかけて時間によるフレーム間の変動を考慮することが重要です。




3. Time.deltaTimeを直接使用してしまうケース

//③ 変な挙動になるはず
yRot += new Vector3(0, inputX, 0);
transform.rotation = Quaternion.Euler(yRot * Time.deltaTime * yRotSpeed); 

解説

修正案

Time.deltaTimeは角度変化の速度に適用するだけで、直接回転の変化量にかけるべきではありません。正しくは以下のようにすべきです。

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




4. transform.Rotate メソッドを使った回転

//④
transform.Rotate(new Vector3(0, inputX, 0) * yRotSpeed * Time.deltaTime);

解説

使用のポイント




5. FixedUpdateでの回転

//FixedUpdateでの回転処理
yRot += new Vector3(0, inputX, 0);
transform.rotation = Quaternion.Euler(yRot * yRotSpeed * Time.fixedDeltaTime);

解説

使用例

例えば、Rigidbodyを持つオブジェクトの回転など、物理エンジンと連携する必要がある場合にはFixedUpdate内で回転を処理します。


まとめ:回転処理のポイント

  1. ジンバルロックを避けるために、Quaternionを使うことが推奨されます。特に、複雑な回転や連続的な回転を行う場合、Quaternionはより適切な回転方法です。

  2. Time.deltaTimeを適切に使用し、フレームごとの回転速度を制御する。Time.deltaTimeを角度の変化量に直接適用すると、予測不能な動作が発生するので注意しましょう。

  3. transform.Rotateは、ローカル座標系とワールド座標系のどちらでも回転を簡単に制御できる便利なメソッドです。単純な回転処理には非常に使いやすく、ジンバルロックを避けることができるため、基本的な回転処理には最適です。

  4. FixedUpdateでの回転は、物理演算を伴う場合に使用し、フレームレートに依存せず安定した回転を保証します。