Unity 2DにおけるTorqueを用いたルーレット回転の制御

2024年9月9日

本資料では、Unity 2Dの物理エンジンを利用して、Rigidbody2Dコンポーネントを使い、ルーレットのような回転をシンプルに制御する方法を紹介します。特に、Torqueを使用して回転を開始し、angularDragによって自然な減速を実現する方法について解説します。

使用環境

  • Unityバージョン: 2021以降
  • 2Dプロジェクト
  • Rigidbody2Dコンポーネントをアタッチしたオブジェクト

1. Rigidbody2Dコンポーネントの設定

ルーレットのようなオブジェクトに物理的な回転を与えるために、Rigidbody2Dコンポーネントをアタッチする必要があります。

手順

  1. 対象の2Dオブジェクトを選択します。
  2. Inspectorタブで「Add Component」ボタンを押し、Rigidbody2Dを追加します。
  3. Rigidbody2Dのプロパティとして、Angular Dragを設定し、減速を調整できます。デフォルトではスクリプト内でangularDragを設定しますが、Inspectorからも変更可能です。

2. サンプルコード

以下のコードは、クリック操作でルーレットの回転を開始し、angularDragによって自然な減速を行うサンプルです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TorqueBasedRouletteController : MonoBehaviour
{
    // Rigidbody2Dコンポーネントを取得
    Rigidbody2D rb;

    void Start()
    {
        // Rigidbody2Dを取得
        rb = GetComponent<Rigidbody2D>();

        // 重力の影響を無効にする
        rb.gravityScale = 0;

        // 回転の減速率を設定(高めに設定して自然な減速を再現)
        rb.angularDrag = 2.0f;  // 数値を調整して減衰具合を変更
    }

    void Update()
    {
        // マウスが押されたらトルクを加えて回転を開始
        if (Input.GetMouseButtonDown(0))
        {
            rb.AddTorque(10, ForceMode2D.Impulse); // Z軸方向にトルクを加える
        }
    }
}

コードの解説

  1. Rigidbody2Dの取得Start()メソッドで、Rigidbody2Dコンポーネントを取得し、オブジェクトの回転を制御します。
  2. Angular Dragの設定rb.angularDrag = 2.0f;で回転速度の減衰を設定しています。この値を調整することで、回転が徐々に止まるスピードを制御できます。値を大きくするほど、回転が早く止まります。
  3. AddTorqueで回転を開始: マウスの左クリック(Input.GetMouseButtonDown(0))が検知されると、AddTorque()メソッドでZ軸に対してトルク(回転力)を加え、回転が開始されます。

3. 回転と減速の制御

  • 回転の強さAddTorque(10, ForceMode2D.Impulse)10の値を変更することで、トルクの強さ(回転の速さ)を調整可能です。大きな値にすると回転が速く、小さな値にすると回転がゆっくりになります。
  • 減速の調整angularDragの値を調整することで、回転が止まるまでの時間をコントロールできます。小さな値にするとゆっくり減速し、大きな値にすると早く止まります。

4. フレームレートに依存しない制御

このサンプルコードでは、Application.targetFrameRate = 60;は使用していません。Unityの物理エンジンはFixedUpdateメソッドで物理演算を処理するため、フレームレートの変動に関係なく安定した回転制御が可能です。したがって、フレームレートに依存しない自然な回転と減速が実現できます。


5. カスタマイズポイント

  • Inspectorでのカスタマイズ: 減衰率(angularDrag)やトルクの強さ(AddTorqueのパラメータ)はスクリプト内で固定値を使っていますが、Inspectorから調整したい場合は、これらのプロパティをpublicとして公開し、リアルタイムに変更できるようにすることも可能です。
  • トルクの値を変えるAddTorque()メソッドに渡す数値を変えることで、回転の強さを自由に調整できます。

6. 結論

この資料では、Unity 2DでのTorqueangularDragを用いたルーレットの回転制御について説明しました。簡単な操作で、クリックによる回転と自然な減速を実現できるため、ゲームやシミュレーションの一部として活用できます。また、Rigidbody2Dの設定やInspectorからのカスタマイズを利用して、より柔軟に制御できることも理解いただけたかと思います。

回転の停止を判定

回転の停止を判定するには、Rigidbody2Dの角速度(angularVelocity)を利用して、回転がほとんど停止しているかどうかを確認することができます。具体的には、angularVelocityが非常に小さな値になった場合に回転が停止したとみなします。

以下に、回転停止を判定するためのコードを追加した例を示します。

csharpコードをコピーする<code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TorqueBasedRouletteController : MonoBehaviour
{
    // Rigidbody2Dコンポーネントを取得
    Rigidbody2D rb;

    // 回転が停止したかを判定するための閾値
    public float stopThreshold = 0.1f;

    // 回転が停止したことを判定するフラグ
    private bool isStopped = false;

    void Start()
    {
        // Rigidbody2Dを取得
        rb = GetComponent<Rigidbody2D>();

        // 重力の影響を無効にする
        rb.gravityScale = 0;

        // 回転の減速率を設定(高めに設定して自然な減速を再現)
        rb.angularDrag = 2.0f;  // 数値を調整して減衰具合を変更
    }

    void Update()
    {
        // マウスが押されたらトルクを加えて回転を開始
        if (Input.GetMouseButtonDown(0))
        {
            rb.AddTorque(10, ForceMode2D.Impulse); // Z軸方向にトルクを加える
            isStopped = false; // 回転が開始されたので停止フラグをリセット
        }

        // 回転がほとんど停止したかどうかを判定
        if (!isStopped && Mathf.Abs(rb.angularVelocity) < stopThreshold)
        {
            isStopped = true;
            OnRotationStopped();
        }
    }

    // 回転が停止したときに呼ばれるメソッド
    void OnRotationStopped()
    {
        Debug.Log("ルーレットが停止しました");
        // 停止後の処理をここに追加(例えば、当たり目の判定など)
    }
}
</code>

追加した内容

  1. stopThreshold: 回転が停止したとみなすための閾値。この値よりangularVelocityが小さくなったときに停止したと判断します。小さい値にするほど、より厳密な停止判定が行われます。
  2. isStopped: 回転がすでに停止しているかどうかを管理するフラグ。これにより、何度も停止判定を行うのを防ぎます。
  3. OnRotationStopped(): 回転が停止したときに呼び出されるメソッド。ここに停止後の処理(例えば、ルーレットの結果を表示するなど)を追加できます。

このコードで、ルーレットの回転が非常に遅くなった場合に回転の停止を検出することができます。

Unity

Posted by hidepon