public static Spline GeneratePath(Vector3 start, Vector3 finish, int numPasses = 1, float curveSpreadX = 0.5f, float curveSpreadY = 0.5f) { Vector3[] primaryCurvePoints = new Vector3[2]; primaryCurvePoints [0] = start; primaryCurvePoints [1] = finish; Spline curve = new Spline(primaryCurvePoints); float length = Vector3.Distance(start, finish); if (length == 0f) { return(curve); } Vector3 pathNormalized = finish - start; pathNormalized /= length; float rightDot = Mathf.Abs(Vector3.Dot(pathNormalized, Vector3.right)); float upDot = Mathf.Abs(Vector3.Dot(pathNormalized, Vector3.up)); Vector3 rVec = rightDot < upDot ? Vector3.right : Vector3.up; Vector3 fVec = Vector3.Cross(pathNormalized, rVec); int midPoints = 0; for (int i = 0; i < numPasses; i++) { midPoints += (midPoints + 1); int totalPoints = midPoints + 2; Vector3[] newPoints = new Vector3[totalPoints]; newPoints [0] = start; newPoints [newPoints.Length - 1] = finish; float segmentSize = length / (float)(midPoints + 1); Vector2 primaryCurveSpread = new Vector2(segmentSize * curveSpreadX, segmentSize * curveSpreadY); for (int j = 1; j < newPoints.Length - 1; j++) { float pct = j / (float)(newPoints.Length - 1); Vector3 centerPoint = curve.Evaluate(pct); centerPoint += rVec * Random.Range(-primaryCurveSpread.x, primaryCurveSpread.x); centerPoint += fVec * Random.Range(-primaryCurveSpread.y, primaryCurveSpread.y);; newPoints [j] = centerPoint; } curve = new Spline(newPoints); curve.tension = 0.5f; } return(curve); }
void SetPoints() { if (pointList.Count == 0) { Debug.LogError("pointList should never have zero points!"); return; } if (pointList.Count == 1) { lr.positionCount = 2; lr.SetPosition(0, pointList.First.Value); lr.SetPosition(1, transform.position); } lr.enabled = pointList.Count > 1; if (!lr.enabled) { return; } Vector3[] pList = new Vector3[pointList.Count + 1]; pList [pointList.Count] = transform.position; Vector3 prevPos = transform.position; LinkedListNode <Vector3> lln = pointList.First; int index = 0; do { if (parentObj != null) { lln.Value += parentObj.transform.forward.normalized * idleSpeed; } pList [index] = lln.Value; prevPos = lln.Value; index++; lln = lln.Next; } while (lln != null); if (splinePrecision <= 1) { lr.positionCount = pList.Length; lr.SetPositions(pList); } else { Slonersoft.Spline sp = new Slonersoft.Spline(pList); sp.tension = 0.4f; int totalPoints = (splinePrecision * pList.Length) + 1; lr.positionCount = totalPoints; for (int i = 0; i < totalPoints; i++) { float t = (float)i / (float)(totalPoints - 1); Vector3 pos = sp.Evaluate(t); lr.SetPosition(i, pos); } } }