Los errores de Luau más comunes y cómo leer la consola

Claim Your Loot

·


Te sale una línea roja en el Output, la lees, no entiendes nada y la copias en Google. A veces hay suerte y a veces no.

La buena noticia es que el 90 % de los errores de Luau son cinco mensajes, siempre los mismos, y cada uno significa una cosa muy concreta. Cuando aprendes a leerlos dejas de buscar en Google y arreglas el fallo en veinte segundos.

Respuesta rápida

Un error rojo tiene tres partes: dónde (script y línea), qué pasó, y con qué objeto. Empieza siempre por el final del mensaje: es lo que te dice qué era nil, qué no existía o qué tipo esperaba. Y pulsa en el nombre del script del error: Studio te lleva a la línea exacta.

Cómo se lee una línea roja

Un error típico se ve así:

15:42:03.221  ServerScriptService.SistemaDeBotin:23: attempt to index nil with 'Triggered'  -  Server - SistemaDeBotin:23

Vamos por partes:

TrozoQué te dice
15:42:03.221Cuándo pasó. Sirve para saber si es de esta ejecución o quedó de la anterior
ServerScriptService.SistemaDeBotinQué script, y dónde está
:23:La línea exacta. Pulsa el enlace y Studio te lleva
attempt to index nil with 'Triggered'El error de verdad
ServerPasó en el servidor. Si pusiera Client, sería del jugador

Ese último trozo, Server o Client, es el que más gente ignora y el que más ayuda: te dice en cuál de los dos lados mirar.

Error 1: attempt to index nil with 'X'

Con diferencia, el más frecuente. Significa: intentaste entrar dentro de algo que no existe.

local cofre = workspace.Cofre        -- si no hay ningún Cofre, esto es nil
cofre.ProximityPrompt.Triggered:Connect(...)  -- error aquí

Qué mirar, por orden:

  1. ¿Está escrito exactamente igual? Cofre no es cofre ni COFRE. Luau distingue mayúsculas.
  2. ¿Está donde el script cree? Si el Part está dentro de un Model, la ruta es workspace.Modelo.Cofre.
  3. ¿Existía ya cuando el script lo buscó? Este es el caso traicionero.

Para el tercero, la solución es WaitForChild:

-- En vez de esto
local cofre = workspace.Cofre

-- Esto: espera a que aparezca
local cofre = workspace:WaitForChild("Cofre")

WaitForChild es obligatorio en el cliente, porque los objetos llegan poco a poco desde el servidor. En el servidor casi nunca hace falta, pero no molesta.

Cuidado: si el objeto no aparece nunca, WaitForChild se queda esperando y a los cinco segundos Studio te avisa con «Infinite yield possible». Ese aviso amarillo significa que el nombre está mal o el objeto no existe.

Error 2: attempt to perform arithmetic on a nil value

Intentaste sumar, restar o multiplicar con algo que no es un número.

local monedas = jugador.leaderstats.Monedas   -- esto es un objeto, no un número
monedas = monedas + 10                        -- error

El fallo típico es olvidarse de .Value:

local monedas = jugador.leaderstats.Monedas
monedas.Value = monedas.Value + 10            -- correcto

Un IntValue no es un número: es una caja que contiene un número. El número está en .Value.

Error 3: attempt to call a nil value

Llamaste a una función que no existe. Casi siempre es una de tres cosas:

  • Una errata. :WaitForChilld(), :Conect(), math.ramdom().
  • Punto en vez de dos puntos. objeto.Metodo() cuando era objeto:Metodo(). Los dos puntos pasan el objeto como primer parámetro; el punto no.
  • Un servicio mal cogido. game.ReplicatedStorage funciona, pero lo correcto es game:GetService("ReplicatedStorage"), que además funciona siempre aunque alguien renombre la carpeta.

Error 4: Unable to cast value to Object

Le pasaste el tipo equivocado a algo de Roblox.

parte.Position = 10                        -- error: espera un Vector3
parte.Position = Vector3.new(0, 10, 0)     -- correcto

parte.BrickColor = "Red"                   -- error: espera un BrickColor
parte.BrickColor = BrickColor.new("Really red")  -- correcto

Cuando lo veas, mira qué propiedad estás tocando y busca qué tipo espera. En el panel Properties, al pulsar sobre la propiedad Studio te enseña el formato.

Error 5: Infinite yield possible on 'X:WaitForChild("Y")'

No es un error rojo, es un aviso amarillo, y el script sigue corriendo. Pero significa que llevas cinco segundos esperando algo que probablemente no va a llegar.

Casi siempre: el nombre está mal escrito, o el objeto está en otro sitio, o lo buscas en el cliente pero vive en ServerStorage (que el cliente no ve).

Si de verdad puede tardar, ponle un tope:

local cofre = workspace:WaitForChild("Cofre", 10)  -- máximo 10 segundos
if not cofre then
	warn("El cofre no apareció, abortamos")
	return
end

Cómo depurar sin volverte loco

Pon prints antes del error, no después.

print("1. arranca el script")
local cofre = workspace:WaitForChild("Cofre")
print("2. cofre encontrado:", cofre)
local prompt = cofre:WaitForChild("ProximityPrompt")
print("3. prompt encontrado:", prompt)

Si en el Output ves 1 y 2 pero no 3, ya sabes que el problema está entre medias. Es tosco y es lo que más rápido funciona.

Usa warn en vez de print para lo importante. Sale en amarillo y lo distingues de un vistazo entre cien líneas.

Filtra el Output. La cajita de búsqueda del panel Output filtra en vivo: escribe el nombre de tu script y desaparece el ruido de Roblox.

Ponte a prueba

Encuentra la línea que revienta

Te doy el error de la consola. Pulsa la línea del script que lo provoca.

Error en la consola:

Caso 1 de 4 · Aciertos: 0

Errores habituales al depurar

El error apunta a una línea donde no hay nada raro

Mira la línea de arriba. Si dejaste un paréntesis sin cerrar o una función sin end, Luau se da cuenta más abajo.

El Output no muestra nada

O no está abierto (View > Output), o estás mirando la pestaña equivocada: hay un desplegable para filtrar entre Client y Server.

El error solo sale en el juego publicado

Suele ser tiempo: en Studio todo carga al instante y publicado no. Prueba con Test → Local Server antes de subir.

Preguntas frecuentes

¿Qué diferencia hay entre rojo y amarillo?

Rojo es un error: ese script paró ahí. Amarillo es un aviso: sigue funcionando, pero hay algo que probablemente no querías.

¿Por qué a veces no me sale ningún error y aun así no funciona?

Porque no hay error de sintaxis, sino de lógica: tu código hace exactamente lo que escribiste, pero no lo que querías. Ahí solo salvan los prints.

¿Puedo hacer que un error no pare el script?

Sí, con pcall, que ejecuta algo y te devuelve si salió bien en vez de reventar. Es imprescindible con DataStore, donde la llamada puede fallar por causas ajenas a ti.

¿Merece la pena aprender el depurador de Studio?

Los puntos de interrupción están bien para código complicado, pero para el día a día los prints son más rápidos. Empieza por dominar los prints.


Última revisión: 1 de septiembre de 2026

Claim Your Loot

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *