static void TryAdd(List <LineIndexs> lines, LineIndexs l) { for (int i = 0; i < lines.Count; i++) { if (lines[i] == l) { lines.RemoveAt(i); return; } } lines.Add(l); }
public static Vector2[] GetOutlineVertices(Collider2D collider) { var vertexs = new List <int>(); var mesh = collider.CreateMesh(true, true); var vertices = mesh.vertices; var triangles = mesh.triangles; var lines = new List <LineIndexs>(); for (int i = 0; i < triangles.Length - 2; i += 3) { var line1 = new LineIndexs(triangles[i], triangles[i + 1]); var line2 = new LineIndexs(triangles[i + 1], triangles[i + 2]); var line3 = new LineIndexs(triangles[i + 2], triangles[i]); TryAdd(lines, line1); TryAdd(lines, line2); TryAdd(lines, line3); } if (lines.Count > 0) { vertexs.Add(lines[lines.Count - 1].index1); vertexs.Add(lines[lines.Count - 1].index2); lines.RemoveAt(lines.Count - 1); while (lines.Count > 0) { bool haveAddedALine = false; for (int i = 0; i < lines.Count; i++) { if (lines[i].index1 == vertexs[0]) { vertexs.Insert(0, lines[i].index2); lines.RemoveAt(i); i--; haveAddedALine = true; } else if (lines[i].index2 == vertexs[0]) { vertexs.Insert(0, lines[i].index1); lines.RemoveAt(i); i--; haveAddedALine = true; } else if (lines[i].index1 == vertexs[vertexs.Count - 1]) { vertexs.Add(lines[i].index2); lines.RemoveAt(i); i--; haveAddedALine = true; } else if (lines[i].index2 == vertexs[vertexs.Count - 1]) { vertexs.Add(lines[i].index1); lines.RemoveAt(i); i--; haveAddedALine = true; } if (haveAddedALine) { break; } } if (vertexs[0] == vertexs[vertexs.Count - 1]) { vertexs.RemoveAt(vertexs.Count - 1); break; } if (!haveAddedALine) { break; } } } var realVertexs = new Vector2[vertexs.Count]; for (int i = 0; i < vertexs.Count; i++) { realVertexs[i] = vertices[vertexs[i]]; } UnityEngine.Object.Destroy(mesh); return(realVertexs); }