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;
}
}
分かりやすいように、ボタンを押した時にシャッフルするのを実装したのが下記です。

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

