Unityにおけるスプライト回転の技術資料

Unityでスプライトを回転させるための方法をいくつか紹介します。プロジェクトに応じて、シンプルな回転から物理ベースの回転まで、様々な方法が適用できます。本資料では、各回転方法の説明と、適用場面に応じた推奨方法についてまとめています。


目次

1. Transform.Rotate()

Transform.Rotate()メソッドは、毎フレーム指定された軸に対してオブジェクトを回転させるための最もシンプルな方法です。

使用例 (2Dおよび3D)

void Update()
{
    // Z軸を中心に毎秒30度回転させる
    transform.Rotate(0, 0, 30 * Time.deltaTime);
}

特徴

  • 2D/3D問わず使用可能
  • 回転速度をフレームレートに依存しないようにTime.deltaTimeを使用。

推奨シチュエーション

シンプルなアニメーションや回転を行いたい場合に適しています。


2. Transform.eulerAngles

transform.eulerAnglesは、オブジェクトの回転角度を直接設定する方法です。一度に指定した角度に変更する際に便利です。

使用例 (2Dおよび3D)

void Start()
{
    // スプライトを90度回転させる
    transform.eulerAngles = new Vector3(0, 0, 90);
}

特徴

  • 回転角度を直接設定でき、瞬時に回転を適用。

推奨シチュエーション

回転角度を直接設定したい場合や、固定の回転を適用したい場合に最適です。


3. Quaternion.RotateTowards()

Quaternion.RotateTowards()は、現在の回転角度からターゲットの回転角度に徐々に回転させる方法です。

使用例 (2Dおよび3D)

public Transform target;
public float speed = 1.0f;

void Update()
{
    // 現在の回転角度からターゲットに向けて回転
    transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, speed * Time.deltaTime);
}

特徴

  • ターゲットに向けたスムーズな回転を実現。
  • 回転速度を指定可能。

推奨シチュエーション

キャラクターやオブジェクトが目標に向かってゆっくりと回転する場合に適しています。


4. Quaternion.Slerp()

Quaternion.Slerp()は、2つの回転間を滑らかに補間するメソッドです。

使用例 (2Dおよび3D)

Quaternion startRotation;
Quaternion endRotation;
float rotationTime = 2.0f;
float t = 0.0f;

void Start()
{
    startRotation = transform.rotation;
    endRotation = Quaternion.Euler(0, 0, 180);
}

void Update()
{
    t += Time.deltaTime / rotationTime;
    transform.rotation = Quaternion.Slerp(startRotation, endRotation, t);
}

特徴

  • 始点と終点の回転間を滑らかに補間。
  • 特定の時間内で回転を完了させたい場合に便利。

推奨シチュエーション

アニメーションや演出で滑らかな回転を実現したい場合に使用します。


5. LookAt()を使った回転

Transform.LookAt()は、ターゲットの方向にオブジェクトを向けるための回転方法です。2Dの場合はVector3.forwardを指定します。

使用例 (2D)

public Transform target;

void Update()
{
    Vector3 direction = target.position - transform.position;
    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
}

特徴

  • ターゲットの方向を常に向くように設定。
  • 特定のオブジェクトを追尾するような挙動を実現。

推奨シチュエーション

敵キャラクターがプレイヤーを追尾する場合や、砲台がターゲットに向かう場合などに使用します。


6. Rigidbody2D.AddTorque() (2D)

Rigidbody2D.AddTorque()は、物理演算に基づいてスプライトに回転力(トルク)を加える方法です。

使用例 (2D)

public float torqueAmount = 10.0f;
private Rigidbody2D rb;

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

void Update()
{
    // スペースキーを押したらトルクを加える
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddTorque(torqueAmount); // 反時計回りに回転
    }
}

特徴

  • 物理演算によるリアルな回転挙動。
  • トルクを加えることで時計回りや反時計回りに回転。

推奨シチュエーション

風や衝突による回転をシミュレートしたい場合に最適です。


7. Rigidbody.AddTorque() (3D)

Rigidbody.AddTorque()は、3Dオブジェクトにトルクを加えて回転させる方法です。

使用例 (3D)

public float torqueAmount = 10.0f;
private Rigidbody rb;

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

void Update()
{
    // スペースキーを押したらY軸にトルクを加える
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddTorque(Vector3.up * torqueAmount); // Y軸を中心に反時計回りに回転
    }
}

例:複数軸にトルクを加える場合

void Update()
{
    // X軸とZ軸にトルクを加える
    rb.AddTorque(new Vector3(torqueAmount, 0, torqueAmount)); // X軸とZ軸にトルクを加えて回転
}

