Reutilizar código

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Depois de criar alguns scripts, não demora muito até que você queira reutilizar algum código entre eles. Dependendo da localização, ModuleScripts permite que você reutilize código entre scripts em diferentes lados da fronteira cliente-servidor ou no mesmo lado da fronteira.

Você pode colocar scripts de módulo em qualquer lugar que colocar scripts, mas ReplicatedStorage é um local popular; armazenar scripts de módulo aqui permite que você reuse código entre o servidor e os clientes.

Anatomia de um script de módulo

No Roblox Studio, adicione um script de módulo ao ReplicatedStorage e renomeie-o para PickupManager. Cada ModuleScript começa com o seguinte código:


local module = {}
return module

Esse código cria uma tabela Luau vazia e a retorna para qualquer script que requer o script de módulo.

O valor de retorno pode ser de qualquer tipo de dado, exceto nil, mas a maioria dos scripts de módulo retorna uma função, uma tabela ou uma tabela de funções. Para gerar seu valor de retorno, scripts de módulo podem, claro, executar código arbitrário, que inclui requerer outros scripts de módulo.

O exemplo a seguir retorna uma tabela com uma única função chamada getPickupBonus. Cole-o no novo script de módulo:


-- ModuleScript em ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
comum = 10,
incomum = 20,
raro = 50,
legendário = 100
}
-- Adiciona a função getPickupBonus à tabela PickupManager
PickupManager.getPickupBonus = function(raridade)
local bonus = rarityMultipliers[raridade] * defaultMultiplier
return bonus
end
return PickupManager

Adicionar a função a uma tabela não é estritamente necessário — você poderia apenas retornar a função em si — mas é um bom padrão a seguir; isso lhe dá uma sintaxe fácil de entender quando você chama a função de outro script e permite que você adicione mais funções ao script de módulo ao longo do tempo.

Requerer scripts de módulo

Para carregar um script de módulo, você chama a função require(). Em ReplicatedStorage, adicione um novo script e altere seu RunContext para Client. Em seguida, adicione o seguinte código para chamar a função PickupManager.getPickupBonus:

Script do cliente em ReplicatedStorage

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Obtém o valor retornado pelo Script de Módulo
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Chama uma função do Script de Módulo
local bonus = PickupManager.getPickupBonus("legendário")
print(bonus) --> 125

Armazenar scripts de módulo em ReplicatedStorage permite que você compartilhe código entre o servidor e o cliente, portanto você pode usar o mesmo código para requerer o script de ServerScriptService:

Script em ServerScriptService

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))

Quando você chama require() em um ModuleScript, ele é executado uma vez e retorna um único item como referência. Chamar require() novamente retorna a mesma referência exata, o que significa que se você modificar uma tabela ou Instance retornada, as chamadas subsequentes de require() retornam aquela referência modificada. O módulo em si não é executado várias vezes.

Se você requerer um ModuleScript de ambos os lados da fronteira cliente-servidor, como no exemplo acima, o ModuleScript retorna uma referência única para cada lado.

Padrões

Scripts de módulo têm alguns padrões comuns que você pode usar para simplificar seu código e evitar problemas à medida que seu jogo cresce em tamanho e complexidade.

Compartilhamento de dados

Para associar dados a objetos individuais, você pode atribuir atributos a eles ou criar pastas de Configuration com objetos de valor, como StringValue ou IntValue. No entanto, ambas as abordagens são problemáticas se você quiser adicionar ou modificar dezenas de objetos ou valores de dados. Elas também não armazenam tabelas ou funções.

Se você quiser modificar os mesmos dados para várias cópias do mesmo objeto ou reutilizar os mesmos dados para diferentes objetos, armazene os dados em ModuleScripts. É uma maneira mais fácil de reutilizar os dados em outros scripts, e você pode armazenar tabelas e funções.

O exemplo a seguir de ModuleScript em ReplicatedStorage armazena os valores de configuração para uma arma genérica:

ModuleScript em ReplicatedStorage

local GunConfig = {}
GunConfig.TamanhoDoCarregador = 20
GunConfig.ContadorDeBalas = 100
GunConfig.RapidezDeDisparo = 600
GunConfig.Dano = {
["Cabeça"] = 50;
["Torso"] = 40;
["Corpo"] = 25;
}
return GunConfig

Eventos personalizados

Eventos personalizados permitem que scripts se comuniquem entre si, mas ter que acompanhar referências a objetos individuais de BindableEvent pode poluir seu código.

Você pode usar ModuleScripts para armazenar BindableEvents e fornecer manipuladores de eventos personalizados que estão diretamente vinculados aos métodos de ModuleScript.

O seguinte ModuleScript em ReplicatedStorage tem um evento personalizado que é acionado quando o interruptor muda de estado:

ModuleScript em ReplicatedStorage

local Switch = {}
-- Criando um bindable para que qualquer script possa ouvir quando o interruptor foi alterado
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch

O seguinte script do cliente em ReplicatedStorage conecta uma função a ser chamada quando o evento Switch.Changed é acionado.

Script em ReplicatedStorage

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(novoEstado)
print("O estado do interruptor agora é", novoEstado)
end)
-- Testa a mudança algumas vezes
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()

Encapsulamento

Encapsulamento é a prática de criar uma camada de abstração em torno de objetos ou lógica de script para ocultar complexidade. Você pode usar ModuleScripts para encapsular objetos Roblox com funções Luau personalizadas para simplificar o código.

Por exemplo, você pode usar encapsulamento para:

  • Simplificar a comunicação entre redes com um único objeto RemoteEvent.
  • Envolver códigos de tratamento de erro em torno de serviços sensíveis, como DataStoreService.
  • Definir métodos personalizados para controlar ou estender funcionalidades de objetos Roblox.

É difícil acompanhar dezenas de objetos individuais de RemoteEvent para implementar rede em um jogo. Você pode usar um ModuleScript para encapsular um único RemoteEvent para ajudar a simplificar esse problema. Ao incluir um argumento id exclusivo, você ainda pode enviar diferentes mensagens de rede enquanto usa apenas um único RemoteEvent.

No exemplo abaixo, o ModuleScript chamado NetworkManagerClient encapsula o método RemoteEvent:FireServer() para incluir este argumento extra id. Adicionalmente, esse ModuleScript referencia o objeto RemoteEvent em si, para que você não tenha que referenciá-lo em outras partes do seu código. Você só precisa requerer esse ModuleScript para enviar mensagens de rede e não precisa lidar com objetos RemoteEvent no restante do seu código.

O seguinte ModuleScript em ReplicatedFirst fornece uma função encapsulada que você pode chamar em seus scripts do cliente para enviar uma mensagem de rede:

Módulo de Rede

-- ModuleScript em ReplicatedFirst chamado NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Encapsulando a função FireServer do objeto remoto
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient

O seguinte ModuleScript em ServerScriptService usa BindableEvents para cada script se conectar a um ID específico. Quando um cliente envia uma mensagem de rede, cada BindableEvent associado ao ID especificado é acionado.


-- ModuleScript em ServerScriptService chamado NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Ligando o novo BindableEvent ao id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Conectando ao
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Encontrando cada evento vinculável que corresponde ao ID do evento remoto recebido
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer

O seguinte LocalScript envia uma mensagem com o ID RequestA com um argumento opcional Olá.


-- LocalScript em ReplicatedFirst
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))
NetworkManagerClient.FireServer("RequestA", "Olá")

O seguinte Script se conecta ao ID de mensagem de rede RequestA e imprime uma declaração com quaisquer parâmetros adicionais ao receber a solicitação.


-- Script em ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Recebeu RequestA de", player, ...)
end)
©2026 Roblox Corporation, Roblox, o logotipo Roblox e Powering Imagination estão entre nossas marcas registradas e não registradas nos EUA e em outros países.