Vector3 EvaluteAt(float t, CatmullRomSpline3D spline, int p) { if (t > p) { t -= p; } return(spline.Sample(t)); }
void Start() { spline = new CatmullRomSpline3D(); Vector3[] cps = new Vector3[6]; cps[0] = new Vector3(-75, 30, -75); cps[1] = new Vector3(0, 60, 75); cps[2] = new Vector3(75, 30, -75); cps[3] = cps[0]; cps[4] = cps[1]; cps[5] = cps[2]; spline.ControlPoints = cps; currentTime = 0; }
public void moveTowardRedBoid(GameObject boid) { Vector3[] cps; CatmullRomSpline3D Spline; cps = new Vector3[4]; cps[0] = -2 * (boid.transform.forward) + boid.transform.position; cps[1] = boid.transform.position; cps[2] = cloneObject.transform.position + new Vector3(Random.Range(-5f, 5f), Random.Range(-5f, 5f), Random.Range(-5f, 5f)) - cloneObject.transform.forward; cps[3] = cloneObject.transform.forward + cloneObject.transform.position; Spline = new CatmullRomSpline3D(); Spline.ControlPoints = cps; Vector3 currPos = EvaluteAt(speed, Spline, cps.Length); foreach (GameObject obj in objectList) { if (obj != boid) { if (Vector3.SqrMagnitude(currPos - obj.transform.position) < 10f * 10f) { currPos = (currPos - obj.transform.position).normalized * 10f + obj.transform.position; } } } Vector3 nextPos = EvaluteAt(speed + speed, Spline, cps.Length); boid.transform.position = currPos; Vector3 forward = nextPos - currPos; if (forward.sqrMagnitude > 1e-5) { forward.Normalize(); boid.transform.forward = forward; } }