UnityUnityメモ

Unityで学ぶ!重複せずにランダム抽出&シャッフルの基本テクニック

Unity

はじめに

Unityでは、リストの中からランダムにオブジェクトを選び、重複しないように表示する機能を簡単に作ることができます。この記事では、5色のキューブを用意し、その中からランダムで異なる3つを表示する仕組みを一緒に作ってみましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!




この記事でわかること

この記事を読めば、次のことができるようになります:

  • Unityでリストを使ったオブジェクト管理の基本
  • オブジェクトをランダムに選び、非重複で表示する仕組み
  • スクリプトを使ったオブジェクトのアクティブ化とリスト操作

手順

1. キューブを5個作成して色を変更する

まず、Unityのシーンにキューブを5つ配置し、それぞれの色を変えます。

  1. Hierarchyウィンドウを右クリック3D ObjectCube を選び、キューブを作成します。
  2. キューブを複製して5個に増やします(Ctrl + D)。
  3. プロジェクトウィンドウを右クリック「Create」→「Material」を選び作成し、インスペクター画面から色を設定して、キューブにアタッチして異なる色を設定します。

これで準備完了です!


2. スクリプトを作成

次に、シャッフルの仕組みを作るためのスクリプトを用意します。

  1. Projectウィンドウを右クリックCreateC# Script を選び、スクリプト名を ShuffleList にします。
  2. Hierarchyウィンドウを右クリックCreate Empty を選んで、空のオブジェクトを作成し、スクリプトをアタッチします。
  3. 作成したスクリプトをダブルクリックして編集画面を開き、以下のコードを入力します。

フィールドの説明

public List<GameObject> myList;
  • myList:
    • ゲームオブジェクト(Cubeなど)を格納するリスト。
    • シーンに置いた複数のオブジェクトをここに登録します。
public List<GameObject> useList = new List<GameObject>();
  • useList:
    • ランダムに選ばれたオブジェクトを格納するためのリスト。
    • 最初は空のリストを作っておきます。
private GameObject randomObj;
  • randomObj:
    • ランダムに選ばれたオブジェクトを一時的に入れる変数。

3. Startメソッド

ゲームが始まったときに実行される部分です。

foreach (GameObject cube in myList)
{
cube.SetActive(false);
}
  • 全オブジェクトを非アクティブにする
    • myListに入っているすべてのオブジェクトを1つずつ取り出して、SetActive(false)で非アクティブにします。
    • 非アクティブにすることで、ゲーム画面に表示されなくなります。
for (int i = 0; i < 3; i++)
{
randomObj = myList[Random.Range(0, myList.Count)];
useList.Add(randomObj);
randomObj.SetActive(true);
myList.Remove(randomObj);
}
  • ランダムに3つ選ぶループ
    1. ランダムに1つ選ぶ
      • Random.Range(0, myList.Count)で、myListの中からランダムなインデックスを選び、そのオブジェクトをrandomObjに代入します。
    2. useListに追加
      • 選ばれたオブジェクトをuseListに追加します。
    3. アクティブ化
      • 選ばれたオブジェクトをSetActive(true)でアクティブにします。
    4. 元のリストから削除
      • 選ばれたオブジェクトをmyList.Remove(randomObj)で削除します。これで同じオブジェクトが重複して選ばれることを防ぎます。

全体の動き

  1. シーン開始時の準備:
    • myListに登録されたすべてのゲームオブジェクトが非アクティブになります。
  2. ランダム選択とアクティブ化:
    • 3回ループして、myListからランダムにオブジェクトを1つ選びます。
    • 選ばれたオブジェクトを別のリストuseListに移し、アクティブ化します。
    • 選ばれたオブジェクトは元のリストmyListから削除されるため、同じオブジェクトは2回選ばれません。
  3. 結果:
    • myListにはアクティブ化されなかったオブジェクトが残り、useListには選ばれてアクティブ化された3つのオブジェクトが格納されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShuffleList : MonoBehaviour
{
    public List<GameObject> myList;  // Cubeを格納するリスト
    public List<GameObject> useList = new List<GameObject>();  // 選ばれたCubeを格納するリスト
    private GameObject randomObj;  // ランダムに選ばれるCube

    void Start()
    {
        // 全てのCubeを非アクティブ化
        foreach (GameObject cube in myList)
        {
            cube.SetActive(false);
        }

        // ランダムに3個を選択してアクティブ化
        for (int i = 0; i < 3; i++)
        {
            // myListの中からランダムで1つを選ぶ
            randomObj = myList[Random.Range(0, myList.Count)];
            // 選んだCubeをuseListに追加
            useList.Add(randomObj);
            // 選んだCubeをアクティブ化
            randomObj.SetActive(true);
            // 選んだCubeをmyListから削除
            myList.Remove(randomObj);
        }
    }
}



3. リストにキューブを登録する

  1. 空のオブジェクトを選択します。
  2. InspectorウィンドウShuffleList スクリプトセクションを展開します。
  3. My List にサイズとして「5」を入力します。
  4. 各要素に先ほど作成した5つのキューブをドラッグ&ドロップして登録します。

4. ゲームをプレイ

  1. 上部の「Play」ボタンをクリックしてゲームを再生します。
  2. 5個のキューブの中からランダムで3つが表示されます。同じキューブが選ばれることはありません。



よくある質問(Q&A)

Q
スクリプトがうまく動作しません。原因は何ですか?
A

以下を確認してください:

  • My List にキューブが正しく登録されていますか?
  • キューブがアクティブになっているか確認しましょう。
Q
なぜリストを使うのですか?
A

リストを使うと、オブジェクトの管理が簡単になり、ランダムに選んだり、削除したりする操作が楽になります。

Q
ランダム表示をもっと増やしたい場合はどうすればいいですか?
A

for (int i = 0; i < 3; i++) の「3」を「4」や「5」に変更すれば、表示されるキューブの数を増やせます。

Unity開発を効率化!アセットの活用もおすすめ

この記事で紹介したランダム表示の仕組みはUnity標準の機能だけで作れますが、プロジェクトが複雑になると管理が大変になることも。そんなときは、Unityアセットストアのアセットを活用するのがおすすめです!

例えば、「オブジェクトプール管理アセット」や「リスト管理ツール」などを使えば、コード量を大幅に減らし、効率よく開発できます。アセットストアでは高品質で便利なツールがそろっており、定期的にセールも開催中。チェックしてみてはいかがでしょう?

アセットを活用して、Unity開発をさらに楽しみましょう!