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
Scriptnormal (no LocalScript) dentro de ese Part. - Unos 15 minutos.

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 <= 0evita lanzar cadáveres por los aires, que queda raro.HumanoidRootPartes 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.

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 pisar | AssemblyLinearVelocity |
| Que salte más mientras esté en la zona | JumpPower o JumpHeight |
| Lanzarlo en una dirección concreta | LookVector + 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.
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




Deja una respuesta