I’m using this one:
float ASomething::GetDistanceAlongSplineAtWorldLocation(const USplineComponent* InSpline, const FVector InWorldLocation)
{
if (!InSpline)
return 0.f;
auto InputKeyFloat = InSpline->FindInputKeyClosestToWorldLocation(InWorldLocation);
auto InputKey = FMath::TruncToInt(InputKeyFloat);
auto A = InSpline->GetDistanceAlongSplineAtSplinePoint(InputKey);
auto B = InSpline->GetDistanceAlongSplineAtSplinePoint(InputKey + 1);
return A + ((B - A) * (InputKeyFloat - InputKey));
}
Seems to work pretty well.