private Vector3 GetCurvePoint(float distance, bool updateMapIndex) { int index = curveDistanceMapIndex; float segmentDistance = platformObject.curveIndexDistanceMap[index]; if (distance > segmentDistance && index < platformObject.curveIndexDistanceMap.Count - 1) { index++; if (updateMapIndex) { curveDistanceMapIndex = index; } } float time = 0; if (index > 0) { float prevDistance = platformObject.curveIndexDistanceMap[index - 1]; time = (distance - prevDistance) / (platformObject.curveIndexDistanceMap[index] - prevDistance); } else { time = distance / platformObject.curveIndexDistanceMap[index]; } time = Mathf.Clamp01(time); Vector3 p0, p1, p2; if (index == 0) { p0 = platformObject.controlPoints[index]; } else { p0 = (platformObject.controlPoints[index] + platformObject.controlPoints[index + 1]) / 2; } p1 = platformObject.controlPoints[index + 1]; if (index + 2 == platformObject.controlPoints.Count - 1) { p2 = platformObject.controlPoints[index + 2]; } else { p2 = (platformObject.controlPoints[index + 1] + platformObject.controlPoints[index + 2]) / 2; } return(platformObject.GetTransform().TransformPoint(InfiniteRunnerStarterPackUtility.CalculateBezierPoint(p0, p1, p2, time))); }
private void ComputeBezierCurve(bool draw /*if false, will compute length*/) { PlatformObject platformObject = (PlatformObject)target; if (platformObject.controlPoints == null || platformObject.controlPoints.Count < 3) { platformObject.curveLength = 0; EditorUtility.SetDirty(target); return; } if (!draw) { platformObject.curveIndexDistanceMap = new List <float>(); } Vector3 p0, p1, p2; Vector3 q0, q1; float t; float length = 0; Handles.color = Color.white; Vector3 platformPosition = platformObject.transform.position; for (int i = 0; i < platformObject.controlPoints.Count - 2; ++i) { if (i == 0) { p0 = platformObject.controlPoints[i]; } else { p0 = (platformObject.controlPoints[i] + platformObject.controlPoints[i + 1]) / 2; } p1 = platformObject.controlPoints[i + 1]; if (i + 2 == platformObject.controlPoints.Count - 1) { p2 = platformObject.controlPoints[i + 2]; } else { p2 = (platformObject.controlPoints[i + 1] + platformObject.controlPoints[i + 2]) / 2; } t = 0; q0 = InfiniteRunnerStarterPackUtility.CalculateBezierPoint(p0, p1, p2, t); for (int j = 1; j <= StepCount; j++) { t = j / (float)StepCount; q1 = InfiniteRunnerStarterPackUtility.CalculateBezierPoint(p0, p1, p2, t); if (draw) { Handles.DrawLine(platformPosition + q0, platformPosition + q1); } else { length += Vector3.Distance(q0, q1); } q0 = q1; } if (!draw) { platformObject.curveIndexDistanceMap.Add(length); } } if (!draw) { platformObject.curveLength = length; EditorUtility.SetDirty(target); } }