Os jogadores agora podem coletar moedas e perdê-las quando morrem, mas as moedas não fazem nada, e a maior parte do mundo 3D é inacessível sem a capacidade de pular muito alto. Esta seção do tutorial ensina como finalizar a lógica da sua experiência adicionando um botão na tela que gasta moedas para aumentar o poder de salto.
Criar o botão de upgrade
Interfaces 2D no Roblox geralmente são compostas por uma coleção de componentes GUI dentro de um contêiner GUI. Neste caso, você só precisa de um componente TextButton que diga Upgrade Jump (5 Moedas) dentro de um contêiner ScreenGui.
Configurar a GUI de upgradeNo ReplicatedStorage, crie uma pasta chamada Instances.Dentro da pasta Instances, crie uma ScreenGui nomeada JumpPurchaseGui com ResetOnSpawn desativado.Dentro de JumpPurchaseGui, crie um TextButton nomeado JumpButton com as seguintes propriedades:- Text: "Upgrade Jump (5 Moedas)"- TextSize: 25- AnchorPoint: 1, 1- Position: {1, 0}, {1, 0}Também dentro da pasta Instances, crie um RemoteFunction nomeado IncreaseJumpPowerFunction.Finalmente, no serviço StarterPlayer, ative a propriedade CharacterUseJumpPower.
Definir dados de poder de salto
Atualmente, apenas a contagem de moedas é armazenada para cada jogador no script do módulo PlayerData. Você também precisa armazenar e atualizar o poder de salto da mesma maneira. Como as funções em PlayerData não são específicas para os dados que estão sendo alterados, tudo o que precisa ser feito para armazenar o poder de salto do jogador é adicionar uma chave Jump e inicializar seu valor inicial em defaultPlayerData().
Atualizar PlayerData com poder de saltoNo ServerStorage, substitua o código do módulo PlayerData existente pelo seguinte:```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"PlayerData.JUMP_KEY_NAME = "Jump"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number,["Jump"] = jumpPower: number}--]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0,[PlayerData.JUMP_KEY_NAME] = 0,}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData```
Atualizar dados de poder de salto
Agora que PlayerData é capaz de rastrear o poder de salto, você precisa implementar a lógica no servidor para aumentar o poder de salto a partir de uma solicitação do cliente.
O servidor e o cliente podem se comunicar através de RemoteEvents ou RemoteFunctions. Eventos remotos não aguardam quando são disparados e podem ser usados para comunicação unidirecional. Funções remotas, por outro lado, aguardam até receber uma resposta, o que permite comunicação bidirecional.
Para este tutorial, o cliente precisa saber se o servidor atualizou com sucesso o poder de salto do jogador, então você deve usar uma função remota.
Criar JumpServiceNo ServerScriptService, crie um Script nomeado JumpService com o seguinte código:```lua-- Serviçoslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Móduloslocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Eventoslocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local function updateJumpPower(player, updateFunction)-- Atualiza a tabela de poder de saltolocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Atualiza o poder de salto dos jogadoreslocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Atualiza o leaderboard de saltoLeaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- Aumenta o poder de salto do jogadorupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Atualiza a tabela de moedaslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Atualiza o leaderboard de moedasLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Redefine o poder de salto do jogador quando o personagem é adicionadoupdateJumpPower(player, function(_)return 0end)end-- Inicializa qualquer jogador adicionado antes de conectar ao evento PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- Inicialização normal dos jogadores a partir do evento PlayerAddedlocal function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)```
As próximas seções descrevem o código em mais detalhes.
Atualizar os dados de poder de salto - updateJumpPower() atualiza o poder de salto do jogador e do leaderboard para fornecer feedback visual. Esta função se assemelha ao código que danifica jogadores em Criar perigos para jogadores. Desde que um modelo de Character e Humanoid existam para o jogador que está sendo aprimorado, a função atualiza a propriedade JumpPower para o novo valor armazenado por PlayerData, aumentando-o em 30. Se você quiser que seu jogo dure um pouco mais, pode diminuir esse número.
Validar solicitações do servidor - onPurchaseJumpIncrease() primeiro verifica se o jogador realmente tem a quantidade de moedas necessárias para comprar o upgrade. Todas as solicitações de clientes para o servidor devem ser validadas para evitar que atores maliciosos enviem solicitações falsas e explorem seu jogo.
Adicionar o botão à GUI do jogador
Um objeto ScreenGui só é exibido na tela se estiver vinculado ao objeto PlayerGui de um jogador. Por padrão, isso contém a GUI do sistema, como a janela de chat. Agora você precisa criar um script no ReplicatedStorage para copiar o botão de upgrade para a GUI de cada jogador e implementar um comportamento para quando o botão for pressionado.
Criar JumpButtonClickHandlerNo ReplicatedStorage, crie um Script nomeado JumpButtonClickHandler com RunContext definido como Cliente e o seguinte código:```lualocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- purchased será a mensagem de erro se o sucesso for falsoerror(purchased)elseif success and not purchased thenwarn("Moedas insuficientes!")endendjumpButton.Activated:Connect(onButtonClicked)-- Adiciona o JumpPurchaseGui à GUI do jogadorjumpPurchaseGui.Parent = playerGui```
As próximas seções descrevem o código em mais detalhes.
- Obter referências à GUI e à função do servidor - As variáveis IncreaseJumpPowerFunction, jumpPurchaseGui e jumpButton contêm referências à função e GUI que chamam a função que você precisará mais tarde.
- Definir o manipulador de eventos - onButtonClicked() define a lógica para quando os usuários clicam no botão de upgrade. Ele usa pcall() (chamada protegida) para invocar a RemoteFunction. Qualquer comunicação cliente-servidor como esta requer pcall() para lidar com erros ou problemas de conexão.
- Conectar o manipulador ao botão - O evento Activated é compatível em todas as plataformas, incluindo mouse, tela sensível ao toque ou contextos de gamepad. Ele é acionado quando um clique, toque ou botão do gamepad é liberado.
Testar
Selecione Testar no menu suspenso e clique em Jogar. O botão Upgrade Jump aparece no canto inferior direito.
Tente clicar no botão antes de coletar moedas para verificar se ele não lhe concede poder de salto adicional, depois tente coletar algumas moedas e veja se o upgrade funciona quando você clica novamente.
Com o código completo, tente ajustar a dificuldade: adicione moedas se o ritmo parecer lento, ou remova algumas e as esconda em locais mais difíceis se os upgrades forem fáceis demais.