Unityでゲーム制作してみた

初心者でも簡単!Unityの物理エンジンでリアルなサイコロアプリを作ってみた

本記事では、Unity(バージョン 2022.3.22f1)を使い、
「ボタンを押すとサイコロがリアルに転がる」
シンプルなアプリを一緒に作ってみましょう。

メインで学べるポイントは以下の通りです:

  • “Rigidbody”を使った物理演算の基本
  • ランダムな力の加え方
  • UIからのアクション連動の仕組み

はじめに

なぜ、「サイコロを振る」アプリを作るのだろうと考えると思います。

理由は、サイコロを振るということはゲームに必要な物理的な挙動やランダムな要素を手軽に学ぶことができるからです。

先に完成したアプリの挙動を紹介します。

開発環境は以下になります。

  • Unity 2022.3.22f1
  • Windows 10

使用するアセットは

です。
どちらも無料のアセットになります。

早速作っていく

Step 1 : プロジェクトの準備と舞台作成

まず、UnityHubを開いて、New projectを押してプロジェクトを作成します。

使うUnityのバージョンは2022.3.22f1です。

Universal 3Dテンプレートを選択して、プロジェクトの名前や保管場所を設定して、Create Projectを押します。

まず、サイコロが転がる床を作成します。

Hierarchyビューで右クリックし、3D Objectの中からPlaneを選択します。
サイコロが十分に転がるスペースを作るために、
TransformのScaleを(5,1,5)などにして広げます。

サイコロが床から落ちないように壁を作っていきます。
Hierarchyビューで右クリックし、3D ObjectからCubeを作成します。
床を囲むように配置したいので、例えばTransformのPositionを(0,5,25)とし、Scaleを(50,10,1)とします。

こうすると上側の壁ができました。
これをCtrl+Dでコピーして、下と左右に配置します。

  • TransformのRotationを(0,90,0)、Positionを(25,5,0)にすると右側の壁に
  • TransformのRotationを(0,90,0)、Positionを(-25,5,0)にすると左側の壁に
  • TransformのPositionを(0,5,-25)にすると下側の壁に

なります。

Step 2 : サイコロの作成

サイコロを作成します。

ここでDice d6 game ready PBRというアセットを使用します。
Asset Storeから追加しておきます。

メニューのWindowからPackage Managerを選択します。
Package Managerのウィンドウが開くと思いますので、Dice d6 game ready PBRをimportします。

Dice_6というフォルダがAssetに追加されると思いますので、Dice_6の中のPrefabsにあるお好みのDice プレハブをHierarchyビューにドラッグ&ドロップします。

名前を分かりやすいようにDiceとしています。

少し見やすいようにTransformのScaleを(2,2,2)にして、Positionを(0,1.5,0)にしておきます。

作成したDiceを選択して、Inspectorビューの下にあるAdd Componentを押します。
Rigidbodyを検索して追加します。
これで、このDiceは物理的な挙動をするようになり、重力の影響を受けるようになります。

試しにTransformのPositionのy座標の値を大きくして、Unityの上の再生ボタン▶から実行してみてください。
サイコロが落ちてくると思います。

Step 3 : サイコロを転がすUIの作成

Hierarchyビューで右クリックし、UIからButton – TextMeshProを選択します。
プロジェクトで初めてTextMeshProを使う際にはアセットのインポートが求められますので、インポートします。

ボタンの位置を少し調整して、下側にくるようにします。
ここではボタンのTransformのPositionを(0,-120,0)にしておきます。

次にボタンに表示する文字列を設定します。
日本語で「サイコロを振る」としたいのですが、TextMesh Proが使用しているデフォルトのフォントファイルに、日本語の文字が含まれていません。

そこで日本語フォントを準備したいと思います。

ここではGoogleとAdobeが共同開発したNoto Sans JPを利用します。
※無料で商用利用も可能です。

Google FontsのNoto Sans JPのページにアクセスします。
ページ右上のGet Fontから進んで、Download allでフォントファイルを取得することができます。

ダウンロードしたzipファイルを解凍して、staticフォルダに入っているフォントを使用します。
今回はNotoSansJP-Regular.ttfを使用します。
後で使うため、日本語文字コードから日本語文字コードをダウンロードしておきます。
githubの右上のDownload ZIPからzipファイルをダウンロードして解凍すると、japanese_full.txtというファイルを取得できます。

NotoSansJP-Regular.ttfをAssetフォルダにドラッグアンドドロップします。
UnityのメニューのWindowからTextMeshProの中のFont Asset Creatorを選択します。

Source Font Fileに先ほど追加したNotoSansJP-Regular.ttfをドラッグアンドドロップします。
Character SetはCustom Charactersのままにして、Custom Character Listに書いてある中身を全て消去し、japanese_full.txtの中身をコピー&ペーストします。

最後にGenerate Font Atlrasを押すと日本語のフォントを作成することができます。

UIのボタンの矢印を開いて、Text (TMP)とでてくると思うので選択します。

InspectorビューのTextMeshProのText Inputに「サイコロを振る」と入力します。
Font Assetを先ほど作成したフォントに設定し、Auto Sizeにチェックを入れます。

そうすると、「サイコロを振る」と書かれたボタンが表示できたと思います。

Step 4 : サイコロを振るスクリプトを作成する

最後にサイコロを振るための挙動を作成します。

Assetsフォルダで右クリックして、CreateからC# Scriptを選択し、「DiceRoller」と名前を付けます。
Diceを選択して、Add ComponentからDiceRollerを選択します。


ソースコードをを書いていきます。

using UnityEngine;

public class DiceRoller : MonoBehaviour
{
    private Rigidbody rb;
    public float forceMagnitude = 10f; // 力を加える大きさ
    public float torqueMagnitude = 10f; // 回転を加える大きさ
    // Start is called before the first frame update
    void Start()
    {
        // 最初に対象のRigidbodyを取得しておく
        rb = GetComponent<Rigidbody>();
    }

    // このメソッドをボタンから呼び出す
    public void RollTheDice()
    {
        // ランダムな方向ベクトルを生成
        Vector3 randomDirection = Random.onUnitSphere;
        // ランダムな方向に力を加える
        rb.AddForce(randomDirection * forceMagnitude, ForceMode.Impulse);

        // ランダムな回転軸を生成
        Vector3 randomTorque = Random.onUnitSphere;
        // ランダムな軸周りにトルク(回転力)を加える
        rb.AddTorque(randomTorque * torqueMagnitude, ForceMode.Impulse);
    }
}


ソースコードについて解説をします。
Unityでは実行するスクリプトが有効になってから、最初のフレーム更新の直前にStart()関数が呼ばれます。
最初に呼ばれるStart()関数の中で、DiceのRigidbodyを取得しています。
これは、ボタンを押されたときにDiceに力を加えて物理的な挙動をさせたいので、そのためにRigidbodyのインスタンスを持っておく必要があるためです。

RollTheDice()関数が実際にボタンを押された時にサイコロに力を加えて「サイコロを振る」という挙動を実現している関数になります。

3次元の長さが1のベクトルをランダムに生成して(Random.onUnitSphereを使用しています)、そのベクトルをforceMagnitude倍して瞬間的な力を加えています。
ForceMode.Impulseが瞬間的な力を与えることを指定していて、rb.AddForceによって実際に力を加えています。

その後に同じようにランダムな長さ1のベクトルを作成して、そのベクトルついて瞬間的に回転を発生させています。
ここで第一引数のベクトルが回転軸になり、ベクトルの大きさは回転の強さを表します。
ここではランダムに発生させた長さ1のベクトルのtorqueMagnitude倍しているので、回転の強さはtorqueMagnitudeになります。

これでサイコロはランダムな方向にランダムな回転軸を持って打ち出されることになります。

「サイコロを振る」という挙動が実装できました。

ちなみに、DiceのDice Rollerを見てみると、forceMagnituteとtorqueMagnitudeという項目が確認できると思います。
これはスクリプトの中でpublic宣言しているため、Inspectorビューから数値を調整できるようになっています。
サイコロの勢いが強い、または弱いと感じた場合は、この値を変更してみてください。


Buttonを選択して、InspectorビューのOnClick()の+ボタンを押します。
None (Object)と書かれている欄に、HierarchyのDiceをドラッグアンドドロップします。
No Functionと表示されているプルダウンメニューから、DiceRollerのRollTheDice()を選択します。

Unityの画面上部の再生ボタン▶から実行してください。
ボタンを押すと「サイコロを振る」ことができると思います。

(おまけ)カメラを上から見るように変更

カメラの位置が横からなので少し見にくいです。
斜め上から見下ろすようにしたいと思います。

HierarchyビューでMain Cameraを選択して、TransformのPositionを(0, 25, -15)に、Rotationを(60,0,0)に設定します。

最後に

今回は、Unityの物理エンジン Rigidbodyを使用して、ボタンをクリックするとサイコロがリアルに転がるシンプルなアプリを作成しました。

簡単な内容でしたが、Unityにおけるゲーム開発の重要なエッセンスがたくさん詰まっていました。

  • Rigidbodyの基本的な使い方 : オブジェクトに重力や物理演算を適用
  • AddForceメソッドとAddTorqueメソッド : オブジェクトに直線的な力と回転力を加えるテクニック (ForceMode.Impluseの活用)
  • UIボタンとの連携 : ボタンを押すというプレイヤーのアクションをきっかけに、ゲーム内のオブジェクトを動かす

これらの知識は、アクションゲームのジャンプや攻撃、パズルゲームのオブジェクト操作など、あらゆるジャンルのゲーム開発に応用できる基本です。

今回のプロジェクトは以下のような発展が考えられます。

  1. 出たサイコロの目を判定
  2. 複数のサイコロを同時に振る機能の追加
  3. 出た目に応じてサウンドやエフェクトを再生

最後まで読んでいただき、ありがとうございました!
この記事が、あたなのUnity学習の助けになれば幸いです。

ABOUT ME
MSK
数学・プログラミング・ゲーム制作が大好きな30代エンジニア。 趣味でUnityやC言語を使って数学を可視化したり、小さなアプリを作ったりしています。 教育・学びの楽しさにも関心があります。