オブジェクトのリスト
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 51/67。
配列の長さは固定で、作成時に設定されます。スポナーは、いくつのオブジェクトを作るかを事前に把握できないため、オブジェクトを増やせる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 が発生して停止します。
チャレンジ
中級スタッカーは、作成したボックスを記録しておく必要があります。
- ボックスは、
boxesという名前のプライベートなList<GameObject>フィールドに保持します。 - クリックするたびに、回転なしでボックスを生成し、リストに追加します。ボックスはスタッカーの位置を基準に、リスト内にすでにあるボックス1つにつきx方向に1.5ずつずらした位置に配置します。最初のボックスはスタッカーの位置、次のボックスはその右1.5の位置、というように配置します。
- Spaceキーを押すと、最新のボックスを取り除きます。
SetActive(false)で非表示にし、リストから削除します。ボックスがない場合、Spaceキーを押しても何も起こりません。 - リストに変更があるたびに、
Boxes:とボックスの数をログに出力します。たとえば、Boxes: 3です。
Playを押し、クリックしてからSpaceキーを押し、その後Checkを押します。
自分で試してみよう
using UnityEngine;
public class BoxStacker : MonoBehaviour
{
public GameObject boxPrefab;
// boxes: private な List<GameObject>
void Update()
{
// Click: リスト内の箱1つにつき、さらに右へ 1.5 ずらした位置に箱を生成し、リストに追加する
// Space: 最新の箱を非表示にし、リストから削除する
// 変更のたびに "Boxes: " と箱の数をログに出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。