Menu
CoddyTech

Списки объектов

Часть раздела Основы скриптинга в 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.

challenge icon

Задание

Средне

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: " и количество коробок
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы скриптинга в Unity