C
creation.devRoblox Hub

Scripting en Roblox para Principiantes: Aprende a Programar en Luau

Una introducción práctica al scripting con Luau en Roblox Studio — desde tu primera variable hasta tu primer script funcional, sin necesidad de experiencia previa en programación.

By creation.dev

El scripting en Roblox es lo que convierte una escena estática en un juego jugable. Cada puerta que se abre, cada moneda que se recolecta, cada tabla de clasificación que se actualiza — todo funciona con Luau, el lenguaje de programación integrado en Roblox Studio. Si nunca has escrito una línea de código, esta guía te llevará de cero a escribir scripts funcionales de verdad.

Luau está basado en Lua pero incluye características modernas como verificación de tipos y optimizaciones de rendimiento diseñadas específicamente para Roblox. Es uno de los lenguajes de programación más amigables para principiantes que existen, y todo lo que necesitas para escribir y ejecutar código ya está dentro de Studio — no se requieren editores de código ni instalaciones adicionales.

Configurando tu Entorno de Scripting

Abre Roblox Studio y crea un nuevo proyecto Baseplate. Asegúrate de que puedas ver el panel Explorer a la derecha y el panel Output en la parte inferior — ábrelos desde la pestaña View si no aparecen. El Explorer es donde creas y organizas scripts. El Output es donde lees las declaraciones print y los mensajes de error — tus principales herramientas de depuración como principiante.

Para crear tu primer script, haz clic derecho en ServerScriptService en el Explorer, selecciona Insert Object y elige Script. Se abre un nuevo script con `print("Hello world!")`. Presiona Play y revisa el panel Output — deberías ver el mensaje impreso ahí. Ese es tu primer script exitoso.

Variables: Almacenando Información

Las variables son contenedores con nombre que almacenan datos. En Luau, creas una con la palabra clave `local`: `local playerName = "Steve"` crea una variable de texto, `local coins = 100` crea un número, y `local isAlive = true` crea un booleano. Siempre usa `local` — mantiene la variable dentro del alcance de su bloque y evita conflictos. Usa nombres descriptivos como `playerHealth` en lugar de `x` para que tu código sea legible.

Los tipos de datos principales de Luau son `string` para texto, `number` para enteros y decimales, `boolean` para verdadero/falso, `nil` para la ausencia de un valor, y `table` para colecciones. No necesitas declarar tipos — Luau los infiere automáticamente. Concatena strings con `..` como `"Hola, " .. playerName`, convierte entre tipos con `tostring()` y `tonumber()`, y usa strings con backticks y llaves para interpolación.

Funciones: Bloques de Código Reutilizables

Una función es un bloque de código con nombre que se ejecuta cuando la llamas. La estructura es `local function giveCoins(player, amount)` seguida del cuerpo y `end`. Las palabras entre paréntesis son parámetros — entradas que la función recibe. Llámala con `giveCoins(somePlayer, 50)`. Las funciones también pueden devolver valores: `local damage = calculateDamage(50, 20)` captura el resultado devuelto.

Acostúmbrate a escribir funciones pequeñas desde el principio. Cada sistema de juego — combate, inventario, tiendas, tablas de clasificación — se organiza en funciones. Si un bloque de código hace algo específico, envuélvelo en una función y dale un nombre claro.

If/Else: Tomando Decisiones

La sentencia `if` evalúa una condición y ejecuta código solo cuando es verdadera. La sintaxis es `if coins >= 100 then` seguida de tu código, opcionalmente `elseif` para condiciones adicionales, `else` como alternativa, y `end` para cerrar. Los operadores de comparación incluyen `==` para igualdad, `~=` para desigualdad, `>`, `<`, `>=` y `<=`. Combina condiciones con `and`, `or` y `not` — por ejemplo, `if isAlive and coins > 0 then` solo se ejecuta cuando ambas son verdaderas.

Un error común de principiantes es usar `=` en lugar de `==` para comparar. Un solo `=` asigna un valor. El doble `==` compara dos valores. Si tu script se comporta de forma inesperada, revisa esto primero.

Bucles: Repitiendo Acciones

El bucle `for` se ejecuta un número determinado de veces. Escribe `for i = 1, 10 do` seguido de código y `end` para ejecutar diez veces. Agrega un valor de paso — `for i = 10, 1, -1 do` cuenta hacia atrás. El bucle `while` se ejecuta mientras una condición sea verdadera, pero necesita `task.wait()` adentro para evitar que se congele.

El bucle `for` genérico itera sobre colecciones. Usa `for index, value in ipairs(myTable) do` para listas ordenadas, o `for key, value in pairs(myDictionary) do` para diccionarios clave-valor. Así es como procesas inventarios, listas de jugadores y datos de tablas de clasificación.

Tables: Organizando Datos

Las tables son la estructura de datos más versátil de Luau — arrays, diccionarios, o ambos. Crea un array con `local fruits = {"Apple", "Banana", "Cherry"}` y accede a los elementos con `fruits[1]` (Luau empieza en 1, no en 0). Crea un diccionario con `local playerData = {coins = 100, level = 5}` y accede a los valores con `playerData.coins`. Casi todos los sistemas de juego almacenan datos en tables.

Eventos: Respondiendo al Mundo del Juego

Los eventos son la columna vertebral del scripting en Roblox. En lugar de estar revisando constantemente si algo sucedió, conectas una función a un evento y Roblox la llama automáticamente cuando se dispara. El evento más común para principiantes es `Touched` — conéctalo con `part.Touched:Connect(function(hit) end)` donde `hit` es la parte que colisiona. Otros esenciales incluyen `PlayerAdded` (se dispara cuando un jugador se une), `PlayerRemoving` (se dispara cuando un jugador se va), `CharacterAdded` (se dispara cuando un personaje aparece) y `Changed` (se dispara cuando una propiedad se actualiza). Guarda las conexiones en variables y llama a `connection:Disconnect()` cuando ya no se necesiten para evitar fugas de memoria.

Server Scripts vs. Local Scripts

Los Server Scripts se ejecutan en el servidor de Roblox y controlan la lógica autoritativa del juego — otorgar moneda, guardar datos, gestionar rondas. Colócalos en ServerScriptService. Los Local Scripts se ejecutan en el dispositivo de cada jugador para tareas específicas del cliente — cámara, entrada, interfaz. Colócalos en StarterPlayerScripts, StarterCharacterScripts o StarterGui.

La regla de oro: nunca confíes en el cliente. Cualquier lógica que afecte el gameplay debe ocurrir en el servidor. El cliente envía solicitudes a través de RemoteEvents en ReplicatedStorage — dispara desde el cliente con `remoteEvent:FireServer(data)`, escucha en el servidor con `remoteEvent.OnServerEvent:Connect(function(player, data) end)`. El servidor valida y ejecuta.

Tu Primer Script de Juego: Un Kill Brick

Inserta un Part en Workspace y coloréalo de rojo. Haz clic derecho sobre él en el Explorer, inserta un Script y reemplaza el código predeterminado. Escribe `local killPart = script.Parent` para referenciar la parte. Define `local function onTouched(hit)` y adentro escribe `local humanoid = hit.Parent:FindFirstChild("Humanoid")` seguido de `if humanoid then humanoid.Health = 0 end`. Conéctalo con `killPart.Touched:Connect(onTouched)`.

Presiona Play y camina hacia la parte roja. Tu personaje muere y reaparece. Eso es un script de juego completo en siete líneas — cada obby en Roblox usa exactamente este patrón para bloques de peligro.

Tu Segundo Script: Un Sistema de Recolección de Monedas

Crea un Part cilíndrico amarillo e inserta un Script. Escribe `local coin = script.Parent` y `local debounce = false`. En la función `onTouched`, verifica `if debounce then return end`, establece `debounce = true`, comprueba que exista un Humanoid, luego oculta la moneda con `coin.Transparency = 1` y `coin.CanCollide = false`. Después de `task.wait(5)`, restáurala y reinicia el debounce. El patrón de debounce aparece en casi todos los scripts con Touched — sin él, el evento se dispara docenas de veces por segundo mientras las partes se superponen, causando recolecciones duplicadas. Domina el debouncing desde temprano.

Tu Tercer Script: Una Puerta que se Abre

Crea un Part alto y delgado para una puerta. Guarda `local door = script.Parent` y `local originalPosition = door.Position`. Al tocar, muévela hacia arriba con `door.Position = originalPosition + Vector3.new(0, 10, 0)`, espera con `task.wait(3)`, luego reinicia. Esto introduce `Vector3` — el tipo de dato para posiciones 3D donde "y" es arriba en Roblox. Para un movimiento más suave, usa TweenService: obtenlo con `game:GetService("TweenService")`, crea un TweenInfo para la duración, y llama a `tweenService:Create(door, tweenInfo, {Position = targetPosition}):Play()`. Los Tweens animan cualquier propiedad a lo largo del tiempo y hacen que las interacciones se sientan pulidas.

Servicios Esenciales de Roblox

Servicios que usarás constantemente como scripter:

  • Players — accede a los jugadores conectados, detecta uniones y salidas.
  • ReplicatedStorage — contenedor compartido para scripts del servidor y del cliente.
  • TweenService — anima propiedades suavemente a lo largo del tiempo.
  • UserInputService — detecta entrada de teclado, ratón y táctil en el cliente.
  • Debris — destruye objetos automáticamente después de un retraso con Debris:AddItem.
  • DataStoreService — guarda y carga datos persistentes de jugadores entre sesiones.

Accede a cualquier servicio con `game:GetService("ServiceName")` y guarda la referencia al inicio de tu script. Consulta la guía de herramientas de scripting para más recursos sobre cómo trabajar con la API completa de Roblox.

Errores Comunes y Mensajes de Error

Poner un LocalScript en ServerScriptService. Los LocalScripts solo se ejecutan en contenedores del cliente — StarterPlayerScripts, StarterCharacterScripts o bajo una GUI en StarterGui. Si tu código del cliente no hace nada, revisa su ubicación primero.

