Vector3 getGradientAtT(float t) { int i0 = 0, i1 = 0, i2 = 0, i3 = 0; // indices if (closed) { i0 = ((int)t) % points.Count; int add = (int)t; if (curveType == CurveType.Bezier && add >= 1) { i0 = (3 * add) % points.Count; } i1 = (i0 + 1) % points.Count; i2 = (i1 + 1) % points.Count; i3 = (i2 + 1) % points.Count; } else { i0 = 0; i1 = 1; i2 = 2; i3 = 3; } // Debug.Log("i0 " + i0 + ", i1 " + i1 + ", i2 " + i2 + ", i3 " + i3); CurveSegment csX = new CurveSegment(curveType, points[i0].position.x, points[i1].position.x, points[i2].position.x, points[i3].position.x); CurveSegment csY = new CurveSegment(curveType, points[i0].position.y, points[i1].position.y, points[i2].position.y, points[i3].position.y); CurveSegment csZ = new CurveSegment(curveType, points[i0].position.z, points[i1].position.z, points[i2].position.z, points[i3].position.z); float dv_x = csX.EvaluateDv(t); float dv_y = csY.EvaluateDv(t); float dv_z = csZ.EvaluateDv(t); Vector3 dv_p = new Vector3(dv_x, dv_y, dv_z); //Vector2 dv_p = new Vector2(dv_x, dv_y); return(dv_p); }