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); }