Olvidar verificar nil. Si `FindFirstChild` devuelve `nil` y accedes a una propiedad sobre él, tu script se detiene con "attempt to index nil". Siempre envuelve las búsquedas en una verificación if antes de usar el resultado.

Usar wait() en lugar de task.wait(). La función legacy `wait()` es imprecisa y está obsoleta. Usa `task.wait(seconds)` para retrasos, `task.spawn()` para hilos y `task.delay()` para llamadas diferidas.

Cuando aparezcan errores en el panel Output, léelos con atención — incluyen el nombre del script, el número de línea y la descripción. El error "expected 'end'" significa un bloque sin cerrar. Cuenta tus pares de `if/then/end` y `function/end` — cada palabra clave de apertura necesita un `end` correspondiente.

Guardando Datos de Jugadores

DataStoreService guarda el progreso de los jugadores entre sesiones. Obtén un store con `game:GetService("DataStoreService"):GetDataStore("PlayerData")`. Carga al unirse con `pcall(function() return dataStore:GetAsync("Player_" .. player.UserId) end)` y guarda al salir con `SetAsync`. Siempre envuelve las llamadas a data stores en `pcall` para capturar errores de red que de otra forma harían fallar tu script. Guarda en `PlayerRemoving` y considera auto-guardar con un temporizador como respaldo. Los data stores requieren un juego publicado — habilita el acceso a la API en Game Settings para pruebas en Studio. La pérdida de datos es la forma más rápida de perder jugadores permanentemente.

Próximos Pasos

Habilidades para aprender después de dominar lo básico:

  • ModuleScripts — bibliotecas de código compartido que mantienen los proyectos organizados.
  • Programación Orientada a Objetos — estructurar código alrededor de objetos con métodos.
  • Programación de UI — construir menús interactivos y elementos de HUD.
  • Raycasting — detectar línea de visión, trayectorias de balas y verificaciones de suelo.
  • Optimización de rendimiento — escribir scripts que escalen con la cantidad de jugadores.

El rendimiento importa desde el primer día. A medida que los scripts crecen, los malos hábitos se acumulan. Lee nuestra guía sobre rendimiento de juegos para entender cómo las decisiones de scripting afectan la tasa de cuadros, la memoria y el tráfico de red.

La mejor forma de aprender es construir. Elige un proyecto pequeño — un recolector de monedas, un obby con tabla de clasificación, un rompecabezas de puertas — y constrúyelo desde cero. Cuando te atasques, lee el panel Output, busca en la documentación de Roblox e itera. El scripting en Roblox es uno de los puntos de entrada más gratificantes a la programación porque el ciclo de retroalimentación es inmediato: escribe código, presiona Play, ve el resultado.

Preguntas Frecuentes

¿Qué lenguaje de programación usa Roblox?

Roblox usa Luau, un lenguaje de programación derivado de Lua. Luau fue desarrollado por Roblox e incluye características adicionales como verificación de tipos opcional, rendimiento mejorado y mejores mensajes de error. Si ves referencias a "Roblox Lua", están hablando de Luau. Todo el scripting en Roblox Studio se hace en Luau.

¿Cuánto tiempo toma aprender scripting en Roblox?

Puedes escribir scripts básicos como kill bricks y recolectores de monedas en tu primer día. Entender los conceptos fundamentales como variables, funciones, eventos y sentencias if/else toma de una a dos semanas de práctica regular. Construir sistemas de juego completos como guardado de datos, gestión de inventario y gameplay basado en rondas típicamente toma de uno a tres meses. La práctica constante importa más que las horas totales.

¿Necesito saber Lua antes de aprender scripting en Roblox?

No. Luau es lo suficientemente amigable para principiantes como para ser tu primer lenguaje de programación. No necesitas experiencia previa con Lua ni con ningún otro lenguaje. Roblox Studio incluye un editor de código integrado, salida de errores y herramientas de prueba que te permiten aprender haciendo. Empieza con lo básico en esta guía y construye proyectos pequeños para reforzar cada concepto.

¿Cuál es la diferencia entre un Script y un LocalScript en Roblox?

Un Script se ejecuta en el servidor y controla la lógica autoritativa del juego compartida entre todos los jugadores, como otorgar objetos, gestionar rondas y guardar datos. Un LocalScript se ejecuta en el dispositivo individual de cada jugador y maneja tareas específicas del cliente como controles de cámara, entrada del usuario y actualizaciones de la interfaz. Se comunican a través de RemoteEvents y RemoteFunctions almacenados en ReplicatedStorage.

¿Por qué mi script de Roblox no funciona?

Revisa el panel Output en Studio para ver los mensajes de error en rojo — te dicen el nombre del script, el número de línea y qué salió mal. Los problemas más comunes son: el script está en el contenedor equivocado (los LocalScripts no se ejecutan en ServerScriptService), una variable es nil porque FindFirstChild no encontró el objeto, falta una palabra clave end que rompe la sintaxis, o se usa un solo signo de igual para comparar en lugar de doble igual. Corrige los errores uno a la vez empezando por el primero de la lista.

Términos Relacionados