配列の中身(要素)をランダムにシャッフルする|Unityゲーム制作

UnityのC#スクリプトで配列の中身(要素)をランダムにシャッフルしてみます。

はじめに

Unityのバージョンは「2021.3.14f1」で作成しています。

配列の中身(要素)をランダムに入れ替えるのをスクリプトで実装してみます。トランプゲーム、カードゲームに利用するイメージです。

実装開始

簡単なスクリプトで実装してから、実際の動きを見ていきます。

スクリプトの作成

下記スクリプトを作成します。int型の配列の要素を入れ替えています。

using UnityEngine;

public class RandomShuffle : MonoBehaviour
{

    void Shuffle(int[] deck)
    {
        for (int i = 0; i < deck.Length; i++)
        {
            int temp = deck[i];
            int randomIndex = Random.Range(i, deck.Length);
            deck[i] = deck[randomIndex];
            deck[randomIndex] = temp;
        }
    }
}

下記Unityマニュアルの「リストのシャッフル」そのままです。

簡単なスクリプトの説明

for文の中を簡単に説明すると「配列のi番目の要素を取得、i番目から配列の最大数まででランダムに配列の要素番号を取得、配列の要素を入れ替え」という感じです。これを配列の数だけ繰り返しています。

実行

実行してみて動作を確認してみます。下記にスクリプトを変更します。

using UnityEngine;

public class RandomShuffle : MonoBehaviour
{
    [SerializeField] private int[] nums;

    private void Start()
    {
        Shuffle(nums);
    }

    void Shuffle(int[] deck)
    {
        for (int i = 0; i < deck.Length; i++)
        {
            int temp = deck[i];
            int randomIndex = Random.Range(i, deck.Length);
            deck[i] = deck[randomIndex];
            deck[randomIndex] = temp;
        }
    }
}

Hierarchyに空オブジェクトを追加して、スクリプトを追加してパラメータに数字をセットします。

実行すると下記のように配列の中身がランダムに入れ替わります。

フィッシャー-イェーツのシャッフル

ランダムにシャッフルするアルゴリズムで有名なのがフィッシャー-イェーツのシャッフルです。

先の例では配列の前から入れ替えを行いましたが、フィッシャー-イェーツのシャッフルでは後ろの配列要素から入れ替えていきます。

スクリプトの作成

実際のスクリプトは下記のような感じです。今回はint型ではなく、GameObject型にしています。

    void FYShuffle(GameObject[] deck)
    {
        for (int i = deck.Length - 1; i > 0; i--)
        {
            int j = Random.Range(0, i + 1);

            GameObject temp = deck[j];
            deck[j] = deck[i];
            deck[i] = temp;
        }
    }

分かりやすいように、ボタンを押した時にシャッフルするのを実装したのが下記です。

使用したアセットは下記です。

タイトルとURLをコピーしました