Unityにおける回転操作の方法とサンプルコード

本資料では、Unityでオブジェクトの回転を実現するためのさまざまな手法について、用途ごとに整理し、各方法のサンプルコードも併記しています。シーンの要件に合わせて最適な方法を選んでください。


1. Transformを利用した回転操作

1.1. Transform.Rotate()

概要:
オブジェクトに対して指定した角度分だけ回転を加えます。ローカル座標系またはワールド座標系を選択可能です。

サンプルコード:

using UnityEngine;

public class RotateExample : MonoBehaviour 
{
    void Update() 
    {
        // 毎フレーム、Y軸を中心に45度/秒で回転(ローカル座標)
        transform.Rotate(0, 45 * Time.deltaTime, 0, Space.Self);
    }
}

1.2. Transform.RotateAround()

概要:
指定した中心点と軸を基準にオブジェクトを回転させます。カメラのオービットや周囲を回る動作に便利です。

サンプルコード:

using UnityEngine;

public class RotateAroundExample : MonoBehaviour 
{
    public Transform target;  // 回転の中心となるオブジェクト
    void Update() 
    {
        // targetの位置を中心に、Y軸周りに30度/秒で回転
        transform.RotateAround(target.position, Vector3.up, 30 * Time.deltaTime);
    }
}

1.3. Transform.LookAt()

概要:
オブジェクトの前方(forward方向)が指定のターゲットに向くように回転を設定します。

サンプルコード:

using UnityEngine;

public class LookAtExample : MonoBehaviour 
{
    public Transform target;  // 注視対象のオブジェクト
    void Update() 
    {
        // 常にtargetの方向を向く
        transform.LookAt(target);
    }
}

1.4. Transform.eulerAngles プロパティ

概要:
オブジェクトの回転をEuler角(0~360度または-180~180度に正規化された値)として取得・設定します。内部的な累積回転とは異なり、表示上の値が正規化される点に注意。

サンプルコード:

using UnityEngine;

public class EulerAnglesExample : MonoBehaviour 
{
    void Start() 
    {
        // オブジェクトの回転をX=0, Y=90, Z=0に設定
        transform.eulerAngles = new Vector3(0, 90, 0);
    }
}

1.5. Transform.rotation プロパティ

概要:
Quaternion形式でオブジェクトの回転を取得・設定します。ジンバルロックの回避や累積回転の管理に優れています。

サンプルコード:

using UnityEngine;

public class RotationPropertyExample : MonoBehaviour 
{
    void Start() 
    {
        // Quaternion.Eulerで作成した回転を設定
        transform.rotation = Quaternion.Euler(0, 45, 0);
    }
}

1.6. Transform.localRotation プロパティ

概要:
親オブジェクトに対するローカルな回転を管理します。親子関係にある場合、子オブジェクトの独自の回転を制御する際に使用します。

サンプルコード:

using UnityEngine;

public class LocalRotationExample : MonoBehaviour 
{
    void Start() 
    {
        // 親に対してローカルな回転を設定(例: Y軸90度回転)
        transform.localRotation = Quaternion.Euler(0, 90, 0);
    }
}

2. Quaternionを利用した回転操作

2.1. Quaternion.Euler()

概要:
Euler角からQuaternionを生成します。人間にとって直感的な角度指定が可能です。

サンプルコード:

using UnityEngine;

public class QuaternionEulerExample : MonoBehaviour 
{
    void Start() 
    {
        Quaternion rotation = Quaternion.Euler(0, 90, 0);
        transform.rotation = rotation;
    }
}

2.2. Quaternion.AngleAxis()

概要:
指定した角度と軸からQuaternionを生成します。特定の軸周りの回転操作に適しています。

サンプルコード:

using UnityEngine;

public class QuaternionAngleAxisExample : MonoBehaviour 
{
    void Start() 
    {
        // Y軸を中心に45度回転するQuaternionを作成
        Quaternion rotation = Quaternion.AngleAxis(45, Vector3.up);
        transform.rotation = rotation;
    }
}

2.3. Quaternion.Lerp()

概要:
2つのQuaternion間を線形補間し、滑らかな中間回転を生成します。

サンプルコード:

using UnityEngine;

public class QuaternionLerpExample : MonoBehaviour 
{
    public Transform target;  // 目標回転を持つオブジェクト
    public float speed = 1f;
    void Update() 
    {
        // 現在の回転からtargetの回転へ、線形補間で移行
        transform.rotation = Quaternion.Lerp(transform.rotation, target.rotation, speed * Time.deltaTime);
    }
}

2.4. Quaternion.Slerp()

概要:
2つのQuaternion間を球面線形補間し、より自然な回転の補間を実現します。

サンプルコード:

using UnityEngine;

public class QuaternionSlerpExample : MonoBehaviour 
{
    public Transform target;
    public float speed = 1f;
    void Update() 
    {
        // 現在の回転からtargetの回転へ、球面線形補間で移行
        transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, speed * Time.deltaTime);
    }
}

2.5. Quaternion.RotateTowards()

概要:
現在のQuaternionから目標Quaternionに向かって、指定角度分だけ回転するQuaternionを生成します。

サンプルコード:

using UnityEngine;

public class QuaternionRotateTowardsExample : MonoBehaviour 
{
    public Transform target;
    public float rotateSpeed = 90f; // 1秒あたりの最大回転角度
    void Update() 
    {
        // 現在の回転からtargetの回転へ、rotateSpeedの速度で回転
        transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, rotateSpeed * Time.deltaTime);
    }
}

3. Rigidbody(物理演算)を利用した回転操作

3.1. Rigidbody.AddTorque()

概要:
Rigidbodyに対してトルク(回転力)を加え、物理シミュレーション内で自然な回転を発生させます。
注意: RigidbodyのmaxAngularVelocityプロパティにより、最大回転速度が制限されているため必要に応じて調整してください。

サンプルコード:

using UnityEngine;

public class AddTorqueExample : MonoBehaviour 
{
    public float torque = 10f;
    private Rigidbody rb;

    void Start() 
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate() 
    {
        // Y軸周りにトルクを加える
        rb.AddTorque(Vector3.up * torque);
    }
}

3.2. Rigidbody.MoveRotation()

概要:
Rigidbodyをキネマティックに指定したQuaternionの回転へ移動させます。物理演算との整合性を保ちつつ回転を変更できます。

サンプルコード:

using UnityEngine;

public class MoveRotationExample : MonoBehaviour 
{
    public float rotateSpeed = 90f;
    private Rigidbody rb;

    void Start() 
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate() 
    {
        // 固定フレームレートで回転を移動させる
        Quaternion deltaRotation = Quaternion.Euler(0, rotateSpeed * Time.fixedDeltaTime, 0);
        rb.MoveRotation(rb.rotation * deltaRotation);
    }
}

3.3. Rigidbody.angularVelocity プロパティ

概要:
Rigidbodyの現在の角速度を直接取得または設定できます。直接操作することで、回転の挙動を微調整できます。

サンプルコード:

using UnityEngine;

public class AngularVelocityExample : MonoBehaviour 
{
    private Rigidbody rb;

    void Start() 
    {
        rb = GetComponent<Rigidbody>();
        // 初期の角速度をY軸周りに設定(単位:ラジアン/秒)
        rb.angularVelocity = new Vector3(0, 1f, 0);
    }

    void Update() 
    {
        // 現在の角速度をデバッグログに表示
        Debug.Log("Angular Velocity: " + rb.angularVelocity);
    }
}

まとめ

  • Transform操作は、直感的にオブジェクトの回転を操作できる反面、表示上はEuler角の正規化(0~360度または-180~180度)により内部の累積回転が見えにくくなる点に注意。
  • Quaternion補間は、滑らかで自然な回転の遷移を実現し、複雑な回転計算に強い。
  • Rigidbodyを利用した物理演算は、現実的な物理挙動を実現するために有効ですが、maxAngularVelocity などのプロパティに注意する必要があります。

各サンプルをシーンに組み込み、目的に合わせた回転操作を実装してみてください。

Unity

Posted by hidepon