特徴

  • 3D空間における回転を物理的にシミュレート。
  • 軸に沿ったトルクを加えることで、リアルな回転が可能。

推奨シチュエーション

3Dオブジェクトが物理演算に基づいて自然に回転する必要がある場合に使用します。


8. AddTorqueの引数の与え方

AddTorqueメソッドにおける引数の与え方は、2Dと3Dで異なります。それぞれの使い方と引数の詳細について説明します。

8.1 Rigidbody2D.AddTorque() (2Dの場合)

2Dゲームで物理ベースの回転を行う場合は、Rigidbody2DAddTorque()を使用します。引数として単一の浮動小数点数(floatを指定し、その値がトルク(回転力)の大きさを表します。

シンタックス:

void AddTorque(float torque, ForceMode2D mode = ForceMode2D.Force);
  • torque: 回転力を表すfloat値です。正の値を指定すると反時計回り、負の値を指定すると時計回りに回転します。
  • mode(オプション): トルクの適用方法を指定します。デフォルトはForceMode2D.Forceです。
    • ForceMode2D.Force: 力を継続的に加える(デフォルト)。
    • ForceMode2D.Impulse: 瞬間的な力を加える。

使用例:

public float torqueAmount = 10.0f;
private Rigidbody2D rb;

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

void Update()
{
    // スペースキーを押したらトルクを加える
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddTorque(torqueAmount); // 反時計回りに回転
    }
}

8.2 Rigidbody.AddTorque() (3Dの場合)

3Dゲームで物理ベースの回転を行う場合は、RigidbodyAddTorque()を使用します。引数としてVector3で指定し、回転させたい軸とトルクの大きさを与えます。

シンタックス:

void AddTorque(Vector3 torque, ForceMode mode = ForceMode.Force);
  • torqueVector3型の値で、各軸(X, Y, Z)にどれだけトルクを加えるかを指定します。
  • mode(オプション): トルクの適用方法を指定します。デフォルトはForceMode.Forceです。
    • ForceMode.Force: 継続的な力を加える(デフォルト)。
    • ForceMode.Impulse: 瞬間的な力を加える。
    • ForceMode.Acceleration: 質量を無視して加速する力を加える。
    • ForceMode.VelocityChange: 質量を無視して瞬間的な速度を変化させる。

使用例:

public float torqueAmount = 10.0f;
private Rigidbody rb;

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

void Update()
{
    // スペースキーを押したらY軸にトルクを加える
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddTorque(Vector3.up * torqueAmount); // Y軸を中心に反時計回りに回転
    }
}

例:複数軸にトルクを加える場合

void Update()
{
    // X軸とZ軸にトルクを加える
    rb.AddTorque(new Vector3(torqueAmount, 0, torqueAmount)); // X軸とZ軸にトルクを加えて回転
}

引数のまとめ

2Dの場合 (Rigidbody2D.AddTorque())

  • torque: 浮動小数点数(float)で回転力を指定(正の値で反時計回り、負の値で時計回り)。
  • ForceMode2D(オプション): トルクの適用方法(ForceImpulse)。

3Dの場合 (Rigidbody.AddTorque())

  • torqueVector3で回転軸と回転力を指定(X, Y, Z軸に対して個別にトルクを指定)。
  • ForceMode(オプション): トルクの適用方法(ForceImpulseAccelerationVelocityChange)。

9. トルク値の決め方

トルク値の具体的な数値を事前に計算することは可能ですが、いくつかの物理的な要素を考慮する必要があります。トルクの計算は、オブジェクトの質量慣性モーメント、および角加速度(回転の加速率)に基づいて行います。

9.1 トルクの基本計算式


9.2 慣性モーメント(I)の計算

慣性モーメントは、物体の形状と回転軸によって異なります。以下は代表的な形状の慣性モーメントの式です:

これにより、形状と質量に基づいて慣性モーメントを計算できます。


9.3 角加速度(α)の計算


9.4 トルク(T)の計算例

例 1: 円盤型オブジェクト

例 2: 棒状オブジェクト


9.5 トルク値のシミュレーションへの適用

これらの計算をもとに、UnityのAddTorque()メソッドに適切なトルク値を設定することができます。たとえば、上記の例で得られたトルク値をゲーム内で使用する場合:

// 例1: 円盤型オブジェクトのトルクを適用
rb.AddTorque(0.164f, ForceMode.Force);  // ニュートンメートルで設定

