Cómo hacer plataformas que desaparecen al pisarlas

Claim Your Loot

·

Diagrama de los cuatro estados: esperando, avisando, desaparecida y volviendo

Es la mecánica que sostiene medio Roblox: pisas, la plataforma parpadea, se desvanece y te caes si no has saltado a tiempo. Obstáculos, torres, minijuegos de eliminación.

Y es engañosamente fácil de hacer mal: la versión que encuentras por ahí deja plataformas atascadas invisibles, o hace que se caigan cinco jugadores cuando solo pisó uno. Aquí tienes la buena, y una demo donde puedes ajustar los tiempos y pisarlas.

Respuesta rápida

Al tocarla: avisa (cambia el color), espera, hazla transparente y sin colisión (CanCollide = false), espera otro poco y devuélvela a su estado. Todo con una bandera para que un segundo toque no lance el proceso dos veces.

Lo que necesitas antes de empezar

  • Un Part Anchored que haga de plataforma.
  • Un Script normal dentro.
  • Unos 20 minutos.

Los cuatro estados

Una plataforma que desaparece bien pasa siempre por lo mismo:

EstadoQué ve el jugadorCuánto dura
1. EsperandoSólida, color normalHasta que la pisan
2. AvisandoCambia de color, quizá parpadea0,5-1 s
3. DesaparecidaInvisible y se atraviesa2-4 s
4. VolviendoReapareceInstantáneo o con fundido

El estado 2 es el que separa una mecánica justa de una injusta. Sin aviso, el jugador se cae sin entender por qué y abandona.

Los cuatro estados de una plataforma que desaparece

Paso 1: la versión completa

-- Script DENTRO del Part de la plataforma
local plataforma = script.Parent

local AVISO      = 0.6   -- segundos desde que la pisas hasta que se va
local FUERA      = 3     -- segundos que está desaparecida
local COLOR_AVISO = Color3.fromRGB(230, 90, 70)

-- Guardamos el estado original para poder devolverla igual
local colorOriginal = plataforma.Color
local transpOriginal = plataforma.Transparency

local activada = false

plataforma.Touched:Connect(function(otro)
	if activada then return end   -- ya está en marcha, ignoramos

	-- ¿Ha sido un jugador?
	local humanoide = otro.Parent and otro.Parent:FindFirstChildOfClass("Humanoid")
	if not humanoide then return end

	activada = true

	-- Estado 2: avisar
	plataforma.Color = COLOR_AVISO
	task.wait(AVISO)

	-- Estado 3: desaparecer
	plataforma.CanCollide = false
	plataforma.Transparency = 1
	task.wait(FUERA)

	-- Estado 4: volver
	plataforma.CanCollide = true
	plataforma.Transparency = transpOriginal
	plataforma.Color = colorOriginal
	activada = false
end)

La bandera activada es lo más importante del script. Sin ella, cada parte del cuerpo que roce la plataforma arranca su propio proceso, y acabas con cuatro cuentas atrás pisándose: la plataforma reaparece mientras otra cuenta la está haciendo desaparecer y se queda invisible para siempre.

CanCollide = false antes que Transparency = 1 no es casualidad: así el jugador empieza a caer justo cuando la ve irse, y no medio segundo después.

Paso 2: que parpadee antes de irse

El aviso queda mucho mejor si parpadea, y son cuatro líneas:

	-- Estado 2: parpadeo de aviso
	for i = 1, 3 do
		plataforma.Color = COLOR_AVISO
		task.wait(AVISO / 6)
		plataforma.Color = colorOriginal
		task.wait(AVISO / 6)
	end

Dividir entre 6 hace que los tres parpadeos ocupen exactamente el tiempo de aviso que hayas puesto: si cambias AVISO, no tienes que tocar nada más.

Paso 3: fundido en vez de corte seco

Con TweenService desaparece con suavidad:

local TweenService = game:GetService("TweenService")

-- Estado 3, con fundido de 0,3 s
plataforma.CanCollide = false
TweenService:Create(plataforma, TweenInfo.new(0.3), {Transparency = 1}):Play()
task.wait(FUERA)

