/// <summary> /// Sets the start and end points of the line. /// </summary> /// <param name="start">The start point of the line.</param> /// <param name="end">The end point of the line.</param> public void SetEndpoints(Vector3 start, Vector3 end) { transform.position = (start + end) / 2; transform.up = -(end - start); float distance = Vector3.Magnitude(start - end) / 2; Vector3 localScale = transform.localScale; localScale.y = distance; transform.localScale = localScale; if (distance != 0) { SpriteSheet spriteSheet = GetComponent <SpriteSheet>(); spriteSheet._scale.y = 0.2f / distance; spriteSheet.CalcTextureSize(); } }
/// <summary> /// Draws a path defined by points. /// </summary> /// <param name="path">The points in the path to draw.</param> public void DrawPath(List <Vector3> path) { List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); List <int> tris = new List <int>(); List <Vector3> newPath = new List <Vector3>(); for (int i = 0; i < path.Count - 1; i++) { Vector3 node0 = path[i]; Vector3 node1 = path[i + 1]; Vector3 difference = node1 - node0; Vector3 truncate = difference.normalized * curveLength; if (i != 0) { node0 += truncate; } if (i < path.Count - 2) { node1 -= truncate; } difference = node1 - node0; Vector3 side = Quaternion.AngleAxis(90, Vector3.up) * difference; side.y = 0; side = side.normalized * lineThickness / 2; List <Vector3> corners = new List <Vector3>(); corners.Add(node0 + side); corners.Add(node0 - side); corners.Add(node1 - side); corners.Add(node1 + side); int prevOff = verts.Count; if (i != 0) { // Curve. verts.Add(verts[prevOff - 5]); verts.Add(verts[prevOff - 6]); verts.Add(corners[1]); verts.Add(corners[0]); verts.Add(verts[prevOff - 1]); verts.Add(verts[prevOff - 2]); verts.Add(corners[1] + Vector3.down * lineHeight); verts.Add(corners[0] + Vector3.down * lineHeight); } int off = verts.Count; foreach (Vector3 corner in corners) { verts.Add(corner); } foreach (Vector3 corner in corners) { verts.Add(corner + Vector3.down * lineHeight); } foreach (int j in new int[] { prevOff, off }) { // Top and bottom. tris.Add(j); tris.Add(j + 1); tris.Add(j + 2); tris.Add(j); tris.Add(j + 2); tris.Add(j + 3); tris.Add(j + 6); tris.Add(j + 5); tris.Add(j + 4); tris.Add(j + 7); tris.Add(j + 6); tris.Add(j + 4); // Sides. for (int k = j; k < j + 4; k++) { bool last = k == j + 3; tris.Add(k); tris.Add(k + 4); tris.Add(last ? j : k + 1); tris.Add(last ? j : k + 1); tris.Add(k + 4); tris.Add(last ? j + 4 : k + 5); } } newPath.Add(node0); newPath.Add(node1); } int numLines = newPath.Count - 1; float[] cumulativeLength = new float[numLines]; float totalLength = 0; for (int i = 0; i < numLines; i++) { float length = Vector3.Distance(newPath[i + 1], newPath[i]); totalLength += length; cumulativeLength[i] = totalLength; } float prevUV = 0; for (int i = 0; i < numLines; i++) { float currentUV = cumulativeLength[i] / totalLength; for (int j = 0; j < 2; j++) { uvs.Add(new Vector2(1, prevUV)); uvs.Add(new Vector2(0, prevUV)); uvs.Add(new Vector2(0, currentUV)); uvs.Add(new Vector2(1, currentUV)); } prevUV = currentUV; } Mesh mesh = new Mesh(); mesh.hideFlags = HideFlags.HideAndDontSave; mesh.SetVertices(verts); mesh.SetUVs(0, uvs); mesh.SetTriangles(tris, 0); mesh.RecalculateNormals(); MeshFilter meshFilter = pathObject.GetComponent <MeshFilter>(); meshFilter.sharedMesh = mesh; meshFilter.mesh = mesh; SpriteSheet spriteSheet = pathObject.GetComponent <SpriteSheet>(); spriteSheet._scale.y = -0.1f / totalLength; spriteSheet.CalcTextureSize(); pathObject.SetActive(true); }