All above answers assume spline segments are straight lines which can lead to meters of error on curved splines. I suggest a binary search instead where any precision can be achieved depending on the number of iterations.
float SplineUtils::GetApproxDistanceClosestToWorldLocation(FVector Pos_WS, const USplineComponent& Spline)
{
const auto TargetInputKey = Spline.FindInputKeyClosestToWorldLocation(Pos_WS);
const auto PointIdx = static_cast<int32>(TargetInputKey);
auto LowDistBound_cm = Spline.GetDistanceAlongSplineAtSplinePoint(PointIdx);
auto HighDistBound_cm = Spline.GetDistanceAlongSplineAtSplinePoint(PointIdx + 1);
auto MiddleDistEstimate_cm = (LowDistBound_cm + HighDistBound_cm) * 0.5f;
const auto& DistanceToInputMapping = Spline.SplineCurves.ReparamTable;
for (auto IterCount = 0; IterCount < 10; ++IterCount)
{
const auto MiddleInputKey = DistanceToInputMapping.Eval(MiddleDistEstimate_cm);
if (TargetInputKey < MiddleInputKey) {
HighDistBound_cm = MiddleDistEstimate_cm;
} else {
LowDistBound_cm = MiddleDistEstimate_cm;
}
MiddleDistEstimate_cm = (LowDistBound_cm + HighDistBound_cm) * 0.5f;
}
return MiddleDistEstimate_cm;
}