← Todas las guías
Guía 4

Crea tu primer tower defense

Los enemigos caminan por un camino hacia tu base y una torre dispara al más cercano.

Gratis60 minutos · Principiante · Roblox Studio
1
Paso 1 / 8

Prepara el lugar

  1. Abre Roblox Studio, haz clic en New Experience y elige la plantilla Baseplate.
  2. En Explorer pasa el ratón sobre Workspace, haz clic en + y añade un Folder. Llámalo Path.
  3. Añade un segundo Folder a Workspace y llámalo Enemies. Déjalo vacío. Los enemigos aparecerán dentro de él durante el juego.

Más detalles

  • La plantilla Baseplate está en la lista de plantillas de la pantalla de inicio.
  • Cuando haces clic en +, escribe la palabra Folder para encontrarla rápido. Cambia el nombre de una carpeta con F2.
  • Los nombres deben ser exactamente Path y Enemies, con la primera letra en mayúscula. Los scripts buscan esos nombres.
  • En un Mac, usa la tecla Cmd cada vez que esta guía diga Ctrl.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

2
Paso 2 / 8

Construye el camino

  1. Añade una Part. Pon Size en 6, 1, 6, activa Anchored y arrástrala dentro del Folder Path. Llámala 1.
  2. Duplícala con Ctrl+D y mueve la copia unos 30 studs más lejos. Llámala 2.
  3. Repite hasta tener 5 Parts llamadas 1, 2, 3, 4 y 5. Colócalas para que la ruta tenga algunas curvas.
  4. Los enemigos irán de la 1 a la 2, a la 3 y así sucesivamente, en línea recta entre cada pareja.

Más detalles

  • Para meter una pieza en la carpeta, arrastra su nombre en Explorer hasta el nombre Path.
  • Una copia hecha con Ctrl+D ya está dentro de la carpeta Path. Solo tienes que moverla y cambiarle el nombre.
  • Los nombres son solo los números: 1, 2, 3, 4, 5. Sin letras y sin espacios.
  • Deja las piezas tumbadas en el suelo. Los enemigos flotan 2 studs por encima de ellas.
Error común. Saltarte un número. Si falta la Part 3, los enemigos se detienen en la Part 2 y el script muestra un error.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

3
Paso 3 / 8

Crea el enemigo

  1. Añade una Part. Pon Shape en Ball y Size en 3, 3, 3, y hazla roja. Activa Anchored, desactiva CanCollide y llámala Enemy.
  2. Pasa el ratón sobre Enemy, haz clic en + y añade un IntValue. Llámalo Health y pon su Value en 3.
  3. Arrastra Enemy hasta ServerStorage. Ahora es una plantilla. El juego hará copias de ella.

Más detalles

  • Shape es una lista de Properties. Haz clic en ella y elige Ball.
  • CanCollide es una casilla de Properties. Sin la marca, los jugadores y las demás piezas atraviesan al enemigo.
  • Cuando haces clic en +, escribe IntValue para encontrarlo. Haz clic en el IntValue nuevo y luego cambia Name a Health y Value a 3 en Properties.
  • Después de arrastrar Enemy a ServerStorage, desaparece del Viewport. Eso es correcto.
Consejo. El enemigo tiene Anchored activado porque un script lo mueve. Las Parts con Anchored ignoran la gravedad y los empujones.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

4
Paso 4 / 8

Construye la base

  1. Añade una Part grande al final del camino, junto a la Part 5. Activa Anchored y llámala Base.
  2. Pasa el ratón sobre Base, haz clic en + y añade un IntValue. Llámalo Health y pon su Value en 10.
  3. Añade un BillboardGui a Base con Size {0, 200}, {0, 50} y StudsOffset 0, 8, 0. Añade dentro un TextLabel con Size {1, 0}, {1, 0} y TextScaled activado.
  4. Añade un Script a Base y pega 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()

Qué hace cada parte

  • Changed se ejecuta cada vez que cambia el valor de Health.
  • La función update escribe el número nuevo en la etiqueta que está sobre la base.
  • Cuando Health llega a 0, la etiqueta muestra Game over y el script Waves deja de enviar enemigos.

Más detalles

  • Un tamaño de 10, 10, 10 es una buena base. Cualquier color sirve.
  • El Health de la base es un objeto distinto del Health del enemigo. Cada uno está dentro de su propia pieza.
  • Para Size y StudsOffset, escribe los números exactamente como se muestran, con los paréntesis y las comas, y pulsa Enter.
  • Para probar: pulsa F5. La etiqueta que está encima de la base muestra Base: 10.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

5
Paso 5 / 8

Envía las oleadas

  1. Pasa el ratón sobre ServerScriptService, haz clic en + y añade un Script. Llámalo Waves.
  2. Borra la línea que ya está y pega este código.
  3. Pulsa Play. Cada 3 segundos aparece una bola roja en la Part 1 y avanza por el camino. Cuando llega al final, la base pierde 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

