Cómo hacer una plataforma de salto en Roblox Studio

Claim Your Loot

·

Comparación del arco de salto con fuerza 50, 100 y 200 en Roblox

Quieres una plataforma que lance al jugador por los aires: para un parkour, para llegar a una zona alta, o simplemente porque es divertido. Es de las primeras cosas que apetece hacer y de las que peor explicadas están: la mitad de los tutoriales usan métodos que dan tirones o que se saltan desde el cliente.

Aquí tienes las dos formas que funcionan, cuándo usar cada una, y una demo donde puedes mover la fuerza y ver el salto en vivo.

Respuesta rápida

Para un impulso vertical limpio, cambia la velocidad del personaje de golpe:

humanoidRootPart.AssemblyLinearVelocity = Vector3.new(0, 100, 0)

Y si quieres que además salga disparado hacia delante, súmale la dirección. Nada de BodyVelocity: está obsoleto.

Lo que necesitas antes de empezar

  • Un Part en el Workspace llamado Trampolin, con Anchored marcado.
  • Un Script normal (no LocalScript) dentro de ese Part.
  • Unos 15 minutos.
Comparación del arco de salto con fuerza 50, 100 y 200 en Roblox

Paso 1: detectar que alguien la pisa

-- Script DENTRO del Part llamado Trampolin
local plataforma = script.Parent
local FUERZA = 100

plataforma.Touched:Connect(function(otro)
	-- otro es la parte que nos ha tocado: un pie, una mano, una caja...
	local personaje = otro.Parent
	local humanoide = personaje:FindFirstChildOfClass("Humanoid")
	if not humanoide then return end        -- no era un jugador
	if humanoide.Health <= 0 then return end -- estaba muerto

	local raiz = personaje:FindFirstChild("HumanoidRootPart")
	if not raiz then return end

	raiz.AssemblyLinearVelocity = Vector3.new(0, FUERZA, 0)
end)

Tres comprobaciones antes de tocar nada, y las tres importan:

  • FindFirstChildOfClass("Humanoid") filtra: si no lo pones, cualquier caja que ruede por encima «salta».
  • Health <= 0 evita lanzar cadáveres por los aires, que queda raro.
  • HumanoidRootPart es la parte que de verdad mueve al personaje. Empujar un pie no sirve.

Paso 2: el problema del Touched

Touched se dispara muchas veces. Un personaje tiene varias partes, y cada una que roce la plataforma lanza el evento. Sin control, el jugador recibe cinco impulsos en el mismo fotograma y sale despedido a la estratosfera.

La solución es un tiempo de espera por jugador:

local plataforma = script.Parent
local FUERZA = 100
local ESPERA = 1

local ultimoSalto = {}

plataforma.Touched:Connect(function(otro)
	local personaje = otro.Parent
	local humanoide = personaje:FindFirstChildOfClass("Humanoid")
	if not humanoide or humanoide.Health <= 0 then return end

	local jugador = game.Players:GetPlayerFromCharacter(personaje)
	if not jugador then return end

	local ahora = tick()
	if ultimoSalto[jugador] and ahora - ultimoSalto[jugador] < ESPERA then
		return
	end
	ultimoSalto[jugador] = ahora

	local raiz = personaje:FindFirstChild("HumanoidRootPart")
	if raiz then
		raiz.AssemblyLinearVelocity = Vector3.new(0, FUERZA, 0)
	end
end)

game.Players.PlayerRemoving:Connect(function(jugador)
	ultimoSalto[jugador] = nil
end)

Ese ultimoSalto[jugador] = nil al final no es cosmético: sin él, la tabla crece cada vez que entra alguien y nunca se vacía.

Las cuatro partes del personaje disparando cuatro eventos Touched

Paso 3: impulso en diagonal

Si quieres que además salga hacia delante, súmale la dirección en la que mira la plataforma:

local direccion = plataforma.CFrame.LookVector * 60   -- hacia donde apunta
raiz.AssemblyLinearVelocity = direccion + Vector3.new(0, FUERZA, 0)

LookVector es la dirección «hacia delante» del Part. Si giras la plataforma en Studio, el impulso gira con ella, sin tocar el código.

Paso 4: la otra forma, cambiar JumpPower

Lo de arriba es un empujón puntual. Si lo que quieres es que mientras esté en una zona el jugador salte más, lo que cambias es su capacidad de salto:

local zona = script.Parent

zona.Touched:Connect(function(otro)
	local h = otro.Parent:FindFirstChildOfClass("Humanoid")
	if h then h.JumpPower = 120 end
end)

zona.TouchEnded:Connect(function(otro)
	local h = otro.Parent:FindFirstChildOfClass("Humanoid")
	if h then h.JumpPower = 50 end   -- el valor normal
end)

Ojo con esto: desde hace unas versiones Roblox usa JumpHeight en vez de JumpPower según la propiedad UseJumpPower del Humanoid. Si JumpPower no te hace nada, es que tu juego está en modo altura: entonces la propiedad es JumpHeight y el número es en studs, no en fuerza.

Quieres…Usa
Un impulso puntual al pisarAssemblyLinearVelocity
Que salte más mientras esté en la zonaJumpPower o JumpHeight
Lanzarlo en una dirección concretaLookVector + velocidad

Paso 5: que se note

Un trampolín sin respuesta visual se siente roto. Con tres líneas más:

local sonido = plataforma:FindFirstChildOfClass("Sound")
if sonido then sonido:Play() end

-- pequeño achatamiento de la plataforma
local TweenService = game:GetService("TweenService")
local original = plataforma.Size
TweenService:Create(plataforma, TweenInfo.new(0.1), {Size = original * Vector3.new(1, 0.5, 1)}):Play()
task.delay(0.1, function()
	TweenService:Create(plataforma, TweenInfo.new(0.2), {Size = original}):Play()
end)

Si quieres entender bien esa parte, está en cómo mover objetos con TweenService.

Pruébalo aquí

Ajusta la fuerza del trampolín

La misma física que en Studio: un cambio de velocidad hacia arriba y la gravedad haciendo el resto.

El segundo botón simula lo que pasa cuando Touched se dispara cuatro veces sin tiempo de espera.

Errores habituales

El jugador sale disparado altísimo

Touched se está disparando varias veces. Pon el tiempo de espera del paso 2.

No pasa nada al pisar

Tres cosas, por orden: que el Script sea normal y no LocalScript, que esté dentro del Part, y que el Part tenga CanTouch activado (a veces se desactiva sin querer).

attempt to index nil with 'FindFirstChildOfClass'

Algo tocó la plataforma que no tiene padre, normalmente un efecto o un objeto que se estaba borrando. Añade if not otro.Parent then return end al principio.

Funciona con un jugador pero con dos se vuelve loco

Estás usando una sola variable para el tiempo de espera en vez de una tabla por jugador. El paso 2 lo resuelve.

El impulso funciona en Studio pero no publicado

Si lo lanzaste desde un LocalScript, el servidor no se entera y te corrige la posición. Ese código va en el servidor.

Preguntas frecuentes

¿Por qué no usar BodyVelocity?

Porque está obsoleto. Roblox lo mantiene por compatibilidad, pero lo recomendado hoy es AssemblyLinearVelocity para impulsos puntuales y los Constraints (como LinearVelocity) para fuerzas sostenidas.

¿Qué número pongo de fuerza?

Depende de la gravedad de tu juego. Con la de fábrica, 50 es un saltito, 100 un buen impulso y 200 te manda muy arriba. Ajústalo con la demo hasta que te guste.

¿Puedo hacer que solo funcione una vez por partida?

Sí: en vez de guardar la hora en la tabla, guarda true y no lo borres nunca.

¿Y para que empuje objetos, no jugadores?

Lo mismo pero sin el filtro del Humanoid: aplicas la velocidad directamente al Part que te tocó, si no está anclado.


Ú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 *