Unityでゲームオブジェクトを効率よく管理するために、配列やリストを使うことがあります。この記事では、「タグ付きオブジェクトを配列に格納し、それをリストに移す方法」を解説します。この仕組みを理解すれば、ゲーム中のオブジェクトを柔軟に操作できるようになりますよ!
この記事でできること
- Unityでタグ付きオブジェクトを検索し、配列に格納する方法を学べます。
- 配列からリストに要素を移す仕組みを作れます。
- C#スクリプトを実際に書いて動作を確認できます。
1. Cubeを複製してタグを設定する
まずはゲーム内で扱うオブジェクトを作成します。
- Hierarchy(ヒエラルキー)ウィンドウを右クリック
→「3D Object」→「Cube」を選びます。 - 作成したCubeを選択し、Inspector(インスペクター)ウィンドウで「Tag」をクリック。
- 「Tag」を「Cube」に設定します。もし「Cube」がない場合は、「Add Tag」を選んで新しく「Cube」というタグを作成してください。
- Ctrl+D(またはCmd+D)でCubeを4つ複製し、合計5つのCubeを作成します。
- 全てのCubeに「Cube」タグが設定されていることを確認しましょう。
2. 空のオブジェクトを作成
次に、配列とリストを操作するスクリプトをアタッチするために空のオブジェクトを作成します。
- Hierarchyウィンドウを右クリック
→「Create Empty」を選びます。 - 作成された空のオブジェクトを選択し、名前を「Manager」に変更します。
3. ArrayList.csを作成して記述
配列からリストへ要素を移すスクリプトを作成します。
- Project(プロジェクト)ウィンドウを右クリック
→「Create」→「C# Script」を選びます。 - スクリプトの名前を「ArrayList.cs」に変更します。
- 「ArrayList.cs」をダブルクリックして開き、以下のコードを記述します:
1. 変数の宣言
public GameObject[] cubeArray; // Cubeオブジェクトを格納する配列
public List<GameObject> myList = new List<GameObject>(); // 配列から移すリスト
cubeArray
: ここに「Cube」タグがついているゲームオブジェクトが配列として格納されます。配列はサイズが固定なので、新しくオブジェクトを追加したり削除したりできません。myList
: 配列の中身を柔軟に管理できるList
型に変換するための変数です。リストはオブジェクトを追加・削除が自由にできる便利な型です。
2. Startメソッドで最初に動く処理
void Start()
{
// "Cube"タグが付いたすべてのオブジェクトを検索して配列に格納
cubeArray = GameObject.FindGameObjectsWithTag("Cube");
GameObject.FindGameObjectsWithTag("Cube")
- Unity内で「Cube」というタグが付いたすべてのゲームオブジェクトを探します。
- 結果は配列
cubeArray
に格納されます。 - 例:「Cube」タグがついたゲームオブジェクトが3つあれば、配列に3つの要素が入ります。
3. 配列の中身をリストに移す処理
foreach(GameObject cubes in cubeArray)
{
myList.Add(cubes);
}
foreach
ループcubeArray
に入っているすべてのゲームオブジェクトを1つずつ取り出し、myList
に追加します。myList.Add(cubes)
: リストにオブジェクトを追加するメソッドです。
4. リストの中身を確認する
Debug.Log("リストに追加されたオブジェクトの数: " + myList.Count);
}
Debug.Log
- Unityのコンソールにメッセージを表示する機能です。
- **
myList.Count
**は、リストに何個のオブジェクトが入っているかを返します。
全体の動きまとめ
- ゲーム開始時に
Start
メソッドが呼び出されます。 - 「Cube」タグが付いたすべてのオブジェクトを探して、配列
cubeArray
に入れます。 - 配列内のオブジェクトを1つずつ
myList
に移します。 - リストに入ったオブジェクトの数をUnityのコンソールに表示します。
ポイント解説
- タグの活用
- 「Cube」タグを使って特定のオブジェクトを見つける方法は、シンプルで便利です。
- タグを設定するには、Unityエディターでオブジェクトを選び、インスペクターの「Tag」を設定します。
- 配列とリストの違い
- 配列はサイズ固定で変更不可。リストは追加や削除が自由にできる。
- このスクリプトでは、配列で一度取得してからリストに移すことで、今後オブジェクトを柔軟に操作できるようにしています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ArrayList : MonoBehaviour
{
public GameObject[] cubeArray; // Cubeオブジェクトを格納する配列
public List<GameObject> myList = new List<GameObject>(); // 配列から移すリスト
void Start()
{
// "Cube"タグが付いたすべてのオブジェクトを検索して配列に格納
cubeArray = GameObject.FindGameObjectsWithTag("Cube");
// 配列の中身をリストに追加
foreach(GameObject cubes in cubeArray)
{
myList.Add(cubes);
}
// 確認用:リストに追加されたオブジェクトをコンソールに表示
Debug.Log("リストに追加されたオブジェクトの数: " + myList.Count);
}
}
- スクリプトを保存したら、「Manager」にドラッグ&ドロップしてアタッチします。
4. ゲームを再生して確認
準備ができたら、Unityエディター上でゲームを再生して結果を確認しましょう。
- 再生後、コンソールウィンドウを確認します。
- 「リストに追加されたオブジェクトの数: 5」と表示されていれば成功です!
配列 cubeArray
に入っているオブジェクトが、リスト myList
に無事に移されました。
仕組みの解説
- GameObject.FindGameObjectsWithTag(“Cube”)
「Cube」タグが付いたすべてのオブジェクトを検索し、配列に格納します。 - foreachループ
配列の要素を1つずつ取り出し、リストに追加します。このループのおかげで、すべてのオブジェクトを簡単に操作できます。
Unity開発を効率化する最強ツール!
Odin Inspector & Serializerは、Unityのインスペクターをカスタマイズして開発を効率化できる有料アセットです。面倒なスクリプトなしでインスペクターを見やすくし、データ管理も簡単にできます。
例えば、1行のコードで配列やリストをインスペクターに表示し、直感的に操作可能!初心者から上級者まで使いやすく、プロジェクト全体の管理がスムーズに。
時間を節約してもっと開発を楽しみたいなら、今すぐOdin Inspector & Serializer!で検索してみてください!
よくある質問
- Qリストに重複して追加されることはありますか?
- A
いいえ、
GameObject.FindGameObjectsWithTag
で検索された結果をそのままリストに追加しているので、配列の内容とリストの内容は一致します。
- Qなぜリストを使うのですか?
- A
リストは配列と違ってサイズが可変で、要素の追加や削除が簡単にできます。ゲーム開発では、動的にオブジェクトを管理したい場合に便利です。
- Qリストの中身を確認するには?
- A
Debug.Log
を使って確認できます。例えば、リストの全要素を確認するには以下のコードを使います:foreach(GameObject obj in myList)
{
Debug.Log(obj.name);
}