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