El mensaje#
IndexOutOfRangeException: Index was outside the bounds of the array.
Spawner.Spawnear () (at Assets/Scripts/Spawner.cs:18)(Con List<T> verás ArgumentOutOfRangeException, que es lo mismo pero para listas.)
Qué significa#
Intentas acceder a la posición n de una colección, pero esa posición no existe. En un array/lista de tamaño N, los índices válidos van de 0 a N-1. Pedir cualquier otro (negativo, o N o más) lanza este error.
El primer elemento es el índice 0, no el 1. En una lista de 3 elementos, los índices válidos son 0, 1 y 2. El 3 no existe: por eso lista[3] peta. Este "contar desde 0" es la causa nº1 del error.
Las causas típicas#
1. Off-by-one (el clásico)#
int[] a = new int[5];
// ❌ i llega hasta 5, pero el último índice válido es 4
for (int i = 0; i <= a.Length; i++)
Debug.Log(a[i]);
// ✅ usa < , no <=
for (int i = 0; i < a.Length; i++)
Debug.Log(a[i]);2. Colección vacía#
// ❌ Si 'puntos' está vacío, [0] no existe
Transform destino = puntos[0];
// ✅ comprueba antes
if (puntos.Length > 0)
Transform destino = puntos[0];3. Random mal calculado#
// ❌ Random.Range con ints es EXCLUSIVO arriba... pero +1 se pasa
int i = Random.Range(0, lista.Count + 1); // puede dar lista.Count → fuera
// ✅ sin +1
int i = Random.Range(0, lista.Count); // 0 .. Count-1Random.Range(0, lista.Count) con enteros devuelve de 0 a Count-1 (el máximo NO se incluye): justo los índices válidos. Con floats, en cambio, el máximo SÍ se incluye. Este detalle causa muchos IndexOutOfRange.
Cómo localizarlo#
La última línea del error te da el archivo y la línea (Spawner.cs:18). Ahí hay un acceso con [...]. Pregúntate: ¿puede ese índice ser negativo, o igual/mayor que el tamaño? ¿La colección puede estar vacía?
Un log rápido para confirmar:
Debug.Log($"Accediendo a {i} de {lista.Count}");Cómo blindarlo#
// Comprobación de límites
if (i >= 0 && i < lista.Count)
usar(lista[i]);
// Elemento aleatorio seguro
if (lista.Count > 0)
var x = lista[Random.Range(0, lista.Count)];
// Último elemento
if (lista.Count > 0)
var ultimo = lista[lista.Count - 1];Errores frecuentes#
<=en vez de<en elfor(recorre uno de más).- Acceder a
[0]de una colección que puede estar vacía. Random.Range(0, Count + 1)con enteros (el+1se sale).- Usar un índice guardado tras haber quitado elementos de la lista.
Ponte a prueba#
Resumen#
IndexOutOfRangeException (arrays) / ArgumentOutOfRangeException (listas) = accedes a un índice que no existe. Recuerda que se cuenta desde 0 (válidos: 0..N-1), usa < (no <=) en los bucles, comprueba que la colección no esté vacía antes de [0], y con Random.Range e ints el máximo se excluye (no sumes +1). Blinda los accesos comprobando los límites.