Para aplicar seu conhecimento de scripts de módulo, crie um script de módulo que permita que os jogadores peguem chaves e usem-as para abrir baús de tesouro.
Configuração do Projeto
Este projeto inclui um mapa iniciante com leaderboard e objetos de coleta scripted para as chaves e baús do tesouro.
Carregar o Projeto Iniciante
In Roblox Studio, open the downloaded file: Intro to Module Scripts - Starter Project.rbxl .
Criar um Script de Módulo
Para que os jogadores possam obter tesouros dos baús, crie um script de módulo chamado TreasureManager. Usar um script de módulo conectará as pickups e leaderboards juntos.
Em ServerStorage , crie um novo ModuleScript e renomeie-o para TreasureManager.
In TreasureManager , renomeie a tabela de módulo padrão por substituir module por TreasureManager em ambos os locais.
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 parte-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 de módulo usará uma combinação de módulo e funções locais, digite um comentário de tipo dois para ajudá-lo a mantê-los separados.
local TreasureManager = {}--Funções Locais--Funções de Móduloreturn TreasureManagerSob o comentar Funções do Módulo , adicione uma nova função de módulo ao TreasureManager chamado getKey().
Use dois parâmetros:
- keyPart - a peça para ser destruída.
- whichCharacter - o jogador que tocou a parte da chave.
local TreasureManager = {}--Funções Locais--Funções de Módulofunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerEm getKey() , destrua keyPart.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
Usar a Função do Módulo
Agora, a função módulo getKey() pode ser usada em outros scripts. Para testar essa função, você abrirá um script pré-feito e o chamará.
Abra o script de chave em Workspace > Keys > KeyScript.
In keyScript, store the module script in a variable named treasureManager and set it equal to: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- Requer o script de 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 um jogador toca a peça. Dentro de partTouched() :
- Chame a função getKey() do módulo para destruir a chave.
- Passe em keyPart e whichCharacter.
local ServerStorage = game:GetService("ServerStorage")-- Requer o script de 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 da chave-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendExecute o projeto e verifique se tocar uma chave o destrói.
Dicas de solução de problemas
Problema: Obter 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: Obter uma mensagem de erro incluindo: "attempt to index global" .
Verifique a linha que inclui o require para o script de módulo em keyScript. Se o módulo não incluir necessitar/requisitar, ele não pode usar funções e variáveis do script de módulo. Problema: O script não é executado ou não pode pegar chaves.
No script de módulo, verifique se todo o código está entre local TreasureManager = {} e return TreasureManager. A retornada deve ser a última linha de código em um Script de Módulo.
Verifique se há duas aspas no final da linha com necessitar/requisitar, como em WaitForChild("TreasureManager")).
Criar uma Função Local
Agora, um placar de classificação rastreia as chaves e o tesouro de um jogador. Para alterar os números do placar de classificação, use uma função local no script do módulo. Uma função local é usada porque alterar as chaves de um jogador ou valores do tesouro só será necessário no script do TreasureManager, não em qualquer outro lugar.
In ServerStorage , open the TreasureManager script.
Crie variáveis locais para fazer o seguindo:
Obtenha o serviço Players para que o script possa funcionar com as estatísticas de classificação do jogador.
Armazene o número de chaves que o jogador recebe depois de tocar em keyPart.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1--Funções Locais--Funções de Módulofunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerCopie e cole essas duas funções locais na seção Funções Locais .
getPlayerKeys() retorna o valor do líder do jogador Lockpicks .
getPlayerTreasure() retorna o valor do líder do jogador Treasure .
--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 getKey() do módulo:
Crie uma variável local para chamar getPlayerKeys(whichCharacter).
Adicione o valor de keyDrop a playerKeys.
--Funções de Módulofunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endExecute o projeto. Verifique se tocar uma chave 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 de 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ódulo
O script de 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-lhes ouro.
Verificar se Baús podem ser abertos
Primeiro em ServerStorage > TreasureManager script, configurar 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 de Módulo, adicione uma nova função à tabela TreasureManager chamada canOpenChest() com o parâmetro 2> whichCharacter2>.
--Funções de 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
Dê ao Jogador um Tesouro
Para que o jogador possa abrir um baú, crie uma função em TreasureManager que lhes conceda tesouro.
Adicione uma nova função de módulo à TreasureManager chamado openChest().
Passe em dois argumentos:
- chestPart - a parte da caixa para destruir.
- whichCharacter - o jogador para dar tesouro.
function TreasureManager.openChest(chestPart, whichCharacter)endPara subtrair as chaves de um jogador e recompensá-las com 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
Chame as Funções do Baú
Agora que as duas funções de módulo, canOpenChest() e openChest(), foram criadas, elas podem ser chamadas pelas peças do peito sempre que um jogador as toca usando a função pré-definida partTouched().
In Workspace > Baús > Abrir ChestScript.
Crie uma nova variável chamada treasureManager e requerir o script de módulo TreasureManager em ServerStorage .
local ServerStorage = game:GetService("ServerStorage")-- Requer o script de módulo abaixolocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()Em partTouched() , sob a declaração if humanoid, crie uma nova variável chamada canOpen e defin-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ú e depois deixe-os obter tesouros-- =============================================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.
Então, passe em dois parâmetros: chestPart, o baú para destruir, e whichCharacter, o jogador para recompensar 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ú e depois deixe-os obter tesouros-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendExecute o projeto. Verifique se:
- Se você tiver pelo menos 1 chave, tocar um baú o destruirá e o recompensará com tesouro.
- Se você tiver 0 chaves, você não pode abrir um baú do tesouro.
Dicas de solução de problemas
In ChestScript , make sure that functions called from the module script like canOpenChest() are spelled exactly how they're found in the TreasureManager script. Any difference will cause an error.
Verifique se as funções copiadas e coleadas, como treasureManager.openChest(), estão exatamente como mostrado na aula. Quaisquer diferenças podem causar erros sutis no script.
Scripts Concluídos
Script do TreasureManager finalizado
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 de 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
Script de Baú Concluído
local ServerStorage = game:GetService("ServerStorage")
-- Requer o script de 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ú e depois deixe-os obter tesouros
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- Vincula cada parte do peito à função de toque para que funcione em todas as peças
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Script de chave terminado
local ServerStorage = game:GetService("ServerStorage")
-- Requer o script de 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 da chave
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- Vincula cada parte da chave à 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
Visão Geral
Um exemplo comum de usar scripts de módulo em jogos do Roblox é lidar com tarefas comuns usadas pelos jogadores, como conceder-lhes pontos. Para este exemplo, um script de módulo chamado TreasureManager foi criado para lidar com dar chaves e tesouro sempre que eles interagem com objetos do jogo.