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.
Desafío
IntermedioStacker debe llevar un registro de las cajas que crea:
- Guarda las cajas en un campo privado
List<GameObject>llamadoboxes. - 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 ejemploBoxes: 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
}
}
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
1Tu primer script
Hola, UnityColoca el cuboMuévete en cada fotogramaGira cada segundoDirige con las teclasRepaso: conduce el cubo4Vectores
Sumar vectoresDireccionesEspacio local y globalVelocidad diagonalDistancia entre objetosVector3 es una estructuraRepaso: piloto de dron7Proyecto: Atrapa la estrella
El atrapadorUna estrella fugaz10El ciclo de vida de los scripts
Awake y StartUpdate y LateUpdateOnEnable y OnDisableEl orden del ciclo de vidaRepaso: registrador del ciclo de vida2El Inspector
Campos del InspectorSerializeFieldNúmeros decimales y MathfAtributos del InspectorRepaso: Ascensor5Transformaciones y jerarquía
Padres e hijosEscalaMirar objetosMoverse hacia un puntoRepaso: Luna en órbita8Encontrar cosas
Buscar por nombreEtiquetasBuscar por tipoLas referencias superan a FindEl valor nulo de UnityRepaso: la moneda más cercana11Proyecto: Esquiva los bloques
El corredorBloques que caen6GameObjects y componentes
Referencias en el InspectorObtener un componenteComponentes faltantesAñadir un componenteRequireComponentMostrar y ocultarRepaso: interruptor de luz9Prefabs y generación
Prefabs e instanciarGenerar con un temporizadorGenerar en una cuadrículaListas de objetosDestruirGeneración aleatoriaRepaso: fuegos artificiales