【Unity】配列の要素をシャッフルする方法(図解)

この記事は約4分で読めます。

どうもなおゆです。前回はコルーチンについて説明しました。

今回は、配列に入れているプレハブをランダムに並び替えする方法について、備忘も兼ねてまとめます。(配列の型を変えるとintなどでも応用可能)

【環境】Unity2019.2.9f1 , C#

スポンサーリンク

配列の要素をランダムに入れ替え

Unityでゲームを作っていると、配列で管理しているオブジェクトをランダムに入れ替えたい時がよくあります。今回はRandomクラスを応用してシャッフルしていきます。

まずはシャッフルするための配列を宣言しよう

配列の型は何でも可能ですが、今回はプレハブを格納したGameObject型の配列を使います。

public GameObject[] foods = new GameObject[3];

配列の要素にはヒエラルキー画面からプレハブを追加しています。ハンバーガー・バナナ・寿司の順番で格納しました。

シャッフルメソッドを作成

続いて配列をシャッフルするためのメソッドを作成します。名前は「Shuffle」としました。

// 引数として受け取った配列の要素番号を並び替える 
void Shuffle(GameObject[] num) 
    {
        for (int i = 0; i < num.Length; i++)
        {
       //(説明1)現在の要素を預けておく
            GameObject temp = num[i]; 
       //(説明2)入れ替える先をランダムに選ぶ
            int randomIndex = Random.Range(0, num.Length); 
       //(説明3)現在の要素に上書き
            num[i] = num[randomIndex]; 
       //(説明4)入れ替え元に預けておいた要素を与える
            num[randomIndex] = temp; 
        }
    }

頭の良い人ならスンナリ理解できるでしょうが、頭の回転が錆びた歯車レベルの私なんかは理解するまでに結構時間がかかりました。ですので、後から見てもわかるように図解にして残しておくことにします。

コードの解説(図解)

それぞれの関係はこうです。

・引数として配列numがあり、プレハブが格納されたfoodsを渡します。

・その他に変数も2種類出てきます。

【説明1】

まずはGameObject型のtempに、要素番号0のハンバーガーを代入しておきます。

【説明2】

配列numの要素番号の中からランダムに入れ替える番号を採番します。それをint型のrandom Indexに代入します。

【説明3】

今回は[2]が採番されたので、要素番号2の寿司を要素番号0に代入します。

【説明4】

最後にtempによせておいたハンバーガーを要素番号2に代入してあげると、順番が変わります。

以上のことをfor文で要素数の数(今回は3回)だけ繰り返すことで、要素がランダムにシャッフルされます。

実行してみる

Shuffleメソッドはどこで呼び出してもよいですが、今回はStartで呼び出しました。結果シャッフルは成功でした。

public class ShuffleScript : MonoBehaviour
{
    public GameObject[] foods = new GameObject[3];

    void Start()
    {
        Shuffle(foods);
    }

    void Shuffle(GameObject[] num)
    {
        for (int i = 0; i < num.Length; i++)
        {
            GameObject temp = num[i]; // 現在の要素を預けておく
            int randomIndex = Random.Range(0, num.Length); // 入れ替える先をランダムに選ぶ
            num[i] = num[randomIndex]; // 現在の要素に上書き
            num[randomIndex] = temp; // 入れ替え元に預けておいた要素を与える
        }
    }
}

コメント

  1. 黒畑 より:

    とても見やすい解説サイトで大変参考になりました。どうもありがとうございました。

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