← Todos os guias
Guia 4

Crie o seu primeiro tower defense

Inimigos andam por um caminho em direção à sua base, e uma torre atira no mais próximo.

Grátis60 minutos · Iniciante · Roblox Studio
1
Passo 1 / 8

Prepare o lugar

  1. Abra o Roblox Studio, clique em New Experience e escolha o modelo Baseplate.
  2. No Explorer, passe o mouse sobre Workspace, clique em + e adicione uma Folder. Dê o nome Path.
  3. Adicione uma segunda Folder no Workspace e dê o nome Enemies. Deixe ela vazia. Os inimigos vão aparecer nela durante o jogo.

Mais detalhes

  • O modelo Baseplate está na lista de modelos da tela inicial.
  • Quando você clica em +, digite a palavra Folder para achar rápido. Mude o nome de uma pasta com F2.
  • Os nomes precisam ser exatamente Path e Enemies, com a primeira letra maiúscula. Os scripts procuram por esses nomes.
  • No Mac, use a tecla Cmd toda vez que este guia disser Ctrl.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

2
Passo 2 / 8

Construa o caminho

  1. Adicione uma Part. Coloque Size em 6, 1, 6, ligue Anchored e arraste ela para a pasta Path. Dê o nome 1.
  2. Duplique ela com Ctrl+D e mova a cópia uns 30 studs para longe. Dê o nome 2.
  3. Repita até ter 5 Parts com os nomes 1, 2, 3, 4 e 5. Coloque elas de modo que a rota tenha algumas curvas.
  4. Os inimigos vão de 1 para 2, para 3 e assim por diante, em linha reta entre cada par.

Mais detalhes

  • Para colocar uma peça na pasta, arraste o nome dela no Explorer até o nome Path.
  • Uma cópia feita com Ctrl+D já fica dentro da pasta Path. Você só precisa mover e mudar o nome.
  • Os nomes são só os números: 1, 2, 3, 4, 5. Sem letras e sem espaços.
  • Deixe as peças deitadas no chão. Os inimigos flutuam 2 studs acima delas.
Erro comum. Pular um número. Se a Part 3 não existir, os inimigos param na Part 2 e o script mostra um erro.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

3
Passo 3 / 8

Crie o inimigo

  1. Adicione uma Part. Coloque Shape em Ball e Size em 3, 3, 3, e deixe ela vermelha. Ligue Anchored, desligue CanCollide e dê o nome Enemy.
  2. Passe o mouse sobre Enemy, clique em + e adicione um IntValue. Dê o nome Health e coloque o Value em 3.
  3. Arraste Enemy para o ServerStorage. Agora ele é um modelo. O jogo vai fazer cópias dele.

Mais detalhes

  • Shape é uma lista no Properties. Clique nela e escolha Ball.
  • CanCollide é uma caixa de seleção no Properties. Sem a marca, os jogadores e as outras peças atravessam o inimigo.
  • Quando você clica em +, digite IntValue para achar. Clique no novo IntValue e depois mude Name para Health e Value para 3 no Properties.
  • Depois de arrastar o Enemy para o ServerStorage, ele some do Viewport. Isso está certo.
Dica. O inimigo está com Anchored ligado porque um script move ele. As Parts com Anchored ignoram a gravidade e os empurrões.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

4
Passo 4 / 8

Construa a base

  1. Adicione uma Part grande no final do caminho, ao lado da Part 5. Ligue Anchored e dê o nome Base.
  2. Passe o mouse sobre Base, clique em + e adicione um IntValue. Dê o nome Health e coloque o Value em 10.
  3. Adicione um BillboardGui em Base com Size {0, 200}, {0, 50} e StudsOffset 0, 8, 0. Adicione um TextLabel dentro dele com Size {1, 0}, {1, 0} e TextScaled ligado.
  4. Adicione um Script em Base e cole este código.
Base > Script
local base = script.Parent
local health = base.Health
local label = base.BillboardGui.TextLabel

