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).
- Crie várias Parts representando os cubos menores nas suas devidas posições.
- Habilite a propriedade "Anchored" de todos eles, para que eles não sejam afetados pela física do jogo.
- Agrupe os cubinhos em Models para que um único objeto (o Model) represente um desses cubos maiores.
- Mova todos os cubos para uma nova pasta chamada "Cubes" dentro do Workspace.
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.
- Crie um "ScreenGui" dentro do serviço "StarterGui".
- Crie um "TextButton" dentro do ScreenGui e ajuste sua posição e aparência como desejar.
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.