Here’s the same thing (more or less) in C++ with a consideration for having the location at the end point.
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Spline")
static float UUtilities::FindDistanceAlongSplineClosestToLocation(const USplineComponent* Spline, const FVector& Location)
{
float InputKey = Spline->FindInputKeyClosestToWorldLocation(Location);
int32 SplinePoint = FMath::TruncToInt(InputKey);
float SplinePointDistance = Spline->GetDistanceAlongSplineAtSplinePoint(SplinePoint);
if (SplinePoint < Spline->GetNumberOfSplinePoints())
{
float NextPointDistance = Spline->GetDistanceAlongSplineAtSplinePoint(SplinePoint + 1);
return FMath::Lerp(SplinePointDistance, NextPointDistance, InputKey - SplinePoint);
}
else
{
float PrevPointDistance = Spline->GetDistanceAlongSplineAtSplinePoint(SplinePoint - 1);
return FMath::Lerp(PrevPointDistance, SplinePointDistance, SplinePoint - InputKey);
}
}