local function update()
	if health.Value > 0 then
		label.Text = "Base: " .. health.Value
	else
		label.Text = "Game over"
	end
end

health.Changed:Connect(update)
update()

O que cada parte faz

  • Changed roda toda vez que o valor de Health muda.
  • A função update escreve o novo número no texto acima da base.
  • Quando Health chega a 0, o texto mostra Game over e o script Waves para de enviar inimigos.

Mais detalhes

  • Um tamanho de 10, 10, 10 é uma boa base. Qualquer cor serve.
  • O Health da base é outro objeto, diferente do Health do inimigo. Cada um fica dentro da sua própria peça.
  • Para Size e StudsOffset, digite os números exatamente como mostrado, com os parênteses e as vírgulas, e aperte Enter.
  • Para testar: aperte F5. O rótulo acima da base mostra Base: 10.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

5
Passo 5 / 8

Envie as ondas

  1. Passe o mouse sobre ServerScriptService, clique em + e adicione um Script. Dê o nome Waves.
  2. Apague a linha que já está lá e cole este código.
  3. Aperte Play. A cada 3 segundos uma bola vermelha aparece na Part 1 e anda pelo caminho. Quando ela chega ao fim, a base perde 1 de vida.
ServerScriptService > Waves
local TweenService = game:GetService("TweenService")
local ServerStorage = game:GetService("ServerStorage")

local path = workspace:WaitForChild("Path")
local enemies = workspace:WaitForChild("Enemies")
local base = workspace:WaitForChild("Base")
local SPEED = 8

local function walk(enemy)
	for i = 2, #path:GetChildren() do
		local target = path[tostring(i)].Position + Vector3.new(0, 2, 0)
		local distance = (target - enemy.Position).Magnitude
		local info = TweenInfo.new(distance / SPEED, Enum.EasingStyle.Linear)
		local tween = TweenService:Create(enemy, info, {Position = target})
		tween:Play()
		tween.Completed:Wait()
		if not enemy.Parent then return end
	end

	base.Health.Value = math.max(0, base.Health.Value - 1)
	enemy:Destroy()
end

while base.Health.Value > 0 do
	task.wait(3)

	local enemy = ServerStorage.Enemy:Clone()
	enemy.Position = path["1"].Position + Vector3.new(0, 2, 0)
	enemy.Parent = enemies
	task.spawn(walk, enemy)
end

O que cada parte faz

  • Clone faz uma cópia do modelo Enemy que está no ServerStorage.
  • A função walk move o inimigo para cada Part do caminho, em ordem. distance / SPEED mantém a velocidade igual em trechos longos e curtos.
  • task.spawn faz cada inimigo andar por conta própria, para o loop continuar mandando novos.

Mais detalhes

  • O script abre em uma nova aba. Clique dentro do código, aperte Ctrl+A e depois Ctrl+V para trocar tudo.
  • Os inimigos aparecem dentro da pasta Enemies enquanto o jogo roda. Você pode ver eles no Explorer.
  • Sem nenhuma torre ainda, todos os inimigos chegam à base. Depois de 10 inimigos, o rótulo mostra Game over e não vem mais nenhum inimigo.
  • Texto vermelho no Output falando de um nome que não existe quer dizer que uma peça do caminho ou uma pasta está com o nome errado.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

6
Passo 6 / 8

Construa a torre

  1. Adicione uma Part perto de uma curva do caminho. Coloque Size em 4, 8, 4, ligue Anchored e dê o nome Tower.
  2. Adicione um Script em Tower e cole este código.
  3. Aperte Play. Uma vez por segundo, a torre acerta o inimigo mais próximo dentro do alcance. O inimigo pisca em branco e some depois de 3 acertos.
Tower > Script
local tower = script.Parent
local enemies = workspace:WaitForChild("Enemies")
local RANGE = 25
local DAMAGE = 1

