学習記事一覧 · Unity教科書_Unity6対応

Unity入門:ルーレットゲームを作りながら学ぼう!

対象読者:Unity学び始めの方・C#をこれから覚えたい方 このブログでは、実際のルーレットゲームのコードを読み解きながら、Unityの基本を学びます。


記事の目次

この記事はやや長めです。目的に合わせてジャンプして読み分けてください。

おすすめの読み方

セクション一覧

ポイント一覧


このゲームで何ができるの?

今回題材にするのは、クリックするとルーレットが回転して、だんだん止まるというシンプルなゲームです。

  • 🖱️ 左クリックでルーレットがスピンする
  • 🔄 回るほどにゆっくりなっていき、自然に止まる

クリックでルーレットが回り、だんだん減速して止まる様子(イメージ)

たった 27行のコード でこれが実現できます。シンプルに見えて、Unityの重要な概念がギュッと詰まっています。一緒に読み解いていきましょう!


プロジェクトの構成

このプロジェクトのファイル構成はこうなっています。

Assets/
  ├── roulette.png          # ルーレット盤の画像
  ├── needle.png            # 針の画像
  ├── RouletteController.cs # ゲームの動きを制御するスクリプト
  └── GameScene.unity       # ゲームのシーン

Unityでは、画像・音楽・スクリプトなどすべてのファイルを Assets フォルダに入れて管理します。


コードを全部見てみよう

まず、完成したコードを全体で見てみましょう。

using UnityEngine;
using UnityEngine.InputSystem;  // 入力を検知するために必要!!

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

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

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

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

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

短いですが、ここには学ぶべきポイントが5つあります。順番に見ていきましょう!


ポイント①:using ってなに?

using UnityEngine;
using UnityEngine.InputSystem;  // 入力を検知するために必要!!

using は「この機能セットを使いますよ」という宣言です。

  • UnityEngine :Unityの基本機能(transformDebug.Log など)を使うために必要
  • UnityEngine.InputSystem :マウスやキーボードの入力を検知するために必要

コメントに // 入力を検知するために必要!! と書いてあるのは、忘れると動かないからです。よくある入門の躓きポイントなので、丁寧に書いておくのは良い習慣ですね。

💡 using を書き忘れると「型が見つかりません」というエラーになります。エラーが出たらまずここを確認!


ポイント②:クラスと MonoBehaviour

public class RouletteController : MonoBehaviour

MonoBehaviour を継承(: MonoBehaviour)することで、このスクリプトをGameObjectにアタッチして動かすことができるようになります。

Unityでスクリプトを書くときは、ほぼ必ず MonoBehaviour を継承します。これがUnityスクリプトの基本形です。


ポイント③:変数でスピードを管理する

float rotSpeed = 0;     // 回転速度

float は小数を扱える数値の型です。rotSpeed(回転速度)を変数として持つことで、フレームをまたいで値を記憶できます。

使いどき
int 整数(スコアなど) int score = 0;
float 小数(速度・位置など) float speed = 1.5f;
bool 真偽(フラグなど) bool isGameOver = false;

💡 float の数値には末尾に f をつける習慣があります(例:0.96f)。つけないと警告が出ることがあります。


ポイント④:Start()Update() の違い

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

void Update()
{
    // 毎フレーム実行される処理
}

この2つのメソッドは、Unityで最もよく使う基本のリズムです。

メソッド いつ呼ばれる? 使いどき
Start() ゲーム開始時に1回だけ 初期設定・初期値のセット
Update() 毎フレーム(約60回/秒) 動き・入力チェックなど

このコードでは Start() でフレームレートを60に固定しています。フレームレートを揃えておくと、どの環境でも同じ速さでゲームが動くようになります。


ポイント⑤:入力の受け取り方

if (Mouse.current.leftButton.wasPressedThisFrame)
{
    this.rotSpeed = 10;
}

Mouse.current.leftButton.wasPressedThisFrame は「このフレームでマウスの左ボタンが押された瞬間」を検知します。

wasPressedThisFrame は「押し続けている間」ではなく「押した瞬間だけ」反応します。これがポイント!

プロパティ いつ true になる?
wasPressedThisFrame 押した瞬間のフレームだけ
isPressed 押している間ずっと
wasReleasedThisFrame 離した瞬間のフレームだけ

クリックするたびに rotSpeed = 10 にリセットされるので、何度でもルーレットを回せる仕組みになっています。


ポイント⑥:ルーレットを回す

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

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

transform.Rotate() で回す

transform はGameObjectの「位置・回転・大きさ」を管理するコンポーネントです。Rotate(x, y, z) で各軸方向に回転させます。

2Dゲームでは画面の奥行き方向(Z軸)を中心に回転させるので、Rotate(0, 0, rotSpeed) となります。

*= 0.96f で自然に止まる

this.rotSpeed *= 0.96f;
// ↑ これは this.rotSpeed = this.rotSpeed * 0.96f; と同じ

毎フレーム速度に 0.96(96%)を掛け続けることで、速度が少しずつ小さくなっていきます。

1フレーム目: 10
2フレーム目: 10 × 0.96 = 9.6
3フレーム目: 9.6 × 0.96 = 9.216
4フレーム目: 9.216 × 0.968.85
…(だんだん小さくなる)

このように掛け算で減速するテクニックは「指数的な減衰」と呼ばれ、自然な動きを表現するときによく使われます。0.96f の値を変えると止まり方が変わります。試してみましょう!

*= の値 止まり方
0.99f ゆっくりじわじわ止まる
0.96f(今の値) 自然なスピード感
0.90f 素早く止まる

コードの流れを整理しよう

このコードが毎フレーム行っていることをまとめると:

【毎フレームの処理フロー】

① マウスが押された?
   └─ YES → rotSpeed を 10 にセット
   └─ NO  → そのまま

② transform.Rotate(0, 0, rotSpeed) でルーレットを回す

③ rotSpeed *= 0.96f で少し遅くする

この繰り返しによって、クリック→加速→徐々に減速→停止、という動きが生まれています。


自分でカスタマイズしてみよう!

このコードを理解したら、ぜひ自分でアレンジしてみましょう。

挑戦①:スピードを変える

// この値を変えてみよう!(5〜20くらいで試してみて)
this.rotSpeed = 10;

挑戦②:止まるまでの時間を変える

// 1.0fに近いほどゆっくり止まる、0.5fに近いほど速く止まる
this.rotSpeed *= 0.96f;

挑戦③:スペースキーでも回せるようにする

// マウスクリックの条件と並べて追加してみよう
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
    this.rotSpeed = 10;
}

まとめ

今回のルーレットゲームから学んだことを整理しましょう。

  • using で必要な機能を宣言する
  • MonoBehaviour を継承することでGameObjectにアタッチできる
  • float 変数で回転速度をフレームをまたいで管理できる
  • Start() は初期設定、Update() は毎フレームの処理に使う
  • wasPressedThisFrame で「押した瞬間」だけ反応できる
  • transform.Rotate() でZ軸回転、*= 0.96f で自然な減速を実現

わずか27行のコードでも、これだけ多くの概念が使われています。**「動く→コードを読む→カスタマイズする」**のサイクルを繰り返すことが、Unity上達の一番の近道です。

次はルーレットが止まったときに「当選!」を表示するUIを追加してみるのはどうでしょうか?


最終更新:2026年4月