Unityを使用したルーレットの回転速度制御と完全停止に関する技術資料

本技術資料では、Unityを使ったルーレットの回転制御を実装する方法を説明します。ユーザーがマウスボタンをクリックすることでルーレットを回転させ、徐々に減速し、最終的には完全に停止する機能を実装します。

必要な知識

  • 基本的なUnityの操作
  • C#の基礎知識
  • UnityのMonoBehaviourクラスの使用方法
  • transform.Rotate()によるオブジェクトの回転処理

手順

プロジェクトのセットアップ

Unityプロジェクトを作成し、必要なゲームオブジェクト(ルーレットとなる2D/3Dオブジェクト)をシーンに配置します。

C#スクリプトの作成

ルーレットの回転速度を管理するC#スクリプトを作成し、ゲームオブジェクトにアタッチします。以下がそのスクリプトの実装です。

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

public class RouletteController : MonoBehaviour
{
    // 回転速度
    float rotSpeed = 0;

    void Start()
    {
        // フレームレートを60に固定する
        Application.targetFrameRate = 60;
    }

    void Update()
    {
        // マウスが押されたら回転速度を設定する
        if (Input.GetMouseButtonDown(0))
        {
            this.rotSpeed = 10; // 回転速度を10に設定
        }

        // 回転速度ぶん、ルーレットを回転させる
        transform.Rotate(0, 0, this.rotSpeed);

        // ルーレットを減速させる
        this.rotSpeed *= 0.96f;

        // 回転速度が0.01以下になったら停止させる
        if (this.rotSpeed < 0.01f)
        {
            this.rotSpeed = 0;
        }
    }
}

フレームレートに依存しないようにリファクタリングするためには、Time.deltaTimeを使用します。これにより、フレームごとの経過時間に基づいて回転速度が調整されるため、異なるフレームレートでも動作が安定します。

以下のようにコードをリファクタリングします。

リファクタリング後のコード

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

public class RouletteController : MonoBehaviour
{
    // 回転速度
    float rotSpeed = 0;

    void Update()
    {
        // マウスが押されたら回転速度を設定する
        if (Input.GetMouseButtonDown(0))
        {
            this.rotSpeed = 10; // 回転速度を10に設定
        }

        // 回転速度ぶん、ルーレットを回転させる(Time.deltaTimeを考慮)
        transform.Rotate(0, 0, this.rotSpeed * Time.deltaTime * 60);

        // ルーレットを減速させる
        this.rotSpeed *= 0.96f;

        // 回転速度が0.01以下になったら停止させる
        if (this.rotSpeed < 0.01f)
        {
            this.rotSpeed = 0;
        }
    }
}

変更点の説明

  • Time.deltaTime: 1フレームの経過時間を返すプロパティです。これを回転速度に掛け算することで、フレームレートの変動に依存しない動作を実現しています。
  • * 60: これは元々60フレームで動作させることを想定していたので、deltaTimeを掛けた後に60を掛けて補正しています。この値を調整することで、フレームレートが異なる場合でも同様の回転速度を維持します。

結果

この変更により、フレームレートが異なってもルーレットは同じように回転し、時間経過によって減速して最終的に停止します。

実装の説明

初期設定

rotSpeed(回転速度)の初期値を0に設定します。
Start()内でフレームレートを60に固定することで、処理の安定性を確保します。

回転開始

Update()内で、ユーザーがマウスの左ボタン(Input.GetMouseButtonDown(0))を押すと、rotSpeedが10に設定され、回転が始まります。

回転処理

transform.Rotate(0, 0, this.rotSpeed);によって、オブジェクトが回転します。回転軸はZ軸で、rotSpeed分だけ毎フレーム回転します。

減速処理

回転速度を毎フレーム減速させるために、this.rotSpeed *= 0.96f;とし、回転速度を96%に減少させます。

完全停止

回転速度が0.01以下になった場合に、this.rotSpeed = 0;とすることで、回転が完全に停止します。

結果

マウスクリックでルーレットが回転し、自然に減速しながら最終的に完全停止する動作が確認できます。

発展

ランダムな初期回転速度の設定: 

Random.Range()を使用して初期回転速度をランダム化することも可能です。

回転速度の視覚的な変化:

回転速度に応じてルーレットの色や効果音を変化させるなど、視覚・聴覚的なフィードバックを追加することもできます。

このサンプルは、Unity初心者にも理解しやすく、ゲームやインタラクティブなシステムに応用可能です。

Unity

Posted by hidepon