-- Estado 4, reaparece con fundido
TweenService:Create(plataforma, TweenInfo.new(0.3), {Transparency = transpOriginal}):Play()
task.wait(0.3)
plataforma.CanCollide = true

Fíjate en que al volver se activa la colisión después del fundido: si la activas antes, un jugador que esté cayendo por ahí choca con una plataforma que todavía no se ve.

Comparación de una plataforma con y sin bandera de control

Paso 4: aplicarlo a muchas de golpe

No vas a meter el script en cincuenta plataformas a mano. Mételas todas en una carpeta llamada Plataformas y usa un solo script:

-- Script en ServerScriptService
local carpeta = workspace:WaitForChild("Plataformas")

local AVISO, FUERA = 0.6, 3
local COLOR_AVISO = Color3.fromRGB(230, 90, 70)

local function preparar(plataforma)
	local colorOriginal = plataforma.Color
	local transpOriginal = plataforma.Transparency
	local activada = false

	plataforma.Touched:Connect(function(otro)
		if activada then return end
		if not (otro.Parent and otro.Parent:FindFirstChildOfClass("Humanoid")) then return end
		activada = true

		plataforma.Color = COLOR_AVISO
		task.wait(AVISO)
		plataforma.CanCollide = false
		plataforma.Transparency = 1
		task.wait(FUERA)
		plataforma.CanCollide = true
		plataforma.Transparency = transpOriginal
		plataforma.Color = colorOriginal
		activada = false
	end)
end

for _, p in ipairs(carpeta:GetChildren()) do
	if p:IsA("BasePart") then
		preparar(p)
	end
end

-- Si añades plataformas durante la partida, también quedan preparadas
carpeta.ChildAdded:Connect(function(p)
	if p:IsA("BasePart") then preparar(p) end
end)

Cada plataforma tiene su propia variable activada porque está dentro de la función. Esa es toda la gracia: si la sacaras fuera, pisar una desactivaría todas.

Pruébalo aquí

Písalas y mira los cuatro estados

Ajusta los tiempos y pulsa cualquier plataforma. Cada una lleva su propio ciclo, como en el script.

Cada plataforma tiene su propio estado. Pisar una no afecta a las demás.

Errores habituales

Una plataforma se queda invisible para siempre

Es la falta de la bandera activada. Dos toques solapados y el segundo proceso la devuelve a visible antes de que el primero la vuelva a esconder, dejándola descuadrada.

Se activan todas a la vez

Tienes activada como variable global en vez de una por plataforma. El paso 4 lo resuelve metiéndola dentro de la función.

Se activa cuando le tiro algo encima

Falta el filtro del Humanoid.

El jugador la atraviesa antes de que desaparezca

Estás poniendo Transparency = 1 antes de tiempo, o tienes CanCollide ya desactivado de antes en las propiedades del Part.

Al reaparecer, el jugador se queda dentro de la plataforma

Le pasa a quien esté justo en ese punto. Se soluciona reapareciendo solo si no hay nadie encima, con GetPartBoundsInBox, o dejando el FUERA lo bastante largo.

Preguntas frecuentes

¿Qué tiempos van bien?

Para un parkour normal, 0,5 s de aviso y 3 s fuera. Si quieres que sea difícil, baja el aviso a 0,2. Prueba en la demo hasta que te parezca justo.

¿Puedo hacer que no vuelvan nunca?

Sí: quita el estado 4 y no reactives la bandera. Va bien para torres de un solo intento.

¿Se puede hacer desde el cliente para que vaya más fino?

El efecto visual sí, pero la colisión tiene que ser del servidor. Si dejas que el cliente decida cuándo puede atravesar, ya sabes lo que pasa.

¿Cómo hago que se caiga en vez de desaparecer?

Quítale el Anchored en el momento del estado 3 en lugar de hacerla invisible: la física se encarga. Acuérdate de devolverla a su sitio con su CFrame original al reaparecer.


Última revisión: 1 de septiembre de 2026

Claim Your Loot

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *