A medida que los proyectos se vuelven complejos, es importante pensar cómo se organizan los scripts. Las buenas prácticas de organización pueden garantizar que el código no se duplique entre los scripts o se vuelva difícil de gestionar, administrar.
Una mejor manera de organizar y reutilizar el 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 administrar el dinero del jugador o los enemigos. El código dentro de los scripts de módulo se puede usar por otros scripts. De esa manera, puedes llamar la misma función que otorga monedas de varios scripts cada vez que un jugador termina una misión o encuentra un pickup.
Al almacenar código comúnmente utilizado en los scripts de módulo, facilita mantener y organizar el código ya que solo se necesitan cambios en un script de módulo, en lugar de actualizar varios scripts.
Bases de Script 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 se pueden designar con un íconode morado .
Creando un Módulo de Script
ModuleScripts se colocan comúnmente en ServerScriptService cuando se usan por scripts del lado del servidor y ReplicatedStorage cuando se usan por scripts locales del lado del client (como las interacciones de GUI).
- Crea un ModuleScript en ServerStorage .
Estructura de Scripts de Módulo
Cuando se crea, cada módulo de script 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, en la que las funciones y variables compartidas del módulo se pueden almacenar. Esta tabla debería renombrarse al propósito del módulo, como RewardManager o ParticleController . A diferencia de otras
local RewardManager = {}return RewardManager
Para que otros scripts puedan usar las funciones no locales o variables de un módulo, cada módulo termina con el retorno MyModule . Cuando otro script intenta obtener código del módulo, el retorno permite que ese script acceda al código almacenado en la tabla del módulo.
Agregar a Scripts de Módulo
Para agregar una función o variable a el módulo que se puede usar 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 . Usando el operador de punto es otra manera de agregar código en una tabla, permitiendo que otros scripts accedan a ese código cada vez que la tabla del módulo se devuelva.
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ódigode lugar
end
return TestModule
Mira en los Scripts de Módulo
Para una función de módulo o variable a usar en un script de lado de la máquina, no escriba tipo local .
Escribir local frente a las variables y funciones significa que están solo disponibles para ese script. Mientras que esta es una buena práctica para la mayoría de los scripts para reducir errores y problemas, no puede hacer que las funciones y variables de módulo sean locales.
Cualquier código usado sólo por ese módulo de script debe incluir local . Por instancia, el código de abajo incluye la variable local difficultyModifier , que sólo se puede usar en ese módulo de script, y la función 1> GCoinReward()1> , que se puede usar en scripts fuera del módulo.
local RewardManager = {}
-- Solo se puede usar en el script del módulo
local rewardCoins = 50
-- Solo se puede usar en el script del módulo
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Utilizable en otros scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Usando módulos en otros scripts
Por sí mismo, 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 módulo de script en el Explorador.
Para usar un módulo, en un script separado, establece una variable igual a require(moduleScript) .
local MyModule = require(ServerStorage.ModuleScript)
Ahora, la variable MyModule contiene la tabla de módulos creada en ese script de módulo. Para usar funciones y variables de esa tabla, escriba el nombre de la variable, seguido de un punto, y el nombre exacto de lo que se usará en ese script de módulo, como MyModule.myFunction() . Cuando el script se ejecuta y alcanza esa línea, accederá a esa función o variable específica almacen
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
Ejemplo de RewardManager
ModuleScript - RewardManager
local RewardManager = {}
-- Solo se puede usar en el script del módulo
local rewardCoins = 50
-- Solo se puede usar en el script del módulo
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Utilizable en otros scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScript
local ServerStorage = game:GetService("ServerStorage")-- Cargar guión del scriptlocal RewardManager = require(ServerStorage.RewardManager)--Llamar función desde el script del módulolocal coins = RewardManager.getCoinReward("easy")print("Should award " .. coins .. " coins")
General Troubleshooting
Algunos de los consejos aquí se refieren a problemas comunes al trabajar con scripts de módulo. Tenga en cuenta que los scripts de módulo pueden ser un tema complicado con más matices. Para obtener más detalles, consulte este guía más técnico en Scripts de Módulo . Problema: Obtén un mensaje de error que incluye: "Infinite yield possible" o "not a valid member" .
Compruebe la ortografía del módulo de script donde se carga. require() debe incluir el camino y la ortografía exactos del módulo de script, que puede tener un nombre diferente a la tabla de módulo. Problema: Obtén un mensaje de error que incluye: "attempt to index global" .
En cualquier script que use un módulo de script, asegúrese de que se cargue usando la función require() . Si no, ese script no puede usar funciones y variables de la módulo de script.
Resumen
Los módulos de script en Roblox son un método de código que los programadores de módulos usan para organizar y reutilizar el código. Un módulo de script de módulo se almacena a menudo en ServerStorage (o ReplicatedStorage para las interacciones basadas en el cliente). De ahí, otros scripts pueden llamar funciones y variables almacenadas en ese módulo de script.
Por instancia, un juego puede otorgar puntos a los jugadores por recopilar objetos. Un script de módulo puede manejar el código para otorgar puntos. Luego, los scripts para diferentes tipos de objetos solo pueden llamar la función de script del módulo. Esto reduce la necesidad de reutilizar el código entre los scripts, lo que hace que el código sea más fácil de entender y mantener.