while true do
	task.wait(1)

	local target = nil
	local closest = RANGE
	for _, enemy in ipairs(enemies:GetChildren()) do
		local distance = (enemy.Position - tower.Position).Magnitude
		if distance < closest then
			target = enemy
			closest = distance
		end
	end

	if target then
		target.Health.Value -= DAMAGE
		if target.Health.Value <= 0 then
			target:Destroy()
		else
			target.Color = Color3.new(1, 1, 1)
			task.wait(0.1)
			target.Color = Color3.fromRGB(255, 60, 60)
		end
	end
end

O que cada parte faz

  • O loop mede a distância da torre até cada inimigo e guarda o mais próximo.
  • RANGE é até onde a torre alcança. DAMAGE é quanta vida cada acerto tira.
  • Quando Health chega a 0, Destroy remove o inimigo.

Mais detalhes

  • Ponha a torre de 8 a 12 studs do caminho. O alcance é de 25 studs em todas as direções.
  • Uma torre leva 3 segundos para cada inimigo, e um novo inimigo vem a cada 3 segundos. Então uma torre só segura o caminho se os inimigos ficarem no alcance por tempo suficiente.
  • O clarão branco dura um décimo de segundo. Olhe com atenção para ver.
  • Para uma segunda torre, selecione Tower e aperte Ctrl+D, depois mova a cópia. O script vem junto.
Dica. Uma torre funciona melhor ao lado de uma curva, porque os inimigos ficam mais tempo no alcance ali.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

7
Passo 7 / 8

Teste e equilibre

  1. Aperte F5 e veja algumas ondas.
  2. Se nenhum inimigo chega à base, o jogo está fácil demais. Se a base perde toda a vida rápido, está difícil demais.
  3. Equilibre com três números: o tempo de espera em Waves, o valor de Health do inimigo e o DAMAGE da torre.
  4. Aperte Shift+F5 para parar. Se algo falhar, abra a janela Output pelo menu Window e leia o texto vermelho.

Mais detalhes

  • Mude só um número de cada vez e jogue de novo. Se não, você não sabe qual mudança ajudou.
  • O tempo de espera é o número em task.wait(3) perto do fim do script Waves. Um número menor manda os inimigos mais rápido.
  • O Health do inimigo fica no ServerStorage, dentro do Enemy. O DAMAGE da torre fica no começo do script Tower.
  • Um bom primeiro objetivo: a base aguentar dois minutos com duas torres.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

8
Passo 8 / 8

Publique

  1. Escolha File → Publish to Roblox. Dê um nome ao jogo e uma descrição curta.
  2. No site Creator Hub, abra o seu jogo e responda o questionário de Maturity.
  3. Coloque o jogo como Public e mande o link para um amigo.

Mais detalhes

  • Na primeira vez que você publica, o Studio pede um nome e uma descrição. Clique em Create.
  • O Creator Hub é o site create.roblox.com. Entre com a mesma conta e clique no seu jogo na lista.
  • O Roblox pode pedir mais coisas antes de um jogo ficar público, por exemplo uma verificação de idade na conta. A página diz o que está faltando.
  • Se você tem menos de 18 anos, faça este passo junto com um responsável.
Dica. Mostre o jogo a um amigo e faça uma pergunta: foi fácil demais ou difícil demais? Depois mude um número e teste de novo.
Este passo não funciona para mim

Confira primeiro estas três coisas

  • O nome de cada Part e de cada Script está exatamente como no guia, com as mesmas letras maiúsculas.
  • O Script está dentro do objeto certo. Olhe o rótulo que fica acima da caixa de código.
  • Abra a janela Output pelo menu Window. O texto em vermelho mostra qual script e qual linha têm o problema.

Ainda está travado? Escreva para nós →

Agora mude você mesmo

  • Adicione uma segunda torre com alcance curto e DAMAGE 2.
  • Faça as ondas ficarem mais rápidas com o tempo. Dica: guarde o tempo de espera em uma variável e diminua um pouco depois de cada inimigo.
  • Dê 20 de vida à base e faça cada inimigo tirar 2.