How to make a part that travels along a curved path at a constant speed? (Bezier curve)

Hello, the question is basically in the title. I want to make a part that travels along a curved path at a constant speed no matter the distance of p0 and p2. I tried searching the forum but couldn’t find any solution.

pls help :frowning:

You’ll need to use TweenService or lerping. Personally I use TweenService as it is much easier imo.
To start off, I assume you’re using a Bezier curve because you mentioned “p0 and p2”.
To travel along a Bezier curve, you’ll need a loop.
Firstly, create an empty “Model” inside the part. Then define the “parent” of the generated parts as “script.Parent.Model”.
After doing so, you’ll need to create a table where the parts will be put into, so that the system knows what part it should tween to. In this guide, it’ll be “local SystemPoints = {}”, but you can always name it to whatever you want.
Next, you need to put the parts from the model into that table. For that, you’ll need to define a variable and get the model’s children.
In this guide, it’ll be “local pointsChildren = script.Parent.Points:GetChildren()
Then create an advanced loop that inserts the children into the table through that variable. In this guide it’ll be:

for i, v in pairs(pointsChildren) do

Next, define your tween information. In this guide it’ll be:

        local tweenInfo =
		0.05, -- Time
		Enum.EasingStyle.Linear, -- EasingStyle
		Enum.EasingDirection.In, -- EasingDirection
		0, -- RepeatCount (when less than zero the tween will loop indefinitely)
		false, -- Reverses (tween will reverse once reaching it's goal)
		0 -- DelayTime

The time determines how fast it’ll tween from one part to the other. I recommend setting it to 0.05 or lower in this case, otherwise it’ll take a long time to tween.

Now you can get to tweening the part. For that, you’ll need to create a loop that’ll travel up the table to find the parts, and add their positions and orientations into a table, and then will play it. In this guide, it’ll be:

    for i = 1, #systemPoints do
	local Goal = {}
	Goal.Position = systemPoints[i].Position 
	Goal.Orientation = systemPoints[i].Orientation

	local tween = tweenService:Create(script.Parent,tweenInfo,Goal)

	tween.Completed:Wait() -- waits for the tween to be finished 

Pretty much that’s how I would do it. If you have any questions, feel free to ask.

1 Like