オブジェクトのリスト
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 65/85。
配列の長さは固定されており、作成時に設定されます。スポーナーは作成するオブジェクトの数を事前に把握できないため、それらを拡張できるC#の配列であるList<T>に保持します。これはSystem.Collections.Genericにあり、Tは保持する項目の型です。この噴水は、作ったコインをすべて記録します。
using System.Collections.Generic;
using UnityEngine;
public class CoinFountain : MonoBehaviour
{
public GameObject coinPrefab;
List<GameObject> coins = new List<GameObject>();
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GameObject coin = Instantiate(coinPrefab, transform.position, Quaternion.identity);
coins.Add(coin);
Debug.Log(coins.Count + " coins");
}
}
}Addは項目を末尾に追加し、Countは項目数を示します。配列の場合はLengthを使います。読み取り方は配列と同じです。coins[0]は最初のコインを表し、foreach (GameObject c in coins)ですべてのコインを順に処理します。coins.Remove(coin)はその項目を取り除き、coins.RemoveAt(0)は最初の項目を取り除きます。その後ろにある項目は1つ前に移動します。
リスト自体はnewを使って作成する必要があります。List<GameObject> coins;と書かれたフィールドはnullを保持するため、最初のAddでNullReferenceExceptionが発生します。
チャレンジ
中級クリックするたびにボックスがリストに追加されるようにしましょう。
using System.Collections.Generic;とフィールドList<GameObject> boxes = new List<GameObject>();を追加します。- クリック時に、回転なしで
boxPrefabをtransform.position + new Vector3(boxes.Count * 1.5f, 0, 0)の位置に生成し、boxesに追加します。 "Boxes: " + boxes.Countをログに記録します。
「プレイ」を押して3回クリックすると、ボックスが3つ横一列に並びます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class BoxStacker : MonoBehaviour
{
public GameObject boxPrefab;
// boxes: private な List<GameObject>
void Update()
{
// Click: ボックスを生成し、リスト内のボックス1個につき右へ1.5ずつずらして配置し、リストに追加して個数をログに記録する
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド