Introdução aos Scripts de Módulo

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

À medida que os projetos se tornam complexos, torna-se importante pensar como os scripts são organizados. Boas práticas de organização podem garantir que o código não seja duplicado entre os scripts ou se torne difícil de gerenciar.

Uma maneira melhor de organizar e reutilizar código é com scripts de módulo , um tipo único de script que armazena um conjunto de funções e variáveis projetadas para atender a um propósito compartilhado, como gerenciar o dinheiro do jogador ou inimigos. O código dentro dos scripts do módulo pode ser usado por outros scripts. Dessa forma, você pode chamar a mesma função que dá moedas de vários scripts diferentes sempre que um jogador termina uma missão ou encontra uma coleta.

Ao armazenar código comumente usado em scripts de módulo, torna mais fácil manter e organizar o código, já que as alterações só precisam ser feitas em um script de módulo, em vez de atualizar vários scripts.

Fundamentos do Script do Módulo

Os scripts de módulo são realmente seus próprios objetos separados em comparação com os objetos de script. No Roblox, os scripts de módulo podem ser denotados com um ícone roxo .

Criando um Script de Módulo

Os scripts de módulo são comumente colocados em ServerScriptService quando usados por scripts do lado do servidor e ReplicatedStorage quando usados por scripts locais do lado do cliente (como interações GUI).

  1. Crie um ModuleScript em ServerStorage .

Estrutura dos Scripts do Módulo

Quando criado, cada script de módulo começa com o código abaixo:


local Module = {}
return Module

A linha local Module = {} cria uma tabela, ou contêiner de código, onde as funções e variáveis compartilhadas do módulo podem ser armazenadas. Esta tabela deve ser renomeada para o propósito do módulo, como RewardManager ou ParticleController. Ao contrário de outras variáveis que são casos de camelo (myVariable), recomenda-se que as tabelas de módulos usem casos pascal e comecem em maiús (MyModule ).


local RewardManager = {}
return RewardManager

Para que outros scripts possam usar as funções ou variáveis não locais de um módulo, cada módulo termina com o retorno MyModule . Sempre que outro script tenta obter código do módulo, o retorno permite que o código de acesso ao script seja armazenado dentro da tabela do módulo.

Adicionando aos Scripts de Módulo

Para adicionar uma função ou variável ao módulo que pode ser usada em outro script, digite o nome da tabela do módulo, seguido de um ponto, e o nome da função ou variável, como em TestModule.myVariable . Usar o operador de ponto é outra maneira de adicionar código a uma tabela, permitindo que outros scripts acessem esse código sempre que a tabela do módulo for retornada.


local TestModule = {}
-- Adiciona uma variável à tabela 'TestModule'
TestModule.myVariable = 100
-- Adiciona uma função à tabela 'TestModule'
function TestModule.doTask(player)
-- códigode espaço reservado
end
return TestModule

Alcance em Scripts de Módulo

Para uma função de módulo ou variável para ser usada em um script externo, não digite local.

Escrever local na frente de variáveis e funções significa que elas são apenas utilizáveis por esse script. Embora esta seja uma boa prática para a maioria dos scripts para reduzir erros e solucionar problemas, você não pode tornar funções e variáveis de script de módulo locais.

Qualquer código usado apenas por esse script de módulo ainda deve incluir local . Por instância, o código abaixo inclui a variável local difficultyModifier , que só pode ser usada nesse script de módulo, e a função getCoinReward() , que pode ser usada em scripts fora do módulo.


local RewardManager = {}
-- Usável apenas no script do módulo
local rewardCoins = 50
-- Usável apenas no script do módulo
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Usável em outros scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager

Usando Módulos em Scripts de Outros

Por si só, um script de módulo não pode correr o código, ele precisa ser carregado em outro script usando a palavra-chave require() . A função require() aceita um argumento, a localização do script do módulo no Explorador.

Para usar um módulo, em um script separado, defina uma variável igual a require(moduleScript) .


local MyModule = require(ServerStorage.ModuleScript)

Agora, a variável MyModule contém a tabela do módulo criada naquele script de módulo. Para usar funções e variáveis dessa tabela, digite o nome da variável, seguido de um ponto, e o nome exato do que usar naquele script de módulo, como MyModule.myFunction(). Quando o script for rodado e chegar a essa linha, ele acessará aquela função específica ou variável armazenada na tabela do módulo.


local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()

Exemplo do Gerenciador de Recompensas

ModuleScript - Gerenciador de Recompensas

local RewardManager = {}
-- Usável apenas no script do módulo
local rewardCoins = 50
-- Usável apenas no script do módulo
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Usável em outros scripts
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScript

local ServerStorage = game:GetService("ServerStorage")
-- Carregar script do módulo
local RewardManager = require(ServerStorage.RewardManager)
--Chama a função do script do módulo
local coins = RewardManager.getCoinReward("easy")
print("Should award " .. coins .. " coins")

Solução de problemas geral

Algumas das dicas aqui abordam problemas comuns ao trabalhar com scripts de módulo. Tenha em mente que os scripts de módulo podem ser um tópico complicado com mais nuances. Para mais detalhes, consulte este guia mais técnico em Module Scripts . Problema: Obtenha uma mensagem de membrosincluindo: "Infinite yield possible" ou "not a valid member" .

  • Verifique a ortografia do script do módulo onde está carregado. require() deve incluir o caminho e a ortografia exatos do script do módulo, que pode ser chamado de forma diferente da tabela do módulo. Problema: Obtém uma mensagem de erro incluindo: "attempt to index global" .

  • Em qualquer script que use um script de módulo, certifique-se de que esteja carregado usando a função require() . Se não, esse script não pode usar funções e variáveis do script do módulo.

Resumo

Os scripts de módulo no Roblox são um método usado pelos codificadores para organizar e reutilizar código. Um script de módulo é frequentemente armazenado no ServerStorage (ou ReplicatedStorage para interações baseadas em clientes). A partir daí, outros scripts podem chamar funções e variáveis armazenadas nesse script de módulo.

Por instância, um jogo pode dar pontos aos jogadores por coletar objetos. Um script de módulo pode lidar com código para dar pontos. Então, scripts para diferentes tipos de objetos podem simplesmente chamar a função de script de módulo. Isso reduz a necessidade de reutilizar código entre scripts, tornando o código mais fácil de entender e manter.