【Unity】確率の作り方を知ってゲーム内に運要素を入れていこう!

Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityで確率を作りたい!」

「運要素の仕組みをどうやって作ればいいのか知りたい!」

というお悩みの方に向けた内容となっています。

ゲーム作りをしていると、モンスターを倒して落とすアイテムやガチャなど、確率を使って運要素を作りたい場合があります。

この確率の仕組みをゲームで作る場合、ランダムに生成された数列である乱数を使って、それぞれの確率における処理を作ることで実現できます。

実際にUnityで確率を作る場合は、Random.Rangeメソッドで乱数を生成し、その乱数毎に処理を変えることで、確率を使ったランダム要素の仕組みを作成できます。

そこでこのページでは、Unityでのゲーム作りにおける確率を作るための仕組みと、実際にUnityでの作り方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

確率を作るための仕組み

まずは、運要素である確率を作るための仕組みについてまとめていきます。

確率で重要となる「乱数」

確率を作る際に重要になるのが、「乱数」というものです。

この乱数とは、ランダムに生成された数列のことで、規則性のない数字のことを表します。

例えば、1から6までの目が書かれているサイコロを振った際、次にいくつの目が出るかは誰にも分かりません。

このサイコロの目のように、次の数字が予測できない数列のことを乱数と言います。

そして、この乱数を使うことで、ゲーム内でランダム要素を作り出すことができます。

ただし、Unityなどプログラム上では乱数を作り出すことができないので、「疑似乱数」という仕組みが使われています。

疑似乱数は、あくまでも計算された上で乱数を作り出しているため、厳密には規則性がある乱数と言えます。

乱数に合わせて処理を変更させる

乱数で生成された数字毎に処理を変えてあげることで、確率を作ることができます。

例えば、先ほども説明したサイコロの目は、1から6までの6通りの目があり、サイコロを振ってそれぞれの目が出る確率は1/6、つまり約16.7%の確率となります。

そして、そのサイコロを振って出た目毎に処理を変更してあげることで、確率に合わせた処理を作ることができます。

このサイコロの仕組みと同じで、Unity上で乱数を生成して、その生成された数字毎に処理を変えてあげれば、確率によるランダム処理を作ることができます。

Unityでの確率の作り方

ここからは、実際にUnityで確率を使った処理の作り方を紹介していきます。

乱数の生成はRandom.Rangeを使う

Unityでは、乱数(疑似乱数)を生成する場合、Random.Rangeメソッドを使います。

Random.Rangeとは、指定した範囲にある数字からランダムな数字を取得することができるRandomクラスで定義されているメソッドです。

以下のように引数に、最小となる数値最大となる数値int型float型で指定することで、その範囲にある数をランダムで取得できます。

Random.Range(最小数値, 最大数値);

なお、int型の整数で指定する際にはひとつ注意があり、最大数値となる整数は範囲外になるため、例えば、以下のように記述した場合、

Random.Range(1, 6);

「6」は含まず「1」「2」「3」「4」「5」5個の数字からランダムな数字を一つ取得することになります。

なお、Random.Rangeメソッドについては、以下のページで使い方を詳しくまとめていますので、参考にしてみてください。

乱数に合わせて処理を作っていく

Random.Rangeメソッドで乱数を生成できたら、その取得した数字に合わせて処理を作っていきます。

ここでは、シーン内に四角いオブジェクトを配置して、スペースキーを押したら、60%の確率でオブジェクトが赤色に変更、30%の確率で緑色、10%の確率で黄色に変更するという処理を作っていきます。

四角いオブジェクトに対して、以下のスクリプトを紐づけていきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    SpriteRenderer sr;
    int number;
    bool isChanging;    // 色が変更されているかどうかを判定する変数

    float delta;
    float time = 1.0f;

    void Start()
    {
        sr = GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        // 色が変更されている場合の処理
        if (isChanging == true)
        {
            delta += Time.deltaTime;
            if (delta > time)
            {
                sr.color = Color.white; // 色を白色に戻す処理
                delta = 0;
                isChanging = false;
            }
        }
        
        // スペースキーを押した場合の処理
        if (Input.GetKeyDown(KeyCode.Space) && isChanging == false)
        {
            number = Random.Range(1, 11);   // 10個の整数をランダムで取得する

            // 「1」の場合の処理
            if (number == 1)
            {
                sr.color = Color.yellow;
            }
            // 「5」よりも小さい場合の処理
            else if (number < 5)
            {
                sr.color = Color.green;
            }
            // それ以外の場合の処理
            else
            {
                sr.color = Color.red;
            }

            isChanging = true;
        }
    }
}

スペースキーを押した場合の処理の中の34行目で、Random.Rangeメソッドを使って、1~10までの10個の数字からランダムな数字を取得します。

そしてまず、10%の確率である黄色に変更する処理を作る場合は、10個の中から1個の数字の時だけの処理を作ってあげれば良いので、37行目から40行目で数字が「1」のときの場合をif文で分けて、その中で黄色に変更するようにしています。

同じように、30%の確率は10個の中から3個の数字を選択すれば良いので、42行目から45行目で数字が「5」よりも小さい時、つまり「2」「3」「4」の時をif文で分けて、その中で緑色に変更するようにしています。

そして、それ以外の残りの数字の時、つまり5~10までの6個の数字の時が60%の確率になるので、47行目から50行目で赤色に変更する処理を加えています。

実際にゲームを実行してみると、

スペースキーを押すとランダムで色が変わるようになり、黄色に変更される処理が10%とレアなパターンとなっているのがわかります。

まとめ

このページでは、Unityで確率を使った処理の仕組みや、実際に確率の作り方までをまとめていきましたが、いかがでしたでしょうか?

確率を使った処理を作る場合は、規則性のない数列である乱数を生成して、その数値毎で処理を変更することで実現できます。

Unityで乱数を生成する場合は、Random.Rangeメソッドを使うことで、指定した範囲内にある数字をランダムで取得できます。

その取得した数字に合わせて、if文で処理を分けてあげることで、確率に合わせたランダム的な要素を作ることができます。

最後までお読みいただきまして、ありがとうございました!

コメント