
Introdução
Lua é a linguagem de script do Roblox. Simples, rápida e ótima para iniciantes, ela permite criar interações, sistemas de jogo, UI, economia virtual e tudo que dá “vida” às suas experiências. Neste guia prático, você vai aprender o essencial — variáveis, condicionais, loops, funções e eventos — com exemplos prontos para copiar, colar e testar no Roblox Studio.
Pré-requisitos rápidos
- Ter o Roblox Studio instalado e abrir um template (ex.: Baseplate).
- Abrir as abas View → Explorer e View → Output.
- Inserir scripts pelo Explorer → (clicar com direito) → Insert Object → Script/LocalScript.
Onde usar Script vs LocalScript
- Script: roda no servidor (Workspace, ServerScriptService).
- LocalScript: roda no cliente (StarterPlayerScripts, StarterGui, ferramentas do jogador).
1) Variáveis e tipos básicos
Variáveis
local playerName = “Alex”
local coins = 25
local isVIP = true
Tipos comuns em Roblox Lua
| Tipo | Exemplo | Uso típico |
| string | “Olá” | Textos, mensagens |
| number | 10, 3.14 | Contadores, danos, velocidade |
| boolean | true, false | Lógicas de jogo |
| table | {1,2,3} ou {nome=”Alex”, xp=10} | Listas, dicionários, configs |
| Instance | workspace.Part | Partes/objetos do mundo |
| Vector3 | Vector3.new(0,10,0) | Posições 3D |
| CFrame | CFrame.new(0,5,0) | Transformações (posição/rotação) |
| Color3 | Color3.fromRGB(255,0,0) | Cores |
Operadores úteis
— Aritméticos
local a, b = 5, 2
print(a + b, a – b, a * b, a / b, a % b, a ^ b)
— Comparação: == ~= < <= > >= → retornam boolean
— Lógicos: and, or, not
2) Condicionais (if/elseif/else)
local coins = 30
if coins >= 50 then
print(“Você pode comprar a espada!”)
elseif coins >= 20 then
print(“Quase lá! Compre uma poção.”)
else
print(“Junte mais moedas.”)
end
3) Loops: while, for, pairs/ipairs
— while
local energia = 3
while energia > 0 do
print(“Energia: “, energia)
energia -= 1
end
— for numérico
for i = 1, 5 do
print(“Onda:”, i)
end
— listas (ipairs) e dicionários (pairs)
local inventario = {“Poção”, “Chave”, “Mapa”}
for i, item in ipairs(inventario) do
print(i, item)
end
local stats = {hp=100, mana=40}
for chave, valor in pairs(stats) do
print(chave, valor)
end
Dica: Evite loops “infinitos” com while true do sem task.wait(). Use eventos quando possível.
4) Funções e escopo
Definição e retorno
local function soma(a, b)
return a + b
end
print(soma(3, 7)) — 10
Escopo (local)
- Variáveis local existem apenas no bloco/arquivo onde foram declaradas.
- Prefira local para evitar conflitos e ganhos de performance.
Funções como callbacks
local function aoColetarMoeda(qtd)
print(“Coletou”, qtd, “moeda(s)”)
end
aoColetarMoeda(1)
5) Eventos: dando vida ao jogo
Roblox usa sinais (RBXScriptSignals) para notificar ações (toque, clique, entrada de jogador etc.). Você conecta uma função a um evento com :Connect.
5.1 Tocar numa Part (Script no servidor)
- Crie um Part no Workspace e renomeie para Moeda.
- Insira um Script dentro da Moeda:
local moeda = script.Parent
local function aoTocar(outro)
local player = game.Players:GetPlayerFromCharacter(outro.Parent)
if player then
print(player.Name .. ” tocou na moeda!”)
moeda:Destroy() — some após coletar
end
end
moeda.Touched:Connect(aoTocar)
5.2 Clique com ClickDetector (servidor)
- Adicione um ClickDetector dentro de um Part.
- Script no Part:
local part = script.Parent
local click = part:FindFirstChildOfClass(“ClickDetector”)
local function aoClicar(player)
print(player.Name .. ” clicou na alavanca!”)
part.BrickColor = BrickColor.Random()
end
click.MouseClick:Connect(aoClicar)
5.3 Teclas/Mouse do jogador (cliente com LocalScript)
- Em StarterPlayer → StarterPlayerScripts, insira um LocalScript:
local UIS = game:GetService(“UserInputService”)
UIS.InputBegan:Connect(function(input, processed)
if processed then return end
if input.KeyCode == Enum.KeyCode.F then
print(“F pressionado!”)
end
end)
5.4 Loop por frame (cliente) com RunService
local RunService = game:GetService(“RunService”)
local t = 0
RunService.RenderStepped:Connect(function(dt)
t += dt
if t >= 1 then
— executa a cada ~1s
print(“1 segundo passou no cliente”)
t = 0
end
end)
6) Cliente ↔ Servidor com RemoteEvent
Para comunicar ações do jogador (cliente) ao servidor com segurança, use RemoteEvent.
Setup
- Em ReplicatedStorage, crie um RemoteEvent chamado ColetarMoedaRE.
Cliente (LocalScript em StarterPlayerScripts)
local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local ColetarMoedaRE = ReplicatedStorage:WaitForChild(“ColetarMoedaRE”)
— Exemplo: informar ao servidor que o jogador coletou 5 moedas
ColetarMoedaRE:FireServer(5)
Servidor (Script em ServerScriptService)
local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local ColetarMoedaRE = ReplicatedStorage:WaitForChild(“ColetarMoedaRE”)
ColetarMoedaRE.OnServerEvent:Connect(function(player, quantidade)
print(player.Name .. ” coletou ” .. quantidade .. ” moeda(s).”)
— Atualize DataStore, leaderstats, etc.
end)
Regra de ouro: nunca confie no cliente para lógica sensível (moedas, dano, inventário). Valide no servidor.
7) Mini-projeto guiado: “Plataforma que dá salto”
Objetivo: ao pisar na plataforma, o jogador recebe um “boost” de pulo por 5 segundos.
- Crie um Part no Workspace e renomeie para JumpPad.
- Insira um Script dentro do JumpPad:
local pad = script.Parent
local BOOST = 100
local DURACAO = 5
local function aoTocar(hit)
local char = hit.Parent
local humanoid = char and char:FindFirstChildOfClass(“Humanoid”)
if humanoid then
local antigo = humanoid.JumpPower
humanoid.JumpPower = BOOST
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
task.delay(DURACAO, function()
if humanoid and humanoid.Parent then
humanoid.JumpPower = antigo
end
end)
end
end
pad.Touched:Connect(aoTocar)
Conceitos aplicados: eventos (Touched), propriedades de Humanoid, task.delay, restauração de estado.
8) Boas práticas e padrões
- Use local sempre que possível.
- Evite lógica pesada em loops; prefira eventos.
- Modularize código com ModuleScripts para reuso:
— ModuleScript: Modules/Calculos.lua
local M = {}
function M.Soma(a,b) return a+b end
return M
— Em outro Script:
local Calculos = require(game.ReplicatedStorage.Modules.Calculos)
print(Calculos.Soma(2,3))
- Nomeie e organize pastas (ex.: ServerScriptService/Controllers, ReplicatedStorage/Modules).
- Debugar com print, warn, Output e F9 (Developer Console).
- Segurança: valide tudo no servidor; limite o que o cliente pode pedir.
9) Erros comuns (e como evitar)
- Nil access: tentar usar algo inexistente. → Use :WaitForChild() e checagens.
- Loops travando: while true do sem task.wait().
- Código no lugar errado: usar LocalScript no servidor ou Script no cliente.
- Confiar no cliente para moeda/dano/inventário. → Sempre no servidor.
- Eventos sem desconectar (em scripts dinâmicos). → Armazene a conexão e chame :Disconnect() quando não precisar mais.
10) FAQ (perguntas frequentes)
1) Preciso dominar programação para começar?
Não. Comece construindo; aprenda scripts aos poucos.
2) Qual a diferença entre Script e LocalScript?
Script roda no servidor; LocalScript, no cliente. Lógica sensível fica no servidor.
3) Como salvar progresso do jogador?
Use DataStoreService no servidor (com limites e tratamento de erros).
4) Como otimizar?
Prefira eventos a loops, use task.wait(), evite transparências/partículas excessivas e componha sistemas modulares.
5) Posso reaproveitar código entre lugares?
Sim, com ModuleScripts (padrão recomendado).
Conclusão
Você viu os fundamentos de Lua no Roblox: variáveis, condicionais, loops, funções e eventos — além de um mini-projeto e boas práticas de cliente/servidor. Com isso, já dá para prototipar mecânicas, criar interações e organizar seu código de forma profissional.
Próximos passos: ModuleScripts avançados, DataStore, sistemas de UI, RemoteFunctions e design orientado a componentes.
