🎮 UnityDocs

IndexOutOfRangeException y ArgumentOutOfRange

Accedes a un array o lista con un índice que no existe. Por qué ocurre (empezar en 0, listas vacías, off-by-one), cómo localizarlo y cómo blindar los accesos a colecciones.

🐛 ErrorPrincipiante✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 5 min

El mensaje#

texto
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.

Se empieza a contar en 0

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)#

C#
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#

C#
// ❌ 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#

C#
// ❌ 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-1
Random.Range con ints excluye el máximo

Random.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:

C#
Debug.Log($"Accediendo a {i} de {lista.Count}");

Cómo blindarlo#

C#
// 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 el for (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 +1 se sale).
  • Usar un índice guardado tras haber quitado elementos de la lista.

Ponte a prueba#

📝 Pon a prueba lo aprendido

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.

Fuentes y para profundizar