Ejemplo n.º 1
0
    IEnumerator <WaitForSeconds> _Build()
    {
        List <List <Vector3> > shapes = new List <List <Vector3> >();
        int     shape = 0;
        Vector3 up    = Vector3.up * walls.Height;

        Vector2[] uvs = new Vector2[4]
        {
            new Vector2(0, 0),
            new Vector2(0, 1),
            new Vector2(1, 1),
            new Vector2(1, 0)
        };

        while (true)
        {
            if (floor.Generated)
            {
                if (generated)
                {
                    yield return(new WaitForSeconds(0.05f));
                }
                else
                {
                    if (!generating)
                    {
                        foreach (List <Vector3> shapeCorners in floor.GetShapeCorners(false))
                        {
                            shapes.Add(shapeCorners.Select(v => transform.InverseTransformPoint(v)).ToList());
                        }
                        shape      = -1;
                        generating = true;
                    }
                    shape++;
                    if (shape >= shapes.Count)
                    {
                        generated = true;
                    }
                    else
                    {
                        int n = verts.Count;

                        for (int i = 0, l = shapes[shape].Count; i < l; i++)
                        {
                            verts.Add(shapes[shape][i] + up);
                            UVs.Add(uvs[i % 4]);
                        }

                        tris.Add(n);
                        tris.Add(n + 2);
                        tris.Add(n + 1);

                        tris.Add(n);
                        tris.Add(n + 3);
                        tris.Add(n + 2);

                        mesh.Clear();
                        mesh.SetVertices(verts);
                        mesh.SetTriangles(tris, 0);
                        mesh.SetUVs(0, UVs);
                        mesh.RecalculateBounds();
                        mesh.RecalculateNormals();

                        yield return(new WaitForSeconds(delay));
                    }
                }
            }
            else
            {
                if (generated || generating)
                {
                    generated  = false;
                    generating = false;
                    verts.Clear();
                    UVs.Clear();
                    tris.Clear();
                    shapes.Clear();
                    mesh.Clear();
                    mesh.SetVertices(verts);
                    mesh.SetTriangles(tris, 0);
                    mesh.SetUVs(0, UVs);
                    mesh.RecalculateBounds();
                    mesh.RecalculateNormals();
                }
                yield return(new WaitForSeconds(0.05f));
            }
        }
    }