Roblox jump pad script (bounce pad)

Step on the pad, fly up. One LocalScript handles every jump pad in your game, each pad can have its own power, and tilting a pad turns it into a launch pad.

LocalScriptUpdated November 9, 2026

Where to put it

LocalScript — StarterPlayer > StarterCharacterScripts > JumpPads (LocalScript). It runs on each player's device.

  1. Make the pad: an anchored, flat Part (a bright neon color helps players see it).
  2. Select the pad, open Properties → Tags and add the tag JumpPad. Every pad with this tag works; copy it as many times as you like.
  3. Optional: add a Number attribute named Power to a pad to change how high it throws (the default is 120).
  4. Insert a LocalScript into StarterPlayer → StarterCharacterScripts and paste the code.

The script

StarterPlayer > StarterCharacterScripts > JumpPads (LocalScript)
local CollectionService = game:GetService("CollectionService")

local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local root = character:WaitForChild("HumanoidRootPart")

local DEFAULT_POWER = 120 -- upward speed in studs per second
local COOLDOWN = 0.5
local lastLaunch = 0

local function launch(pad)
	if humanoid.Health <= 0 then
		return
	end
	local now = os.clock()
	if now - lastLaunch < COOLDOWN then
		return
	end
	lastLaunch = now

	local power = pad:GetAttribute("Power") or DEFAULT_POWER
	local velocity = root.AssemblyLinearVelocity
	-- Keep the player's sideways speed, replace the up/down speed.
	root.AssemblyLinearVelocity = Vector3.new(velocity.X, power, velocity.Z)
end

local function connectPad(pad)
	if not pad:IsA("BasePart") then
		return
	end
	pad.Touched:Connect(function(hit)
		if hit:IsDescendantOf(character) then
			launch(pad)
		end
	end)
end

for _, pad in CollectionService:GetTagged("JumpPad") do
	connectPad(pad)
end
-- Pads added later (or streamed in) work too.
CollectionService:GetInstanceAddedSignal("JumpPad"):Connect(connectPad)

How it works

  • Each player's device moves their own character, so the launch is done in a LocalScript: it reacts instantly and never lags. A server script that sets the speed of a player's character often has no effect, because the player's device keeps overwriting it.
  • Tags let one script serve every pad: GetTagged finds the pads that already exist and GetInstanceAddedSignal catches new ones, including pads that load in later with streaming turned on.
  • The script only replaces the vertical speed, so a running player keeps their momentum and flies forward in an arc.
  • The short cooldown stops one landing from triggering the pad several times in a row.

Variations

Launch pad in any direction

Tilt the pad and launch the player along the direction its top face points. A pad tilted 45° forward throws players across a gap.

-- Replace the last two lines of launch() with:
root.AssemblyLinearVelocity = pad.CFrame.UpVector * power

Speed pad

Tag a pad SpeedPad and give a short burst of speed instead of height. Use a second LocalScript in StarterCharacterScripts.

local CollectionService = game:GetService("CollectionService")

local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")

local BOOST_SPEED = 40
local BOOST_SECONDS = 3
local normalSpeed = humanoid.WalkSpeed
local boostId = 0

local function boost()
	boostId += 1
	local myId = boostId
	humanoid.WalkSpeed = BOOST_SPEED
	task.delay(BOOST_SECONDS, function()
		if boostId == myId then -- a newer boost resets the timer
			humanoid.WalkSpeed = normalSpeed
		end
	end)
end

local function connectPad(pad)
	if pad:IsA("BasePart") then
		pad.Touched:Connect(function(hit)
			if hit:IsDescendantOf(character) then
				boost()
			end
		end)
	end
end

for _, pad in CollectionService:GetTagged("SpeedPad") do
	connectPad(pad)
end
CollectionService:GetInstanceAddedSignal("SpeedPad"):Connect(connectPad)

Bounce sound and effect

Put a Sound named Boing inside the pad and play it in launch() with local sound = pad:FindFirstChild("Boing") if sound then sound:Play() end. The sound plays only for the player who jumped; play it from the server if everyone should hear it.

Common mistakes

  • Setting the velocity from a server Script: the player's device owns their character's physics, so the server's change is often ignored and the pad works only sometimes.
  • Using the old BodyVelocity or BodyForce: they are deprecated. Setting AssemblyLinearVelocity once is enough for a jump pad.
  • Putting the LocalScript in StarterPlayerScripts and referencing script.Parent as the character — it isn't. StarterCharacterScripts is the folder that gets copied into each character.
  • A pad that is not anchored falls through the map or gets pushed around when players land on it.
  • Using a jump pad to award coins or progress: anything that matters for money or ranking must be checked on the server.

FAQ

How do I make a jump pad in Roblox Studio?

Add an anchored part, give it the tag JumpPad in Properties → Tags, and put the LocalScript from this page in StarterPlayer → StarterCharacterScripts. Touching the pad sets the player's upward speed.

How do I make the jump pad higher?

Raise DEFAULT_POWER in the script, or add a Number attribute named Power to one pad to change only that pad. 120 throws a default character roughly 30–40 studs up with normal gravity.

Why does my jump pad only work sometimes?

Usually because the speed is set from a server Script while the player's device controls their character. Set it in a LocalScript, as on this page.

Does the jump pad work on mobile?

Yes. It reacts to touching the pad, not to a key, so it works the same on phones, tablets, consoles and computers.

Keep reading