Para aplicar seu conhecimento de scripts de módulo, crie um script de módulo que permita que os jogadores peguem chaves e as usem para abrir baús de tesouro.
Configuração do projeto
Este projeto inclui um mapa inicial com placar de classificação e objetos de coleta de scripts para as chaves e baús de tesouro.
Carregar o projeto Iniciante
No Roblox Studio, abra o arquivo baixado: Intro to Module Scripts - Starter Project.rbxl .
Criar um Script de Módulo
Para que os jogadores possam obter tesouros de baús, crie um script de módulo chamado TreasureManager. Usando um script de módulo conectará as pegadas e as classificações.
Em ServerStorage , crie um novo ModuleScript e renomeie-o TreasureManager.
Em TreasureManager, renomeie a tabela do módulo padrão substituindo module por TreasureManager em ambos os lugares.
local TreasureManager = {}return TreasureManager
Usando Funções em Scripts de Módulo
Para testar como as funções funcionam em scripts de módulo, crie uma nova função chamada getKey() . Quando a função getKey() for chamada de outro script, ela receberá uma peça-chave para destruir e adicionar 1 ao número de chaves no inventário do jogador.
Crie uma Função de Módulo para chaves
Este script do módulo usará uma combinação de funções do módulo e locais, digite dois comentários para ajudá-lo a mantê-los separados.
local TreasureManager = {}------------------ Funções Locais------------------ Funções do móduloreturn TreasureManagerSob o comentar Module Functions , adicione uma nova função de módulo a TreasureManager chamada getKey().
Use dois parâmetros:
- keyPart - a parte a ser destruída.
- whichCharacter - o jogador que tocou a peça chave.
local TreasureManager = {}------------------ Funções Locais------------------ Funções do módulofunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerEm getKey(), destrua keyPart.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
Use a função do módulo
Agora, a função do módulo getKey() pode ser usada em outros scripts. Para testar essa função, você abrirá um script pré-fabricado e o chamará.
Abra o script de chave em Workspace > Keys > KeyScript .
Em keyScript, armazene o script do módulo em uma variável chamada treasureManager e configure-o como: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- Requer o script do módulo abaixo ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()Já existe uma função chamada partTouched() para verificar se há um jogador tocando a peça. Dentro de partTouched():
- Chame a função do módulo getKey() para destruir a chave.
- Passe em keyPart e whichCharacter .
local ServerStorage = game:GetService("ServerStorage")-- Requer o script do módulo abaixo ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()local function partTouched(otherPart, keyPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Dê uma chave ao jogador e destrua a parte chave-- =====================================================================treasureManager.getKey(keyPart, whichCharacter)-- =====================================================================endendCorra o projeto e verifique se tocar em uma chave o destrói.
Dicas de solução de problemas
Problema: Obtém uma mensagem de erro incluindo: "Infinite yield possible" .
Verifique a ortografia do seu script de módulo em um script. Se um script de módulo, como TreasureManager , for escrito de forma diferente, haverá um erro. Problema: Obtém uma mensagem de erro incluindo: "attempt to index global" .
Verifique a linha que inclui o requerimento para o script do módulo em keyScript . Se o módulo não incluir necessitar/requisitar, ele não poderá usar funções e variáveis desse script de módulo. Problema: O script não está rodando ou não pode pegar as chaves.
No script do módulo, certifique-se de que todo o código esteja entre local TreasureManager = {} e return TreasureManager. O retorno deve ser a última linha de código em um Script de Módulo.
Verifique se há dois parênteses no final da linha com necessitar/requisitar, como em WaitForChild("TreasureManager")) .
Criar uma função local
Atualmente, uma tabela de classificação mantém o controle das chaves e do tesouro de um jogador. Para alterar os números da tabela de classificação, use uma função local no script do módulo. Uma função local é usada porque alterar os valores da chave ou do tesouro de um jogador só será necessário no script TreasureManager, não em qualquer outro lugar.
Em ServerStorage , abra o script TreasureManager.
Crie variáveis locais para fazer o seguindo:
Obtenha o serviço de Jogadores para que o script possa funcionar com as estatísticas da tabela de classificação do jogador.
Armazene o número de chaves que o jogador recebe depois de tocar keyPart .
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ Funções Locais------------------ Funções do módulofunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerCopie e cole essas duas funções locais na seção Local Functions .
getPlayerKeys() retorna o valor da classificação Lockpicks do jogador.
getPlayerTreasure() retorna o valor da classificação Treasure do jogador.
------------------ Funções Locaislocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endlocal function getPlayerTreasure(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Treasure")end------------------ Module FunctionsPara adicionar às chaves do jogador, na função do módulo getKey():
Crie uma local variável para chamar getPlayerKeys(whichCharacter).
Adicione o valor de keyDrop para playerKeys.
------------------ Funções do módulofunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endCorra o projeto. Verifique se tocar em uma tecla a destrói e adiciona 1 às chaves do jogador na tabela de classificação.
Se necessário, verifique seu script contra o abaixo para quaisquer problemas de solução de problemas.
Current TreasureManager Script
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Funções Locais
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Funções do módulo
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
Obtendo informações de scripts de módulos
O script do módulo TreasureManager será usado quando os jogadores tocarem em um baú do tesouro para verificar se eles têm pelo menos uma chave antes de abri-lo e dar a eles ouro.
Verifique se os baús podem ser abertos
Primeiro em ServerStorage > TreasureManager script, configure variáveis para quantas chaves é necessário para abrir um baú e quanto ouro cada baú contém.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ Funções Locaislocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endPara criar uma função que verifica se um jogador pode abrir um baú, na seção Funções do módulo , adicione uma nova função à TreasureManager tabela chamada canOpenChest() com o parâmetro whichCharacter.
------------------ Funções do módulofunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endCopie e cole o código abaixo em canOpenChest() para retornar true se o jogador tiver chaves suficientes e false se não tiver.
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
Dar Tesouro aos Jogadores
Para que o jogador possa abrir um baú, crie uma função no TreasureManager que lhe conceda tesouro.
Adicione uma nova função de módulo a TreasureManager chamada openChest().
Passe em dois argumentos:
- chestPart - a parte do baú para destruir.
- whichCharacter - o jogador para dar o tesouro.
function TreasureManager.openChest(chestPart, whichCharacter)endPara subtrair as chaves de um jogador e atribuir-lhe um tesouro, copie e cole o código abaixo em openChest() . Este código usa as variáveis criadas anteriormente, como chestReward , a quantidade de tesouro dada por baú.
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart:Destroy()end
Chamar as Funções do Baú
Agora que as duas funções do módulo, canOpenChest() e openChest() , foram criadas, elas podem ser chamadas pelas partes do Baú sempre que um jogador as tocar usando a função partTouched().
Em Workspace > Baús abra ChestScript.
Crie uma nova variável chamada treasureManager e exija o script do módulo TreasureManager em ServerStorage .
local ServerStorage = game:GetService("ServerStorage")-- Requer o script do módulo abaixolocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()Em partTouched() , sob a if humanoid declaração, crie uma nova variável chamada canOpen e defina-a como:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Verifique se o jogador pode abrir um baú, então deixe-o pegar o tesouro-- =====================================================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =====================================================================endendEm seguida, crie uma declaração if para verificar se canOpen é verdadeiro.
Se sim, chame a função openChest() do TreasureManager.
Em seguida, passe em dois parâmetros: chestPart , o baú para destruir e whichCharacter , o jogador para recompensar o tesouro.
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Verifique se o jogador pode abrir um baú, então deixe-o pegar o tesouro-- =====================================================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =====================================================================endendCorra o projeto. Verifique isso:
- Se você tiver pelo menos 1 chave, tocar em um baú irá destruí-lo e conceder tesouros.
- Se você tem 0 chaves, você não pode abrir um baú do tesouro.
Dicas de solução de problemas
Em ChestScript, certifique-se de que as funções chamadas do script do módulo, como canOpenChest(), sejam escritas exatamente como são encontradas no script TreasureManager. Qualquer diferença causará um erro.
Verifique se as funções copiadas e coladas, como treasureManager.openChest() , são exatamente como mostrado na lição. Quaisquer diferenças podem causar erros sutis no script.
Scripts Finalizados
Script do Gerenciador de Tesouro Terminado
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Funções Locais
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Funções do módulo
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
ChestScript Terminado
local ServerStorage = game:GetService("ServerStorage")
-- Requer o script do módulo abaixo ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Verifique se o jogador pode abrir um baú, então deixe-o pegar o tesouro
-- =====================================================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =====================================================================
end
end
-- Coloca todas as partes do peito na função de toque para que funcione em todas as partes
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
KeyScript Concluído
local ServerStorage = game:GetService("ServerStorage")
-- Requer o script do módulo abaixo ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Dê uma chave ao jogador e destrua a parte chave
-- =====================================================================
treasureManager.getKey(keyPart, whichCharacter)
-- =====================================================================
end
end
-- Coloca todas as peças importantes na função de toque para que funcione em todas as peças
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end
Resumo
Uma aplicação comum de usar scripts de módulo em jogos do Roblox é lidar com tarefas comuns usadas pelos jogadores, como conceder pontos a eles. Para este exemplo, um script de módulo chamado TreasureManager foi criado para lidar com a entrega de chaves e tesouros aos jogadores sempre que eles interagem com objetos do jogo.