void Start() { limitersNum = (int)Mathf.Floor(1 / timeBetweenLimiters); limiters = new GameObject[path.anchor.Count * limitersNum * 2]; for (int a = 0; a < path.anchor.Count; a++) { float t = 0; for (int i = 0; i < limitersNum; i++) { Vector3 pos = Bezier.Cubic(path.anchor[a], path.following[a], path.previous[path.LoopIndex(a + 1)], path.anchor[path.LoopIndex(a + 1)], t); Vector3 dir = (Bezier.Cubic(path.anchor[a], path.following[a], path.previous[path.LoopIndex(a + 1)], path.anchor[path.LoopIndex(a + 1)], t + .01f) - pos).normalized; limiters[a * limitersNum + i] = Instantiate(circuitLimiter, pos + new Vector3(-dir.z, 0, dir.x) * width, Quaternion.identity); limiters[path.anchor.Count * limitersNum + a * limitersNum + i] = Instantiate(circuitLimiter, pos + new Vector3(dir.z, 0, -dir.x) * width, Quaternion.identity); limiters[a * limitersNum + i].GetComponent <KeepPosition>().PositionToMaintain = pos + new Vector3(-dir.z, 0, dir.x) * width; limiters[path.anchor.Count * limitersNum + a * limitersNum + i].GetComponent <KeepPosition>().PositionToMaintain = pos + new Vector3(dir.z, 0, -dir.x) * width; t += timeBetweenLimiters; } } }
// 计算平均分割曲线的点 public Vector2[] CalEvenSpacedPoints(float spacing, float resolution = 1) { List <Vector2> evenlySpacedPoints = new List <Vector2>(); evenlySpacedPoints.Add(points[0]); Vector2 previousPoint = points[0]; float dstSinceLastEvenPoint = 0; for (int segmentIndex = 0; segmentIndex < NumSegments; segmentIndex++) { Vector2[] p = GetPointsInSegment(segmentIndex); float controlNetLength = Vector2.Distance(p[0], p[1]) + Vector2.Distance(p[1], p[2]) + Vector2.Distance(p[2], p[3]); float estimatedCurveLength = Vector2.Distance(p[0], p[3]) + controlNetLength / 2f; int divisions = Mathf.CeilToInt(estimatedCurveLength * resolution * 10); float t = 0; while (t <= 1) { t += 1f / divisions; Vector2 pointOnCurve = Bezier.Cubic(p[0], p[1], p[2], p[3], t); dstSinceLastEvenPoint += Vector2.Distance(previousPoint, pointOnCurve); while (dstSinceLastEvenPoint >= spacing) { float overshootDst = dstSinceLastEvenPoint - spacing; Vector2 newEvenlySpacedPoint = pointOnCurve + (previousPoint - pointOnCurve).normalized * overshootDst; evenlySpacedPoints.Add(newEvenlySpacedPoint); dstSinceLastEvenPoint = overshootDst; previousPoint = newEvenlySpacedPoint; } previousPoint = pointOnCurve; } } return(evenlySpacedPoints.ToArray()); }