示例#1
0
 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);
 }
示例#2
0
    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);
    }