Qué hace cada parte

  • Clone hace una copia de la plantilla Enemy que está en ServerStorage.
  • La función walk mueve al enemigo a cada Part del camino en orden. distance / SPEED mantiene la misma velocidad en tramos largos y cortos.
  • task.spawn deja que cada enemigo camine por su cuenta, así el bucle puede seguir enviando nuevos.

Más detalles

  • El script se abre en una pestaña nueva. Haz clic dentro del código, pulsa Ctrl+A y luego Ctrl+V para reemplazarlo todo.
  • Los enemigos aparecen dentro de la carpeta Enemies mientras el juego está en marcha. Puedes verlos en Explorer.
  • Sin ninguna torre todavía, todos los enemigos llegan a la base. Después de 10 enemigos, la etiqueta muestra Game over y ya no viene ningún enemigo más.
  • Si Output muestra texto rojo sobre un nombre que falta, es que una pieza del camino o una carpeta tiene el nombre equivocado.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

6
Paso 6 / 8

Construye la torre

  1. Añade una Part cerca de una curva del camino. Pon Size en 4, 8, 4, activa Anchored y llámala Tower.
  2. Añade un Script a Tower y pega este código.
  3. Pulsa Play. Una vez por segundo la torre golpea al enemigo más cercano que esté en alcance. El enemigo parpadea en blanco y, tras 3 golpes, desaparece.
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

Qué hace cada parte

  • El bucle mide la distancia de la torre a cada enemigo y recuerda el más cercano.
  • RANGE es hasta dónde llega la torre. DAMAGE es cuánta vida quita un golpe.
  • Cuando Health llega a 0, Destroy quita al enemigo.

Más detalles

  • Pon la torre a entre 8 y 12 studs del camino. El alcance es de 25 studs en todas las direcciones.
  • Una torre tarda 3 segundos en eliminar a un enemigo, y llega un enemigo nuevo cada 3 segundos. Así que una sola torre solo puede frenar el camino si los enemigos se quedan en su alcance el tiempo suficiente.
  • El destello blanco dura una décima de segundo. Mira con atención para verlo.
  • Para una segunda torre, selecciona Tower y pulsa Ctrl+D, y luego mueve la copia. El script viene con ella.
Consejo. Una torre funciona mejor junto a una curva, porque allí los enemigos pasan más tiempo en su alcance.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

7
Paso 7 / 8

Prueba y equilibra

  1. Pulsa F5 y mira unas cuantas oleadas.
  2. Si ningún enemigo llega nunca a la base, el juego es muy fácil. Si la base pierde toda su vida rápido, es muy difícil.
  3. Equilíbralo con tres números: el tiempo de espera en Waves, el valor Health del enemigo y el DAMAGE de la torre.
  4. Pulsa Shift+F5 para parar. Si algo falla, abre la ventana Output desde el menú Window y lee el texto rojo.

Más detalles

  • Cambia solo un número cada vez y luego vuelve a jugar. Si no, no sabes qué cambio ayudó.
  • El tiempo de espera es el número de task.wait(3) cerca del final del script Waves. Un número menor envía a los enemigos más rápido.
  • El Health del enemigo está en ServerStorage, dentro de Enemy. El DAMAGE de la torre está al principio del script Tower.
  • Un buen primer objetivo: que la base aguante dos minutos con dos torres.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

8
Paso 8 / 8

Publícalo

  1. Elige File → Publish to Roblox. Ponle un nombre y una descripción corta al juego.
  2. En el sitio web Creator Hub abre tu juego y responde el cuestionario de Maturity.
  3. Pon el juego en Public y envía el enlace a un amigo.

Más detalles

  • La primera vez que publicas, Studio te pide un nombre y una descripción. Haz clic en Create.
  • Creator Hub es el sitio web create.roblox.com. Inicia sesión con la misma cuenta y haz clic en tu juego en la lista.
  • Puede que Roblox te pida más cosas antes de que un juego pueda ser público, por ejemplo una verificación de edad de la cuenta. La página te dice qué falta.
  • Si tienes menos de 18 años, haz este paso junto con tu madre, tu padre o un tutor.
Consejo. Muéstrale el juego a un amigo y hazle una pregunta: ¿fue muy fácil o muy difícil? Luego cambia un número y prueba otra vez.
Este paso no me funciona

Revisa primero estas tres cosas

  • El nombre de cada Part y de cada Script es exactamente igual al de la guía, con las mismas mayúsculas.
  • El Script está dentro del objeto correcto. Mira la etiqueta que hay encima del cuadro de código.
  • Abre la ventana Output desde el menú Window. El texto en rojo te dice qué script y qué línea tienen el problema.

¿Sigues atascado? Escríbenos →

Ahora cámbialo tú

  • Añade una segunda torre con poco alcance y DAMAGE 2.
  • Haz que las oleadas se aceleren con el tiempo. Pista: guarda el tiempo de espera en una variable y hazlo un poco más pequeño después de cada enemigo.
  • Dale 20 de vida a la base y haz que cada enemigo quite 2.