protected override void BuildMeshComponents() { #region DoubleCollider if (useDoubleCollider) { cachedVertsLeft = new List <Vector2>(); cachedVertsRight = new List <Vector2>(); } #endregion List <Vector3> verticesList = new List <Vector3>(); List <int> trianglesList = new List <int>(); Vector2 center = new Vector2(); for (int i = 0; i < lineVerts.Length; i++) { center += lineVerts[i]; } center /= lineVerts.Length; for (int i = 0; i < lineVerts.Length; i++) { lineVerts[i] -= center; } int currentVertIndex = 0; int currentTriIndex = 0; //add first two vertices float angle = Mathf.Atan2(lineVerts[1].y - lineVerts[0].y, lineVerts[1].x - lineVerts[0].x); float oldAngle, angleDiff; Vector2 p1 = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * lineWidth; Vector2 p2 = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * lineWidth; if (p1 != p2) { verticesList.Add(lineVerts[currentVertIndex] + p1); verticesList.Add(lineVerts[currentVertIndex] + p2); #region DoubleCollider if (useDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion } else { verticesList.Add(lineVerts[currentVertIndex]); #region DoubleCollider if (useDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 1]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion } oldAngle = angle; currentVertIndex++; // add middle vertices for (int i = 0; i < lineVerts.Length - 2; i++, currentVertIndex++) { angle = Mathf.Atan2(lineVerts[currentVertIndex + 1].y - lineVerts[currentVertIndex].y, lineVerts[currentVertIndex + 1].x - lineVerts[currentVertIndex].x); angleDiff = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f; p1 = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * lineWidth; p2 = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * lineWidth; if (p1 != p2) { verticesList.Add(lineVerts[currentVertIndex] + p1); verticesList.Add(lineVerts[currentVertIndex] + p2); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 2); currentTriIndex += 2; } else { verticesList.Add(lineVerts[currentTriIndex] + p1); if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2]) { trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); currentTriIndex++; } } #region DoubleCollider if (useDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion oldAngle = angle; } //add last two vertices if (lineVerts[0] != lineVerts[currentVertIndex]) { angle = Mathf.Atan2(lineVerts[currentVertIndex].y - lineVerts[currentVertIndex - 1].y, lineVerts[currentVertIndex].x - lineVerts[currentVertIndex - 1].x); p1 = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * lineWidth; p2 = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * lineWidth; if (p1 != p2) { verticesList.Add(lineVerts[currentVertIndex] + p1); verticesList.Add(lineVerts[currentVertIndex] + p2); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 2); } else { //make LineMesh loop if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2]) { verticesList.Add(lineVerts[currentTriIndex] + p1); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); } } #region DoubleCollider if (useDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion } else { oldAngle = Mathf.Atan2( lineVerts[0].y - lineVerts[currentVertIndex].y, lineVerts[0].x - lineVerts[currentVertIndex].x); angle = Mathf.Atan2( lineVerts[1].y - lineVerts[0].y, lineVerts[1].x - lineVerts[0].x); angleDiff = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f - deg90; p1 = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * lineWidth; p2 = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * lineWidth; verticesList[0] = lineVerts[currentVertIndex] + p1; verticesList[1] = lineVerts[currentVertIndex] + p2; #region DoubleCollider if (useDoubleCollider) { cachedVertsLeft[0] = verticesList[0]; cachedVertsRight[0] = verticesList[1]; cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion trianglesList.Add(0); trianglesList.Add(verticesList.Count - 1); trianglesList.Add(1); trianglesList.Add(verticesList.Count - 1); trianglesList.Add(0); trianglesList.Add(verticesList.Count - 2); } Vertices = verticesList.ToArray(); Triangles = trianglesList.ToArray(); UVs = MeshHelper.UVUnwrap(Vertices); }