A medida que los proyectos se vuelven complejos, es importante pensar en cómo se organizan los scripts. Buenas prácticas de organización pueden asegurar que el código no esté duplicado entre scripts, o que no se vuelva difícil de gestionar.
Una mejor manera de organizar y reutilizar código es con scripts de módulo, un tipo único de script que almacena un conjunto de funciones y variables diseñadas para cumplir un propósito compartido, como gestionar el dinero del jugador o enemigos. El código dentro de los scripts de módulo puede ser utilizado por otros scripts. De esa manera, puedes llamar a la misma función que otorga monedas desde múltiples scripts diferentes cada vez que un jugador completa una misión o encuentra un objeto recogible.
Al almacenar código que se usa comúnmente en scripts de módulo, se facilita el mantenimiento y la organización del código, ya que los cambios solo necesitan hacerse en un script de módulo, en lugar de actualizar múltiples scripts.
Conceptos básicos de scripts de módulo
Los scripts de módulo son en realidad su propio objeto separado en comparación con los objetos de script. En Roblox, los scripts de módulo pueden ser identificados con un ícono morado.
Crear un script de módulo
Los ModuleScripts comúnmente se colocan en ServerScriptService cuando son utilizados por scripts del lado del servidor y en ReplicatedStorage cuando son utilizados por scripts locales del lado del cliente (como interacciones de GUI).
- Crea un ModuleScript en ServerScriptService.

Estructura de los scripts de módulo
Cuando se crean, cada script de módulo comienza con el código a continuación:
local Module = {}return Module
La línea local Module = {} crea una tabla, o contenedor de código, donde se pueden almacenar las funciones y variables compartidas del módulo. Esta tabla debe ser renombrada con el propósito del módulo, como RewardManager o ParticleController. A diferencia de otras variables que utilizan notación camel case (myVariable), se recomienda que las tablas de módulos usen notación pascal y comiencen en mayúscula (MyModule).
local RewardManager = {}return RewardManager
Para que otros scripts puedan usar las funciones o variables no locales de un módulo, cada módulo termina con return MyModule. Siempre que otro script intente obtener código del módulo, return permite que ese script acceda al código almacenado dentro de la tabla del módulo.
Agregar a los scripts de módulo
Para agregar una función o variable al módulo que pueda ser utilizada en otro script, escribe el nombre de la tabla del módulo, seguido de un punto y el nombre de la función o variable, como en TestModule.myVariable. Usar el operador de punto es otra forma de agregar código a una tabla, permitiendo que otros scripts accedan a ese código cada vez que se devuelve la tabla del módulo.
local TestModule = {}
-- Agrega una variable a la tabla 'TestModule'
TestModule.myVariable = 100
-- Agrega una función a la tabla 'TestModule'
function TestModule.doTask(player)
-- Código de marcador de posición
end
return TestModule
Alcance en los scripts de módulo
Para que una función o variable de un módulo sea utilizada en un script externo, no escribas local.
Escribir local delante de variables y funciones significa que son solo utilizables por ese script. Aunque esta es una buena práctica para la mayoría de los scripts para reducir errores y problemas, no puedes hacer que funciones y variables de scripts de módulo sean locales.
Cualquier código usado solo por ese script de módulo debe seguir incluyendo local. Por ejemplo, el código a continuación incluye la variable local difficultyModifier, que solo puede ser usada en ese script de módulo, y la función getCoinReward(), que puede ser usada en scripts fuera del módulo.
local RewardManager = {}
-- Usable solo en el script de módulo
local rewardCoins = 50
-- Usable solo en el script de módulo
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Usable en otros scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Usar módulos en otros scripts
Por sí solo, un script de módulo no puede ejecutar código; necesita ser cargado en otro script usando la palabra clave require(). La función require() acepta un argumento, la ubicación del script de módulo en el Explorador.
Para usar un módulo, en un script separado, asigna una variable igual a require(moduleScript).
local MyModule = require(ServerStorage.ModuleScript)
Ahora, la variable MyModule contiene la tabla del módulo creada en ese script de módulo. Para usar funciones y variables de esa tabla, escribe el nombre de la variable, seguido de un punto, y el nombre exacto de lo que deseas usar en ese script de módulo, como MyModule.myFunction(). Cuando el script se ejecute y alcance esa línea, accederá a esa función o variable específica almacenada en la tabla del módulo.
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
Ejemplo de RewardManager
ModuleScript - RewardManager
local RewardManager = {}
-- Usable solo en el script de módulo
local rewardCoins = 50
-- Usable solo en el script de módulo
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Usable en otros scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- Cargar el script de módulolocal RewardManager = require(ServerStorage.RewardManager)-- Llama a la función del script de módulolocal coins = RewardManager.getCoinReward("easy")print("Debería otorgar " .. coins .. " monedas")
Solución de problemas general
Algunos de los consejos aquí abordan problemas comunes al trabajar con scripts de módulo. Ten en cuenta que los scripts de módulo pueden ser un tema complicado con más matices. Para más detalles, consulta esta guía más técnica sobre Scripts de Módulo.
Problema: Obtienes un mensaje de error que incluye: "Infinite yield possible" o "not a valid member".
- Verifica la ortografía del script de módulo donde se carga. require() debe incluir la ruta y la ortografía exactas del script de módulo, que puede tener un nombre diferente al de la tabla del módulo.
Problema: Obtienes un mensaje de error que incluye: "attempt to index global".
- En cualquier script que use un script de módulo, asegúrate de que se cargue usando la función require(). De lo contrario, ese script no puede usar funciones y variables del script de módulo.
Resumen
Los scripts de módulo en Roblox son un método que los programadores usan para organizar y reutilizar código. Un script de módulo a menudo se almacena en ServerStorage (o ReplicatedStorage para interacciones basadas en el cliente). Desde allí, otros scripts pueden llamar a funciones y variables almacenadas en ese script de módulo.
Por ejemplo, una experiencia puede otorgar puntos a los jugadores por recolectar objetos. Un script de módulo puede manejar el código para dar puntos. Luego, los scripts para diferentes tipos de objetos pueden simplemente llamar a la función del script de módulo. Esto reduce la necesidad de reutilizar código entre scripts, facilitando la comprensión y mantenimiento del código.