Script um botão de upgrade

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


Jogadores agora podem coletar moedas e perdê-las quando morrem, mas as moedas não fazem nada, e a maior parte do mundo do jogo é inacessível sem a capacidade de pular muito alto.Esta seção do tutorial ensina você a concluir a lógica para sua experiência adicionando um botão na tela que gasta moedas para aumentar o poder de pulo.

Crie o botão de atualização

As interfaces 2D no Roblox são tipicamente compostas por uma coleção de componentes de GUI dentro de um contêiner de GUI.Neste caso, você só precisa de um componente TextButton que diga Pulo de Atualização (5 Moedas) dentro de um ScreenGui recipiente.

Para criar a Interface gráfica do usuário:

  1. Na janela Explorer , adicione um novo diretório em ReplicatedStorage , então renomeie o diretório para Instâncias .Qualquer objeto em ReplicatedStorage é acessível ao cliente do Roblox de cada jogador, onde as interfaces gráficas são exibidas.
  2. Adicione um objeto ScreenGui na pasta Instâncias .
  3. Selecione o Objeto ScreenGui , então na janela Propriedades ,
    1. Defina Nome para JumpPurchaseGui .
    2. Desabilite ResetOnSpawn para garantir que a GUI permaneça ligada ao jogador quando eles respawnarem.
  4. Na janela Explorer , insira um TextButton no contêiner JumpPurchaseGui , então renomeie o botão de texto para JumpButton .
  5. (Opcional) Personalize a aparência e a posição do botão configurando suas propriedades. Sugestões simples incluem:
    • Defina a propriedade Texto para Aprimorar Pulo (5 Moedas) .
    • Defina a propriedade Tamanho do Texto para 25.
    • Defina Ponto de Ancoragem para 1, 1 e Posição para {1, 0},{1, 0} para mover o botão para o canto inferior direito.

Você adicionará o botão à GUI do jogador mais tarde neste Tutorial, mas antes de fazer isso, você precisa definir toda a lógica e dados que são necessários para o botão funcionar.

Definir dados de poder de pulo

Atualmente, apenas o número de moedas é armazenado para cada jogador no script do módulo Dados do Jogador .Você também precisa armazenar e atualizar a potência de pulo da mesma maneira.Porque as funções em PlayerData não são específicas para os dados que estão sendo alterados, tudo o que é necessário para armazenar o poder de pulo do jogador é adicionar uma chave Jump e inicializar seu valor inicial em DEFAULT_PLAYER_DATA .

Para atualizar o script do módulo Dados do Jogador para armazenar poder de pulo:

  1. Na janela Explorer , abra o script do módulo Dados do Jogador na Armazenamento do Servidor .

  2. Substitua o código no script com o seguinte exemplo, que inicializa um valor Jump para cada jogador ao lado de seu valor existente Coins:


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    PlayerData.JUMP_KEY_NAME = "Jump"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number,
    ["Jump"] = jumpPower: number
    }
    --]]
    }
    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0,
    [PlayerData.JUMP_KEY_NAME] = 0,
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end
    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end
    return PlayerData

Atualizar dados de poder de pulo

Agora que Dados do Jogador são capazes de rastrear a potência de pulo, você precisa implementar lógica no servidor para aumentar a potência de pulo de um solicitar / pedirdo cliente de um jogador.

O servidor e o cliente podem se comunicar através de eventos remotos ou funções remotas.Eventos remotos não são gerados quando são disparados e são apropriados para comunicação de um para um.Funções remotas retornam até que recebam uma resposta, o que permite uma comunicação de duas vias.Neste caso, o cliente precisa saber se o servidor melhorou com sucesso a potência de pulo do jogador, então uma função remota é ideal.

