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:
| Trozo | Qué te dice |
|---|---|
15:42:03.221 | Cuándo pasó. Sirve para saber si es de esta ejecución o quedó de la anterior |
ServerScriptService.SistemaDeBotin | Qué 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 |
Server | Pasó 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:
- ¿Está escrito exactamente igual?
Cofreno escofreniCOFRE. Luau distingue mayúsculas. - ¿Está donde el script cree? Si el Part está dentro de un Model, la ruta es
workspace.Modelo.Cofre. - ¿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 eraobjeto:Metodo(). Los dos puntos pasan el objeto como primer parámetro; el punto no. - Un servicio mal cogido.
game.ReplicatedStoragefunciona, pero lo correcto esgame: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:
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




Deja una respuesta