Criando 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 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

  1. Baixar o projeto iniciante.

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

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

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

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

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

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

  1. In ServerStorage , open the TreasureManager script.

  2. 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ódulo
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Copie 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 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 getKey() do módulo:

    • Crie uma variável local para chamar getPlayerKeys(whichCharacter).

    • Adicione o valor de keyDrop a playerKeys.


    --Funções de Módulo
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Execute 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

  1. 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 = 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 de Módulo, adicione uma nova função à tabela TreasureManager chamada canOpenChest() com o parâmetro 2> whichCharacter2>.


    --Funções de 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

Dê ao Jogador um Tesouro

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

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

  1. In Workspace > Baús > Abrir ChestScript.

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