// 例2: 棒状オブジェクトのトルクを適用
rb.AddTorque(0.174f, ForceMode.Force);  // ニュートンメートルで設定

9.6 トルク値のチューニング

  1. 物理シミュレーションのテスト
    • 回転スピードや挙動を実際にプレイしながら確認し、シミュレーション内でオブジェクトが適切な速度で回転するかどうかをテストすることが重要です。
    • まずは小さなトルク値でテストし、徐々に値を増減させて理想的な回転スピードを見つけます。
  2. 摩擦力の調整
    • angularDrag(角速度の摩擦係数)やdrag(直線速度の摩擦係数)を調整し、回転速度の自然な減速を表現します。摩擦が強すぎる場合は、トルク値を大きくするか、摩擦係数を下げます。
  3. トルクの方向と軸
    • トルクはどの軸に対して回転を加えるかによって結果が変わります。X, Y, Z軸それぞれにどの程度のトルクを加えるかを慎重に選びましょう。
  4. 力をかける時間
    • ForceMode.Impulseの場合、一瞬の力で大きく回転させることができるため、短い時間に高い回転を与えたい場合に向いています。ForceMode.Forceの場合は、連続的に力を加え続けるので、回転速度が徐々に増加する効果があります。

10. トルク値の具体的な設定方法

トルク値を具体的に設定する際には、以下のステップに従って計算および調整を行います。

10.1 オブジェクトの物理プロパティの確認

  • 質量 (mass)RigidbodyまたはRigidbody2Dコンポーネントで設定。
  • 慣性モーメント (inertiaTensor または inertia): 自動的に計算されますが、カスタム設定も可能です。
  • 摩擦 (dragangularDrag): 回転の減速に影響。

10.2 目標とする回転動作の定義

  • 回転軸: どの軸を中心に回転させるか。
  • 回転速度: どれだけ速く回転させたいか。
  • 回転の持続時間: どれだけの時間で目標の回転速度に到達させるか。

10.3 トルクの計算

  1. 慣性モーメント (I) の計算: オブジェクトの形状に応じた式を使用。
  2. 角加速度 (α) の計算: 目標回転速度と加速時間から算出。
  3. トルク (T) の計算T = I × α の式を使用。

10.4 Unityでのトルク適用

計算したトルク値をAddTorque()メソッドに渡して適用します。

例: 円盤型オブジェクトにトルクを適用

public class RotateDisk : MonoBehaviour
{
    public float torqueAmount = 0.164f; // 計算したトルク値
    private Rigidbody rb;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddTorque(Vector3.up * torqueAmount, ForceMode.Force);
        }
    }
}

例: 棒状オブジェクトにトルクを適用

public class RotateBar : MonoBehaviour
{
    public float torqueAmount = 0.174f; // 計算したトルク値
    private Rigidbody rb;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddTorque(Vector3.right * torqueAmount, ForceMode.Force);
        }
    }
}

11. まとめ

Unityでスプライトを回転させる方法には、Transformを使用するシンプルな方法から、Rigidbodyを用いた物理ベースの回転方法まで多岐にわたります。以下に推奨方法をまとめます。

推奨方法まとめ

  1. シンプルな回転
    • 推奨方法Transform.Rotate()
      • 理由: シンプルなアニメーションや固定速度での回転には最適です。
  2. 特定の回転角度を直接設定
    • 推奨方法Transform.eulerAngles
      • 理由: 瞬時に回転角度を設定したい場合に便利です。
  3. ターゲットに向かって回転
    • 推奨方法Quaternion.RotateTowards()またはLookAt()
      • 理由: キャラクターがターゲットに向かう動作を自然に表現できます。
  4. 滑らかな回転アニメーション
    • 推奨方法Quaternion.Slerp()
      • 理由: 時間をかけて滑らかに回転させたい場合に最適です。
  5. 物理ベースの回転
    • 推奨方法Rigidbody2D.AddTorque()またはRigidbody.AddTorque()
      • 理由: 物理演算に基づいたリアルな回転挙動を実現します。
  6. トルク値の具体的な設定
    • 推奨方法: 物理法則に基づき、質量、慣性モーメント、角加速度を計算して設定。
      • 理由: 正確な物理挙動をシミュレートするため。

以上の方法を適切に選択して、Unityでのスプライト回転を効果的に制御してください。プロジェクトのニーズやアニメーションの目的に応じて、最適な回転方法を実装しましょう。物理ベースの回転を使用する際は、計算に基づいたトルク値の設定とテストを繰り返し行い、自然な回転挙動を実現することが重要です。


参考資料

Unity

Posted by hidepon