Guardar muchos datos#
Cuando necesitas varios valores (un inventario, la lista de enemigos, las puntuaciones), usas una colección. Las tres que cubren casi todo: array, List y Dictionary.
Array: tamaño fijo#
Rápido y ligero, pero su tamaño no cambia una vez creado.
int[] puntuaciones = new int[3] { 100, 250, 90 };
Debug.Log(puntuaciones[0]); // 100 — se cuenta desde 0
puntuaciones[1] = 300; // modificar
Debug.Log(puntuaciones.Length); // 3 — cuántos hayEl primer elemento es el índice 0, el segundo el 1... En un array de 3, los índices válidos son 0, 1 y 2. Acceder a puntuaciones[3] lanza IndexOutOfRangeException.
List: tamaño dinámico#
La más usada. Puedes añadir y quitar elementos sobre la marcha. Necesita using System.Collections.Generic;.
using System.Collections.Generic;
List<string> inventario = new List<string>();
inventario.Add("Espada");
inventario.Add("Poción");
inventario.Remove("Espada");
Debug.Log(inventario.Count); // cuántos elementos
Debug.Log(inventario.Contains("Poción")); // true
Debug.Log(inventario[0]); // acceso por índiceDictionary: pares clave → valor#
Guarda asociaciones: una clave te da un valor, como un diccionario real. Búsqueda muy rápida por clave.
using System.Collections.Generic;
Dictionary<string, int> precios = new Dictionary<string, int>();
precios["Poción"] = 50;
precios["Escudo"] = 120;
Debug.Log(precios["Escudo"]); // 120
// Comprobar antes de acceder (evita error si no existe)
if (precios.TryGetValue("Poción", out int p))
Debug.Log("Cuesta " + p);precios["Casco"] cuando "Casco" no existe da KeyNotFoundException. Usa TryGetValue o ContainsKey para comprobar antes. Y una clave no se puede repetir: añadir dos veces la misma con Add da error.
Cuál usar#
- ¿Cantidad fija y conocida, máximo rendimiento? → array
- ¿Lista que crece y mengua, acceso por posición? → List
- ¿Buscar por una clave (nombre, id)? → Dictionary
- ¿Solo te importa si algo está o no (sin duplicados)? → HashSet
- ¿Cola de espera (primero en entrar, primero en salir)? → Queue
Recorrerlas#
// foreach: lo más legible
foreach (string arma in inventario)
Debug.Log(arma);
// Dictionary: clave y valor
foreach (var par in precios)
Debug.Log(par.Key + " cuesta " + par.Value);Añadir o quitar elementos de una lista dentro de su propio foreach lanza InvalidOperationException. Si necesitas eliminar mientras recorres, usa un for hacia atrás o recopila lo que vas a borrar y elimínalo después.
Rendimiento en Unity#
- Crear listas nuevas cada frame genera basura para el recolector. Reutiliza una lista y hazle
Clear()en vez de crear otra. List.Removede la mitad de la lista desplaza el resto (coste). Para muchos objetos que entran y salen, valora otras estructuras o el object pooling.- Recorrer un
Dictionaryno garantiza orden; si necesitas orden, usaList.
Errores frecuentes#
- Salirse de rango en arrays/List (índice fuera de
[0, Count-1]). - Acceder a una clave inexistente en un Dictionary sin comprobar.
- Modificar una colección dentro de su
foreach. - Olvidar
using System.Collections.Generic;paraList/Dictionary. - Crear colecciones nuevas cada frame en vez de reutilizarlas.
Ponte a prueba#
Resumen#
Array para cantidad fija, List para colecciones que cambian, Dictionary para buscar por clave (HashSet/Queue para casos concretos). Recorre con foreach, comprueba antes de acceder (índices y claves), no modifiques durante el foreach, y cuida la basura reutilizando colecciones en el bucle de juego. Se apoyan en bucles y sostienen sistemas como inventarios y pools.