Menu
CoddyTech

Listas de objetos

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 51 de 67.

Un array tiene una longitud fija, que se establece cuando se crea. Un generador no sabe de antemano cuántos objetos creará, así que los guarda en una List<T>: el array de C# que crece. Está en System.Collections.Generic, y T es el tipo de elemento que contiene. Esta fuente recuerda cada moneda que crea:

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 coloca un elemento al final, y Count indica cuántos hay; en un array, se usa Length. La lectura funciona igual que con un array: coins[0] es la primera moneda, y foreach (GameObject c in coins) las recorre todas. coins.Remove(coin) quita ese elemento y coins.RemoveAt(0) quita el primero; los elementos que vienen después avanzan una posición.

La lista en sí tiene que crearse con new. Un campo declarado como List<GameObject> coins; contiene null, y el primer Add se detiene con una NullReferenceException.

challenge icon

Desafío

Intermedio

Stacker debe llevar un registro de las cajas que crea:

  • Guarda las cajas en un campo privado List<GameObject> llamado boxes.
  • Cada clic genera una caja sin rotación y la añade a la lista. Una caja se coloca en la posición de Stacker más 1.5 en x por cada caja que ya esté en la lista: la primera en Stacker, la siguiente 1.5 a su derecha, y así sucesivamente.
  • La barra espaciadora retira la caja más reciente: ocúltala con SetActive(false) y elimínala de la lista. Si no hay cajas, la barra espaciadora no hace nada.
  • Después de cada cambio en la lista, registra Boxes: y la cantidad, por ejemplo Boxes: 3.

Pulsa Jugar, haz clic y pulsa la barra espaciadora; después, Comprobar.

Pruébalo tú mismo

using UnityEngine;

public class BoxStacker : MonoBehaviour
{
    public GameObject boxPrefab;
    // boxes: una List<GameObject> privada

    void Update()
    {
        // Click: crea una caja 1.5 unidades más a la derecha por cada caja de la lista y añádela
        // Space: oculta la caja más reciente y elimínala de la lista
        // Después de cada cambio, registra "Boxes: " y la cantidad
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos de scripting en Unity