Para implementar a upgrade / melhoriade pulo:

  1. Na janela Explorer , abra o diretório Instâncias na Armazenamento Replicado .

  2. Insira um RemoteFunction na pasta Instâncias , então renomeie a função remota para IncreaseJumpPowerFunction .Você sempre cria funções remotas em ReplicatedStorage porque tanto o cliente quanto o servidor devem ser capazes de acessá-las.

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. Na janela Explorer , selecione Jogador Inicial .

  4. Na janela Propriedades , habilite a propriedade CharacterUseJumpPower .Por padrão, o valor do poder de pulo de um personagem não define a quantidade que um personagem salta, então isso precisa ser ativado.

  5. Na janela Explorer , insira um novo script em Serviço de Script de Servidor , então renomeie o script para JumpService .Este script conterá a lógica para melhorias de pulo.

  6. Substitua o código padrão pelo seguinte código:


    -- Serviços
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Móveis
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Eventos
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local JUMP_POWER_INCREMENT = 30
    local JUMP_COIN_COST = 5
    local function updateJumpPower(player, updateFunction)
    -- Atualize a tabela de poder de pulo
    local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
    -- Atualize a força de pulo dos jogadores
    local character = player.Character or player.CharacterAdded:Wait()
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.JumpPower = newJumpPower
    -- Atualizar a tabela de classificação de pulo
    Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
    end
    end
    local function onPurchaseJumpIncrease(player)
    local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
    if coinAmount < JUMP_COIN_COST then
    return false
    end
    -- Aumentar a força de pulo do jogador
    updateJumpPower(player, function(oldJumpPower)
    oldJumpPower = oldJumpPower or 0
    return oldJumpPower + JUMP_POWER_INCREMENT
    end)
    -- Atualize a tabela de moedas
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
    return oldCoinAmount - JUMP_COIN_COST
    end)
    -- Atualize a tabela de classificação de moedas
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    return true
    end
    local function onCharacterAdded(player)
    -- Redefina a força de pulo do jogador quando o personagem for adicionado
    updateJumpPower(player, function(_)
    return 0
    end)
    end
    -- Inicialize qualquer jogador adicionado antes de se conectar ao evento PlayerAdded
    for _, player in Players:GetPlayers() do
    onCharacterAdded(player)
    end
    -- Inicialização normal de jogadores do evento PlayerAdded
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(function()
    onCharacterAdded(player)
    end)
    end
    local function onPlayerRemoved(player)
    updateJumpPower(player, function(_)
    return nil
    end)
    end
    IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
    Players.PlayerAdded:Connect(onPlayerAdded)
    Players.PlayerRemoving:Connect(onPlayerRemoved)

    As seções a seguir descrevem o código com mais detalhe.

    • Atualize os dados de poder de pulo - updateJumpPower() atualiza o poder de pulo do jogador e da tabela de classificação para fornecer comentário/retornovisual.Essa função se assemelha ao código que causa danos aos jogadores em Criar perigos de jogador.Forneceu um modelo Character e Humanoid existente para o jogador sendo atualizado, a função atualiza a propriedade JumpPower para o novo valor armazenado por PlayerData , aumentando-a em 30.Se você quiser que seu jogo dure um pouco mais, você pode diminuir esse número.

    • Valide solicitações de servidor - onPurchaseJumpIncrease() primeiramente verifica se o jogador realmente tem o número de moedas necessário para comprar a upgrade / melhoria. Todos os pedidos de clientes para o servidor devem ser validados para impedir que os atores maliciosos enviem pedidos falsos e explorem sua experiência.

Adicione o botão à Interface gráfica do usuáriodo jogador

Um objeto ScreenGui apenas aparece na tela se for parentado a um ObjetoPlayerGui do jogador.Por padrão, isso contém a GUI do sistema, como a janela de chat.Agora você precisa criar um script em ReplicatedStorage para copiar o botão de atualização na GUI de cada jogador e implementar o comportamento quando pressionado.

Para adicionar o botão à GUI do jogador quando eles se juntarem:

  1. Na janela Explorer , crie um Script em ReplicatedStorage .

  2. Selecione o script, então na janela Propriedades ,

    1. Defina Nome para JumpButtonClickHandler .
    2. Defina Contexto de Execução para Cliente . Isso diz ao motor para sempre executar este script no cliente para otimizar a comunicação de rede.
  3. No script aberto, substitua o código padrão pelo seguinte código:


    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local playerGui = player.PlayerGui
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
    local jumpButton = jumpPurchaseGui.JumpButton
    local function onButtonClicked()
    local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
    if not success then
    -- comprado será a mensagem de erro se o sucesso for falso
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    end
    end
    jumpButton.Activated:Connect(onButtonClicked)
    -- Adicione o JumpPurchaseGui à Gui do jogador
    jumpPurchaseGui.Parent = playerGui

    As seções a seguir descrevem o código com mais detalhe.

    • Obtenha referências à função GUI e ao servidor - As variáveis IncreaseJumpPowerFunction, jumpPurchaseGui e jumpButton contêm referências à função e ao GUI que chamam a função que você precisará mais tarde.
    • Defina o manipulador de eventos - onButtonClicked() define a lógica para quando os usuários clicam no botão de atualização.Ele usa pcall() (chamada protegida) para invocar o RemoteFunction .Qualquer comunicação cliente-servidor como esta requer pcall() para lidar com erros ou problemas de conexão.
    • Conecte o manipulador ao botão - O evento Activated é compatível em todas as plataformas, incluindo mouse, toque ou contexto de gamepad.Ele é acionado quando um clique , toque ou botão do gamepad é liberado.

Teste de Jogo

Você deve agora ser capaz de comprar upgrades de pulo para moedas usando o botão de upgrade. Para testar o projeto:

  1. Na barra de ferramentas, clique no botão Jogar . O Studio entra no modo de teste de jogo.

    Play button highlighted in Studio's playtesting options.
  2. Se seus scripts estiverem funcionando corretamente, um botão para comprar poder de pulo aparece na tela.Tente clicar no botão antes de coletar quaisquer moedas para verificar que ele não lhe concede poder de pulo adicional, então tente coletar algumas moedas e verifique se a atualização funciona quando você clica novamente.

Agora que o código está completo, tente equilibrar o jogo através da quantidade e das posições das moedas.Adicione mais moedas se o jogo parecer muito lento, ou subtraia moedas e coloque-as em lugares desafiadores se parecer muito rápido e fácil.