Пример #1
0
    public static Mesh ArrayToMesh(int[,,] a)
    {
        Mesh mesh = new Mesh();

        verts = new List <Vector3>();
        tris  = new List <int>();
        uv    = new List <Vector2>();

        WallScript[,,] wall = new WallScript[a.GetLength(0), a.GetLength(1), a.GetLength(2)];
        for (int i = 0; i < a.GetLength(0); i++)
        {
            for (int j = 0; j < a.GetLength(1); j++)
            {
                for (int k = 0; k < a.GetLength(2); k++)
                {
                    if (a[i, j, k] == 1)
                    {
                        WallScript w = new WallScript();
                        wall[i, j, k] = w;
                        w.SetNeighbors(
                            i == 0?null:wall[i - 1, j, k],
                            j == 0?null:wall[i, j - 1, k],
                            k == 0?null:wall[i, j, k - 1]);
                    }
                    else
                    {
                        wall[i, j, k] = null;
                    }
                }
            }
        }

        for (int i = 0; i < wall.GetLength(0); i++)
        {
            for (int j = 0; j < wall.GetLength(1); j++)
            {
                for (int k = 0; k < wall.GetLength(2); k++)
                {
                    if (wall[i, j, k] != null)
                    {
                        wall[i, j, k].GetNeeds();
                    }
                }
            }
        }

        for (int i = 0; i < wall.GetLength(0); i++)
        {
            for (int j = 0; j < wall.GetLength(1); j++)
            {
                for (int k = 0; k < wall.GetLength(2); k++)
                {
                    if (wall[i, j, k] != null)
                    {
                        if (wall[i, j, k].needFront)
                        {
                            Vector2 side = wall[i, j, k].GetFrontWall();
                            if (side != Vector2.zero)
                            {
                                AddWall(new Vector3(i - .5f, j - .5f, k + .5f)
                                        , new Vector3(i + side.x - .5f, j - .5f, k + .5f)
                                        , new Vector3(i - .5f, j + side.y - .5f, k + .5f)
                                        , new Vector3(i + side.x - .5f, j + side.y - .5f, k + .5f), true);
                            }
                        }
                        if (wall[i, j, k].needBack)
                        {
                            Vector2 side = wall[i, j, k].GetBackWall();
                            if (side != Vector2.zero)
                            {
                                AddWall(new Vector3(i - .5f, j - .5f, k - .5f)
                                        , new Vector3(i - .5f, j + side.y - .5f, k - .5f)
                                        , new Vector3(i + side.x - .5f, j - .5f, k - .5f)
                                        , new Vector3(i + side.x - .5f, j + side.y - .5f, k - .5f));
                            }
                        }

                        if (wall[i, j, k].needRight)
                        {
                            Vector2 side = wall[i, j, k].GetRightWall();
                            if (side != Vector2.zero)
                            {
                                AddWall(new Vector3(i + .5f, j - .5f, k - .5f)
                                        , new Vector3(i + .5f, j + side.y - .5f, k - .5f)
                                        , new Vector3(i + .5f, j - .5f, k + side.x - .5f)
                                        , new Vector3(i + .5f, j + side.y - .5f, k + side.x - .5f));
                            }
                        }

                        if (wall[i, j, k].needLeft)
                        {
                            Vector2 side = wall[i, j, k].GetLeftWall();
                            if (side != Vector2.zero)
                            {
                                AddWall(new Vector3(i - .5f, j - .5f, k - .5f)
                                        , new Vector3(i - .5f, j - .5f, k + side.x - .5f)
                                        , new Vector3(i - .5f, j + side.y - .5f, k - .5f)
                                        , new Vector3(i - .5f, j + side.y - .5f, k + side.x - .5f), true);
                            }
                        }

                        if (wall[i, j, k].needUp)
                        {
                            Vector2 side = wall[i, j, k].GetUpWall();
                            if (side != Vector2.zero)
                            {
                                AddWall(new Vector3(i - .5f, j - .5f, k - .5f)
                                        , new Vector3(i - .5f + side.y, j - .5f, k - .5f)
                                        , new Vector3(i - .5f, j - .5f, k + side.x - .5f)
                                        , new Vector3(i - .5f + side.y, j - .5f, k + side.x - .5f));
                            }
                        }
                        if (wall[i, j, k].needDown)
                        {
                            Vector2 side = wall[i, j, k].GetDownWall();
                            if (side != Vector2.zero)
                            {
                                AddWall(new Vector3(i - .5f, j + .5f, k - .5f)
                                        , new Vector3(i - .5f, j + .5f, k + side.x - .5f)
                                        , new Vector3(i - .5f + side.y, j + .5f, k - .5f)
                                        , new Vector3(i - .5f + side.y, j + .5f, k + side.x - .5f), true);
                            }
                        }
                    }
                }
            }
        }


        Vector3[] v = new Vector3[verts.Count];
        Vector2[] u = new Vector2[uv.Count];
        int[]     t = new int[tris.Count];
        verts.CopyTo(v);
        uv.CopyTo(u);
        tris.CopyTo(t);
        mesh.vertices  = v;
        mesh.triangles = t;
        mesh.uv        = u;
        mesh.RecalculateNormals();
        //mesh.Optimize();
        wall = null;
        return(mesh);
    }