Списки объектов
Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 51 из 67.
Длина массива фиксирована и задаётся при его создании. Спавнер заранее не знает, сколько объектов он создаст, поэтому хранит их в List<T>: растущем массиве C#. Он находится в 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) удаляет первый; элементы после него сдвигаются на одну позицию вперёд.
Сам список нужно создать с помощью new. Если объявить поле как List<GameObject> coins;, оно будет содержать null, и первый вызов Add завершится с ошибкой NullReferenceException.
Задание
СреднеStacker должен отслеживать созданные им коробки:
- Храни коробки в приватном поле
List<GameObject>с именемboxes. - При каждом щелчке создавай коробку без поворота и добавляй её в список. Коробка размещается в позиции Stacker со смещением по x на 1.5 за каждую коробку, уже находящуюся в списке: первая — в позиции Stacker, следующая — на 1.5 правее неё и так далее.
- Клавиша Space возвращает последнюю созданную коробку: скрой её с помощью
SetActive(false)и удали из списка. Если коробок нет, нажатие Space ничего не делает. - После каждого изменения списка выводи в журнал
Boxes:и количество коробок, напримерBoxes: 3.
Нажми Play, щёлкни и нажми Space, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class BoxStacker : MonoBehaviour
{
public GameObject boxPrefab;
// boxes: приватный List<GameObject>
void Update()
{
// Click: создайте коробку, размещая каждую следующую на 1.5 правее предыдущей, и добавьте её в список
// Space: скройте последнюю коробку и удалите её из списка
// После каждого изменения выведите в лог "Boxes: " и количество коробок
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы скриптинга в Unity
1Ваш первый скрипт
Привет, UnityРазместите кубДвигайте каждый кадрПоворачивайте каждую секундуУправляйте клавишамиПовторение: управляйте кубом2Инспектор
Поля инспектораSerializeFieldЧисла с плавающей точкой и MathfАтрибуты инспектораПовторение: лифт5Преобразования и иерархия
Родители и детиМасштабПосмотри на объектыДвигайся к точкеПовторение: Луна на орбите6Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказать и скрытьПовторение: выключатель света9Префабы и создание объектов
Префабы и InstantiateСоздание объектов по таймеруСоздание объектов в сеткеСписки объектовDestroyСлучайное создание объектовПовторение: фейерверки