local distanceThreshold = 1e-2
local speed = -- how many studs per second
RunService.Heartbeat:Connect(function(deltaTime)
local vectorFromCurrentPositionToGoal = goalPosition - partToMove.Position
if vectorFromCurrentPositionToGoal.Magnitude < distanceThreshold then
-- preventing division by a very small number when calculating the unit vector
return
end
partToMove.Position += vectorFromCurrentPositionToGoal.Unit * math.min(speed * deltaTime, vectorFromCurrentPositionToGoal.Magnitude)
end)
Edit: Here’s an alternative. Both should behave in the same way.
local distanceThreshold = 1e-2
local speed = -- how many studs per second
RunService.Heartbeat:Connect(function(deltaTime)
local vectorFromCurrentPositionToGoal = goalPosition - partToMove.Position
if vectorFromCurrentPositionToGoal.Magnitude < distanceThreshold then
-- preventing division by a very small number when calculating lerp alpha.
return
end
partToMove.Position = partToMove.Position:Lerp(goalPosition, math.min(speed * deltaTime / vectorFromCurrentPositionToGoal.Magnitude, 1)
end)