はじめに
Unityでは、リストの中からランダムにオブジェクトを選び、重複しないように表示する機能を簡単に作ることができます。この記事では、5色のキューブを用意し、その中からランダムで異なる3つを表示する仕組みを一緒に作ってみましょう!
Unityを触ったことがないという方はコチラの記事から見てみてください!
この記事でわかること
この記事を読めば、次のことができるようになります:
- Unityでリストを使ったオブジェクト管理の基本
- オブジェクトをランダムに選び、非重複で表示する仕組み
- スクリプトを使ったオブジェクトのアクティブ化とリスト操作
手順
1. キューブを5個作成して色を変更する
まず、Unityのシーンにキューブを5つ配置し、それぞれの色を変えます。
- Hierarchyウィンドウを右クリック → 3D Object → Cube を選び、キューブを作成します。
- キューブを複製して5個に増やします(Ctrl + D)。
- プロジェクトウィンドウを右クリック「Create」→「Material」を選び作成し、インスペクター画面から色を設定して、キューブにアタッチして異なる色を設定します。
これで準備完了です!
2. スクリプトを作成
次に、シャッフルの仕組みを作るためのスクリプトを用意します。
- Projectウィンドウを右クリック → Create → C# Script を選び、スクリプト名を
ShuffleList
にします。 - Hierarchyウィンドウを右クリック → Create Empty を選んで、空のオブジェクトを作成し、スクリプトをアタッチします。
- 作成したスクリプトをダブルクリックして編集画面を開き、以下のコードを入力します。
フィールドの説明
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つ選ぶ
Random.Range(0, myList.Count)
で、myList
の中からランダムなインデックスを選び、そのオブジェクトをrandomObj
に代入します。
useList
に追加- 選ばれたオブジェクトを
useList
に追加します。
- 選ばれたオブジェクトを
- アクティブ化
- 選ばれたオブジェクトを
SetActive(true)
でアクティブにします。
- 選ばれたオブジェクトを
- 元のリストから削除
- 選ばれたオブジェクトを
myList.Remove(randomObj)
で削除します。これで同じオブジェクトが重複して選ばれることを防ぎます。
- 選ばれたオブジェクトを
- ランダムに1つ選ぶ
全体の動き
- シーン開始時の準備:
myList
に登録されたすべてのゲームオブジェクトが非アクティブになります。
- ランダム選択とアクティブ化:
- 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. リストにキューブを登録する
- 空のオブジェクトを選択します。
- Inspectorウィンドウの
ShuffleList
スクリプトセクションを展開します。 My List
にサイズとして「5」を入力します。- 各要素に先ほど作成した5つのキューブをドラッグ&ドロップして登録します。
4. ゲームをプレイ
- 上部の「Play」ボタンをクリックしてゲームを再生します。
- 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開発をさらに楽しみましょう!