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の基本機能(transform、Debug.Logなど)を使うために必要UnityEngine.InputSystem:マウスやキーボードの入力を検知するために必要
コメントに // 入力を検知するために必要!! と書いてあるのは、忘れると動かないからです。よくある入門の躓きポイントなので、丁寧に書いておくのは良い習慣ですね。
💡
usingを書き忘れると「型が見つかりません」というエラーになります。エラーが出たらまずここを確認!
ポイント②:クラスと MonoBehaviour
public class RouletteController : MonoBehaviourMonoBehaviour を継承(: 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.96 ≈ 8.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月