Después de crear algunos scripts, nunca es largo antes de que quieras reutilizar alguno del código entre ellos. Dependiendo de la ubicación, Class.ModuleScript|ModuleScripts deja que reutilices el código entre los scripts en diferentes lados de la frontera del cliente-servidor o en el mismo lado de la frontera.
Creando Scripts de Módulo
Puedes poner los scripts de módulo en cualquier lugar que pongas los scripts, pero ReplicatedStorage es una ubicación popular; almacenar los scripts de módulo aquí te permite reutilizar el código entre el servidor y los clientes.
- En Roblox Studio, pasa el cursor sobre Almacenamiento Replicado en la ventana Explorador y haz clic en + .
- Seleccione ModuleScript para agregar un nuevo módulo de script.
- Haga clic con el botón derecho en el script y renombre el a PickupManager .
- Haga clic doblemente en el script para abrirlo en el Editor de Scripts .
Anatomía de un Script de Módulo
Cada ModuleScript comienza con el siguiente código:
local module = {}return module
Este código crea una tabla Luau vacía y la devuelve a cualquier script que requiera el módulo de script.
El valor de la devolución puede ser cualquier tipo de datos excepto nil, pero la mayoría de los scripts de módulo devuelven una función, una tabla o una tabla de funciones. Para generar su valor de devolución, los scripts de módulo pueden ejecutar código arbitrario, que incluye requerir otros módulos de script.
El siguiente ejemplo devuelve una tabla con una sola función llamada getPickupBonus . Pégala en tu nuevo script de módulo:
-- ModuleScript en ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Añade la función getPickupBonus a la tabla PickupManager
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager
Añadir la función a una tabla no es estrictamente necesario, puede que simplemente返回 la función en sí misma—pero es un buen patrón seguir; te da una sintaxis fácil de entender cuando llamas la función desde otro script y te permite agregar fácilmente más funciones al módulo de script con el tiempo.
Requiere Scripts de Módulo
Para cargar un módulo de script, llamas la función require(). En ReplicatedStorage, agrega un nuevo script y cambia su RunContext a 1> Client1> . Luego agrega el siguiente código para llamar la función 4> PickupManager.getPickupBonus4> :
Script del cliente en ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Obtener el valor devuelto por ModuleScriptlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- Llamar a una función de ModuleScriptlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
Puede usar el mismo código para requerir el script de ServerScriptService :
Script en ServerScriptStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Obtenga el valor de返回 para el móduloScript llamado "PickupManager"local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
Cuando llamas a require() en un ModuleScript , se ejecuta una vez y devuelve un solo elemento como referencia. Llamar a require() de nuevo
Si requiere un ModuleScript de ambos lados de la frontera cliente-servidor, el ModuleScript devuelve una referencia única para cada lado.
Patrones
Los scripts de módulo tienen algunos patrones comunes que puedes usar para simplificar tu código y evitar trampas a medida que tu experiencia crece en tamaño y complejidad.
Compartir datos
Para asociar datos con objetos individuales, puede asignarles atributos o crear Configuration carpetas con objetos de valor, como StringValue o IntValue. Sin embargo, ambas aproximaciones son problemáticas si desea agregar o modificar docenas de objetos o valores de datos. Ellos también no almacenan tablas o funciones.
Si desea modificar los mismos datos para múltiples copias del mismo objeto o reutilizar los mismos datos para diferentes objetos, almacene los datos en ModuleScripts . Es una manera más fácil de reutilizar los datos en otros scripts y puede almacenar tablas y funciones.
El siguiente ejemplo ModuleScript en ReplicatedStorage almacena los valores de configuración para un arma genérica:
ModuleScript en ReplicatedStorage
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
Eventos personalizados
Los eventos personalizados permiten que los scripts se comuniquen entre sí, pero tener que rastrear los referencias a objetos individuales BindableEvent puede desordenar su código.
Puede usar ModuleScripts to store BindableEvents and provide custom event handlers that are directly tied to the methods of ModuleScript .
El siguiente ModuleScript en ReplicatedStorage tiene un evento personalizado que se activa cuando el interruptor cambia de estado:
ModuleScript en ReplicatedStorage
local Switch = {}
-- Crear un enlace para que cualquier script pueda escuchar cuando el interruptor fue cambiado
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch
El siguiente script del cliente en ReplicatedStorage conecta una función para llamar cuando se activa el evento Switch.Changed
Script en ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- Prueba el flipped varias veces
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
Encapsulado
Encapsulamiento es la práctica de crear una capa de abstracción alrededor de los objetos o la lógica de script para ocultar la complejidad. Puedes usar ModuleScripts para encapsular los objetos Roblox con funciones Lua personalizadas para simplificar el código.
Por ejemplo, puede usar el encapsulamiento para:
- Simplifica la comunicación entre redes con un solo objeto RemoteEvent .
- Wrap error handling code around sensitive services such as DataStoreService .
- Defina métodos personalizados para controlar o extender las funciones de los objetos de Roblox.
Es difícil rastrear docenas de objetos RemoteEvent individuales para implementar la red en tu juego. Puedes usar un ModuleScript para encapsular un solo RemoteEvent para ayudar a simplificar este problema. Al incluir un argumento de 1> id</
En el ejemplo a continuación, el ModuleScript llamado NetworkManagerClient encapsula el método Class.Remote
El siguiente ModuleScript en ReplicatedFirst proporciona una función encapsulada que puedes llamar a tus scripts de client para enviar un mensaje de red:
Módulo de red
-- ModuleScript en ReplicatedFirst llamado NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Encapsulando la función de FireServer del objeto remoto
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
El siguiente ModuleScript en ServerScriptService usa BindableEvents para conectar a cada script a un ID específico. Cuando un cliente envía un mensaje de red, cada 1> Class.BindableEvent1> asociado al ID especificado se activa.
-- ModuleScript en ServerScript Servicio nombrado NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Enlazando el nuevo BindableEvent al id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Conectar con
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Encontrando todos los eventos vinculables que coinciden con el ID del evento remoto recibido
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer
El siguiente LocalScript envía un mensaje con el ID RequestA con un argumento de opción Hello.
-- LocalScript en ReplicatedFirstlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
El siguiente Script se conecta a la ID de mensaje de red RequestA y imprime una declaración con cualquier parámetro adicional cuando recibe la solicitud.
-- Script en ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)