public SplineMesh.CurveSample ClosestTrackSample(SplineMesh.Spline track) { int segmentA = raceController.GetTrackSegment(CarInfo?.name); int segmentB = -1; if (segmentA < 0) { segmentA = 0; segmentB = raceController.GetNumSegments(); } else { segmentB = raceController.NextSegment(segmentA); } float begin = Math.Max(0, raceController.TrackDistanceAtSegment(segmentA)); float end = Math.Max(0, raceController.TrackDistanceAtSegment(segmentB)); var closest = track.GetSampleAtDistance(begin); float closestDistance = float.MaxValue; for (float i = begin; i < end; i += 0.05f) { var curveSample = track.GetSampleAtDistance(i); var d = (gameObject.transform.position - 0.048f * Vector3.up - curveSample.location); d.y *= 10; var distance = d.magnitude; if (distance < closestDistance) { closestDistance = distance; closest = curveSample; } } return(closest); }