materia 06

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

  1. Ter o Roblox Studio instalado e abrir um template (ex.: Baseplate).
  2. Abrir as abas View → Explorer e View → Output.
  3. 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

TipoExemploUso típico
string“Olá”Textos, mensagens
number10, 3.14Contadores, danos, velocidade
booleantrue, falseLógicas de jogo
table{1,2,3} ou {nome=”Alex”, xp=10}Listas, dicionários, configs
Instanceworkspace.PartPartes/objetos do mundo
Vector3Vector3.new(0,10,0)Posições 3D
CFrameCFrame.new(0,5,0)Transformações (posição/rotação)
Color3Color3.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)

  1. Crie um Part no Workspace e renomeie para Moeda.
  2. 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)

  1. Adicione um ClickDetector dentro de um Part.
  2. 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)

  1. 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.

  1. Crie um Part no Workspace e renomeie para JumpPad.
  2. 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)

  1. Nil access: tentar usar algo inexistente. → Use :WaitForChild() e checagens.
  2. Loops travando: while true do sem task.wait().
  3. Código no lugar errado: usar LocalScript no servidor ou Script no cliente.
  4. Confiar no cliente para moeda/dano/inventário. → Sempre no servidor.
  5. 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.