Rafa Skoberg
Rafa Skoberg14/06/2023 13:02
Compartilhe

Desenvolvimento em Roblox com Lua

    O Roblox é uma plataforma de criação de jogos que permite aos desenvolvedores criarem experiências interativas em poucos minutos. Um dos maiores benefícios é a habilidade de criar projetos que podem ser jogados por diversas pessoas simultaneamente (multiplayer) sem nenhum custo com servidor ou banco de dados, tudo isso já está incluso na plataforma desde o início, e a melhor parte, de graça.

    Para isso, usamos a linguagem de programação Lua, que desempenha um papel fundamental no desenvolvimento de jogos nessa plataforma. Lua é uma linguagem de programação leve, poderosa e muito fácil de aprender. Vamos ver um exemplo simples de como essa linguagem pode ser aplicada no desenvolvimento de um jogo.

    No nosso exemplo vamos ver como podemos criar um projeto simples que pode ser jogado por diversas pessoas ao mesmo tempo usando apenas dois scripts, um no dispositivo de cada jogador, e um no servidor.

    Preparando a Cena

    No nosso exemplo nós podemos começar a partir de um "Baseplate", que é um projeto vazio do Roblox apenas com um chão como base, e em cima do mesmo criaremos alguns cubos. Nesse exemplo eu criei cubos grandes que são compostos de 27 cubos menores (3x3x3).

    1. Crie várias Parts representando os cubos menores nas suas devidas posições.
    2. Habilite a propriedade "Anchored" de todos eles, para que eles não sejam afetados pela física do jogo.
    3. Agrupe os cubinhos em Models para que um único objeto (o Model) represente um desses cubos maiores.
    4. Mova todos os cubos para uma nova pasta chamada "Cubes" dentro do Workspace.

    image

    Interface do Usuário

    Nossa interação multiplayer será feita a partir de um botão na tela do jogador, que enviará um sinal para nosso servidor. Então devemos criar esse botão no nosso projeto.

    1. Crie um "ScreenGui" dentro do serviço "StarterGui".
    2. Crie um "TextButton" dentro do ScreenGui e ajuste sua posição e aparência como desejar.

    image

    Comunicação entre Client e Server

    Em muitas engines e frameworks de jogos essa é a etapa mais complexa e trabalhosa em um projeto, mas no Roblox é o oposto, precisamos criar apenas uma Instância no Roblox Studio para habilitar essa comunicação!

    Dentro de "ReplicatedStorage" é só criarmos um objeto do tipo "RemoteEvent", e é isso! No nosso exemplo eu vou renomear esse evento remoto para "RemoteButtonEvent".

    Já que a instância está dentro do ReplicatedStorage, tanto o server quanto os clients saberão de sua existência.

    Script no Cliente

    A programação no dispositivo do cliente pode ser feita em um "LocalScript". Para isso vamos criar um LocalScript dentro da pasta "StarterPlayer/StarterPlayerScripts" com o seguinte código:

    
    -- Aqui vamos obter as referências do jogador, e do botão na nossa UI
    local player = game.Players.LocalPlayer
    local playerGui = player:WaitForChild("PlayerGui")
    local screenGui = playerGui:WaitForChild("ScreenGui")
    local button = screenGui.TextButton
    
    -- Aqui vamos obter a referência do evento remoto que usaremos para a comunicação client / server
    local remoteButtonEvent = game.ReplicatedStorage.RemoteButtonEvent
    
    -- E aqui registramos um callback para que quando o jogador clique no botão, o evento remoto seja disparado
    button.MouseButton1Click:Connect(function()
      remoteButtonEvent:FireServer()
    end)
    

    Viu como é fácil? Com apenas algumas linhas nós já conseguimos enviar uma mensagem do cliente para o servidor ao clicarmos em um botão.

    Agora precisamos programar o lado do servidor, então vamos lá.

    Script no Servidor

    A programação do servidor pode ser feita em um objeto do tipo "Script" que vive dentro do serviço "ServerScriptService". Esses scripts são executados automaticamente assim que o servidor é iniciado.

    No nosso exemplo vamos buscar por todos os cubos do jogo, e registrar um callback que faz com que o cubo mais próximo ao jogador que pressionou o botão exploda, boom!!

    -- Debris é um serviço que nos possibilita destruir objetos no futuro,
    -- algo como "destrua esse objeto daqui 5 segundos".
    local Debris = game:GetService("Debris")
    
    -- Aqui nós buscamos por todos os cubos do jogo e registramos eles em uma lista.
    local cubes = {}
    for _, instance in pairs(workspace.Cubes:GetChildren()) do
      table.insert(cubes, instance)
    end
    print("Registered", #cubes, "cubes.")
    
    -- Essa função recebe o player como parâmetro e retorna o cubo mais próximo
    local function findNearestCube(player)
      local playerPosition = player.Character.PrimaryPart.CFrame.Position
      
      local nearestCube = nil
      local nearestDist = nil
      local nearestIndex = 0
      for i, cube in pairs(cubes) do
          local cubePosition = cube.PrimaryPart.Position
          local dist = (playerPosition - cubePosition).Magnitude
          if nearestCube == nil or dist < nearestDist then
              nearestCube = cube
              nearestDist = dist
              nearestIndex = i
          end
      end
    
      return nearestCube, nearestIndex
    end
    
    -- Essa função faz com que o cubo passado por parâmetro exploda. Boom!
    local function explodeCube(cube, index  )
      -- Precisamos remover a propriedade "Anchored" de todos os cubinhos, para que eles explodam
      for _, part in pairs(cube:GetChildren()) do
          part.Anchored = false    
      end
      
      -- Daqui 5 segundos eles podem ser removidos do jogo
      Debris:AddItem(cube, 10)
      
      -- Aqui nós podemos remover nosso cubo da lista.
      cubes[index] = cubes[#cubes]
      cubes[#cubes] = nil
      
      -- E finalmente criamos uma explosão no cubo
      spawn(function()
          local explosion = Instance.new("Explosion")
          explosion.DestroyJointRadiusPercent = 0
          explosion.BlastPressure = 10000000
          explosion.BlastRadius = 5
          explosion.Visible = true
          explosion.Position = cube.PrimaryPart.Position
          explosion.Parent = cube
      end)
    end
    
    -- Vamos registrar o callback que será executado toda vez que nosso evento remoto receber um sinal de algum cliente.
    local function onButtonClick(player)
      -- Primeiro buscamos pelo cubo mais próximo
      local cube, index = findNearestCube(player)
      if cube then
          -- E se nossa função achar um cubo, explodimos ele!
          explodeCube(cube, index)
      end
    end
    local remoteButtonEvent = game.ReplicatedStorage.RemoteButtonEvent
    remoteButtonEvent.OnServerEvent:Connect(onButtonClick)
    
    

    Play

    E é isso! Agora é hora de dar Play e aproveitar nossa experiência multiplayer! Podemos tanto jogar diretamente no Roblox Studio quanto publicar o projeto em uma experiência pública que pode ser jogada por outras pessoas.

    https://www.roblox.com/games/5801425363/

    Compartilhe
    Comentários (0)