Criação com 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.

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

  1. Faça o download do projeto inicial.

  2. 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.

  1. Em ServerStorage , crie um novo ModuleScript e renomeie-o TreasureManager.

  2. 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

  1. 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ódulo
    return TreasureManager
  2. Sob 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ódulo
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. Em 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á.

  1. Abra o script de chave em Workspace > Keys > KeyScript .

  2. 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.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. 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.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
  4. Corra 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.

  1. Em ServerStorage , abra o script TreasureManager.

  2. 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ódulo
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Copie 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 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
    ------------------ Module Functions
  4. Para 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ódulo
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Corra 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

  1. 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 = 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
  2. Para 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ódulo
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. Copie 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 then
    return true
    else
    return false
    end
    end

Dar Tesouro aos Jogadores

Para que o jogador possa abrir um baú, crie uma função no TreasureManager que lhe conceda tesouro.

  1. 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)
    end
  2. Para 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 - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart: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().

  1. Em Workspace > Baús abra ChestScript.

  2. 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 abaixo
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. 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.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)
    -- =====================================================================
    end
    end
  4. Em 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.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
  5. Corra 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.