public void UpdateMesh() { List <BalloonPoint> points = balloon.GetPoints(); int pointsCount = points.Count; if (pointsCount < 2) { return; } #region Vertices Vector3[] vertices = new Vector3[(pointsCount) * (sides + 1)]; Color[] colours = new Color[vertices.Length]; BalloonPoint point; for (int seg = 0; seg < pointsCount; seg++) { point = points[seg]; float radius = point.transform.localScale.x; Vector3 position = points[seg].transform.position; for (int side = 0; side <= sides; side++) { int currSide = side == sides ? 0 : side; float angle = (float)currSide / sides * 360f; Vector3 direction = Quaternion.AngleAxis(angle, point.transform.forward) * point.transform.up; Vector3 vertex = position + direction * radius; vertices[side + seg * (sides + 1)] = balloon.transform.InverseTransformPoint(vertex); colours[side + seg * (sides + 1)] = point.Colour; } } #endregion #region Triangles int facesNo = vertices.Length; int trianglesNo = facesNo * 2; int indexes = trianglesNo * 3; int[] triangles = new int[indexes]; int i = 0; for (int seg = 0; seg < pointsCount - 1; seg++) { for (int side = 0; side <= sides - 1; side++) { int current = side + seg * (sides + 1); int next = side + (seg + 1) * (sides + 1); if (i < triangles.Length - 6) { triangles[i++] = current; triangles[i++] = next; triangles[i++] = next + 1; triangles[i++] = current; triangles[i++] = next + 1; triangles[i++] = current + 1; } } } #endregion mesh.vertices = vertices; mesh.colors = colours; mesh.triangles = triangles; mesh.RecalculateNormals(); mesh.RecalculateBounds(); }