How to oscillate the y value during a position tween

Im trying to move an object from position ‘a’ to ‘b’ in x, z cordinates, I want the Y cordinate to remain the same as the original y value (when it reaches the end) , yet while the object is moving have the y value oscillate at the absolute value of sin(x) ( or something where it bounces up and down )

intended y result:

Im currently trying to tween the object yet since you cant tween twice at the same time I dont understand how I can correctly oscillate the y value

local cycleLength = 3 -- How long each cycle of the oscillation is
local oscillationRange = 3 -- Height of the oscillation

local start = os.clock()
    local y = math.abs(math.sin(start / cycleLength)) * oscillationRange
  • math.sin to get the sin value
  • math.abs to get the absolute sine value

Use this over the course of the animation or tween.

1 Like

You can’t do this easily with TweenService. Only straight line movement is supported. See this old topic for more info:

1 Like

I just ended up putting it in a for loop with the amount of bounces you want, with a tween that goes up half a bounce distance and then another tween that goes down the multiply by I for the next bounce and such
just realized I forgot to post the code

local TweenService = game:GetService("TweenService")

local part ="Part")

part.Position =, 0, 0)
part.Anchored = true
part.Parent = game.Workspace

local finalPoint =,0,150)
local goal = {}

local tweenInfoUp = -- 

local tweenInfoDown =
-- having two of these should I think handle the velocity it does really matter just adjust to your pleasure

local distance = math.sqrt(finalPoint.X^2 + finalPoint.Z^2) -- a^2 + b^2 = c^2 

local amountOfBounces = math.floor(distance/10) -- this is to sort out the use of bigger and smaller bounces only need if its a random point your bouncing between
-- otherwise you can set it to a number you want 
local distancePerBounce = finalPoint/amountOfBounces

print(part.Name .. " is travelling " .. distance .. " Studs In " .. amountOfBounces .. " Bounces")
for i = 1, amountOfBounces do
	goal.Position = i*distancePerBounce -,-5,distancePerBounce.Z/2)
	local tweenUp = TweenService:Create(part, tweenInfoUp, goal)

	goal.Position = i*distancePerBounce 
	local TweenDown = TweenService:Create(part,tweenInfoDown, goal)