【Unity】重複しない数値と配列をランダムで出力する

ランダムクラスを作成
当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク

ランダムは、ゲームのデザインにおいて敵の行動パターンやアイテム、ダメージ計算、スキル発動確立などの乱数生成に使用されます。

その他にも、ゲーム内のイベントやダイス(サイコロ)を振ることでリザルトに影響を与えるなどランダムはゲーム開発に欠かせません。

ランダムを作る場合は、int型・float型の範囲、配列やリストを並び替えて作ることができます。

本記事では、Unityでランダムな要素を表示する方法を紹介します。

本記事は次の人におすすめ
  • Unityでランダムを生成したい。
  • Randomクラスを使いたい。
  • フィッシャーイェーツのシャッフルを使いたい。
Udemyで学習する
スポンサーリンク

指定した範囲でランダム生成

UnityのRandom.Range()でランダムを生成します。

Random.Range()は、指定した範囲内でランダムな数値を生成するために使用されます。
Unityでランダム生成する際に、メジャーなメソッドです。

“Random.Range(min, max)”と記述し、min/maxを含めたint型あるいはfloat型の範囲でランダム生成されます。

Spaceキーを押すと、ランダムな浮動小数点数(float)と整数(int)を生成します。

Speceキー以外にもマウス操作ができます。

生成したランダムな数値は、画面上に表示します。
表示には、TextMeshProUGUIを使用しています。

TextMeshProUGUIの導入やインストールの詳細を紹介しています。

また、数値を画面上に表示するには、int型やfloat型から、
文字列として変換する必要があります。

数値を文字列にして画面に表示させる方法を紹介しています。
using UnityEngine;
using TMPro;

public class sample1 : MonoBehaviour
{
    public TextMeshProUGUI floatLog; 
    public TextMeshProUGUI intLog;  

    void Update()
    {
        // スペースキーが押されたかどうかを検出
        if (Input.GetKeyDown(KeyCode.Space))
        {
            float randomFloat = Random.Range(0f, 10f); // ランダムな浮動小数点数を生成
            int randomInt = Random.Range(1, 50);      // ランダムな整数を生成

            // TextMeshProのTextプロパティにランダムな値を表示
            floatLog.text = randomFloat.ToString("F2");
            intLog.text =  randomInt.ToString();
            Debug.Log("Random Float: " + randomFloat);
            Debug.Log("Random Int: " + randomInt);
        }
    }
}

実装例

Unityでランダムなfloat,int型数値を生成します

ランダムな位置にオブジェクトを生成する

Random.Range()Vectorを組み合わせると、
ランダムな位置からオブジェクトを出力できます。

instantiate関数でオブジェクトを複製する方法を紹介しています。
using UnityEngine;
using TMPro;

public class sample2 : MonoBehaviour
{
    public GameObject prefab; // 生成するオブジェクト
    public TextMeshProUGUI countString; // spaceキー回数
    public Vector2 AreaMin = new Vector3(-10.0f, -5.0f); // 最小値
    public Vector2 AreaMax = new Vector3(10.0f, 5.0f);   // 最大値
    int count; //スペースキーを押した回数

    void Update()
    {
        // スペースキーを押すと新しいオブジェクトを生成
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // ランダムな位置を計算
            Vector2 randomPosition = new Vector2(
                Random.Range(AreaMin.x, AreaMax.x),
                Random.Range(AreaMin.y, AreaMax.y));

            //Instantiate関数によるオブジェクトの複製
            GameObject newObject = Instantiate(prefab, randomPosition, transform.rotation);
            Debug.Log("Position: " + randomPosition);
            count++;
            countString.text = count.ToString();
        }
    }
}

オブジェクトの位置は、Vectorを使用します。

Vector3の場合は、座標を(x,y,z)で取得します。
パラメータをRandom.Range()で指定することでランダムな位置を取得します。

Vectorの使い方の紹介をしています。

実装例

Random.Range()とVector、Instantiate()関数でオブジェクトの生成をします。

ランダムを使った確率

敵に攻撃をした時、ヒットする確率をRandom.Range()で作成します。
spaceキーで攻撃をします。攻撃力は1から10までのランダムです。

3の倍数の場合は攻撃をヒット(30%)させて、それ以外は外れたことにします。
画面にヒットは赤文字。ミスは青文字で表示します。

using UnityEngine;
using TMPro;

public class application : MonoBehaviour
{
    public TextMeshProUGUI attack;
    public TextMeshProUGUI enemyHP;
    int enemyPoint = 20;

    void Update()
    {
        enemyHP.text =enemyPoint.ToString();
        // スペースキーが押されたかどうかを検出
        if (Input.GetKeyDown(KeyCode.Space))
        {
            int attackPoint = Random.Range(1, 10);      // ランダムな整数を生成
            if (attackPoint % 3 == 0) //3の倍数
            {
                attack.text = "<color=red>hit</color>";
                enemyPoint -= attackPoint; // 敵のHPを攻撃ポイントで減らす
                Debug.Log("enemyHP:" + enemyPoint);
            }
            else
            {
                attack.text = "<color=blue>miss</color>";
            }
            Debug.Log("attack:" + attackPoint);
        }
    }
}

実装例

UNityでランダムな確率を作成します。

配列・リストをランダムに並び替える

Unityでフィッシャー・イエーツのシャッフルアルゴリズムを作成します。

配列・リストの乱数生成は、トランプのようなカードの山をシャッフルするときに使用します。

{1,3,6,-1}を{-1,6,1,3}のように、配列をランダムで並び替えるには、フィッシャー・イエーツのシャッフルアルゴリズムが効果的です。

このアルゴリズムは、要素を前から後ろへ順番に、その要素を残りの未処理の要素の中からランダムに選んで交換することでシャッフルを実現します。

ソースコード

using UnityEngine;
using System;

public class sample3 : MonoBehaviour
{
    void Start()
    {
        int[] arrayToShuffle = {1,3,6,-1}; // シャッフルする配列

        Shuffle(arrayToShuffle); // 配列をシャッフル

        Debug.Log("Shuffled Array:");
        foreach (int num in arrayToShuffle)
        {
            Debug.Log(num);
        }
    }

    // フィッシャー・イエーツのシャッフルアルゴリズムを実装
    void Shuffle(int[] array)
    {
        System.Random rand = new System.Random();
        int n = array.Length;
        for (int i = n - 1; i > 0; i--)
        {
            int j = rand.Next(i + 1);
            // 選択した要素と最後の要素を交換
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

\Unityの学習から収益化の方法はこちらから!/



解説

Start()メソッドは、シャッフルされる配列を作成し、配列をシャッフルして、シャッフルされた配列の要素をログに出力しています。

Shuffle()メソッドは、フィッシャー・イエーツのシャッフルアルゴリズムを実装しています。このアルゴリズムは、与えられた配列をランダムにシャッフルします。

具体的には、配列の最後の要素から始めて、ランダムに選んだ要素と交換することで配列をシャッフルします。

System.Randomクラスを使用してランダムな整数を生成しています。

実装例

フィッシャー・イエーツのシャッフルアルゴリズムで配列・リストを並び替えます。

まとめ

ゲームでランダムを使用する場面は数多くあります。
ランダムの生成には、Random.Range()を使用します。

配列やリストの中身をランダムにするには、フィッシャー・イエーツのシャッフルアルゴリズムを使用します。

参考サイト:「重要なクラス – Random – Unity マニュアル

Udemyで学習する

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました