More efficient way to tween / lerp towards constant-moving goal?

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)
2 Likes