/// <summary> /// Generates a mesh object which is then passed to the Mesh component of this monobehaviour. /// </summary> public void GenerateMesh() { // Creation of temporary mesh variables which we will use to create the unity mesh object. List <Vector3> vertices = new List <Vector3>(); List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); int NumFaces = 0; // For each block in this chunk for (int x = 0; x < ConfigurationManager.Instance.Chunk_Diameter; x++) { for (int z = 0; z < ConfigurationManager.Instance.Chunk_Diameter; z++) { for (int y = 0; y < ConfigurationManager.Instance.Chunk_Diameter; y++) { // If the block is visible, display all faces which are adjacent to invisible blocks AbstractBlock ours = GetBlock(x, y, z); if (ours.isVisible()) { if (!GetBlock(x + 1, y, z).isVisible()) { AddPosXFace(x, y, z, ours, vertices, triangles, uvs, ref NumFaces); } if (!GetBlock(x - 1, y, z).isVisible()) { AddNegXFace(x, y, z, ours, vertices, triangles, uvs, ref NumFaces); } if (!GetBlock(x, y + 1, z).isVisible()) { AddPosYFace(x, y, z, ours, vertices, triangles, uvs, ref NumFaces); } if (!GetBlock(x, y - 1, z).isVisible()) { AddNegYFace(x, y, z, ours, vertices, triangles, uvs, ref NumFaces); } if (!GetBlock(x, y, z + 1).isVisible()) { AddPosZFace(x, y, z, ours, vertices, triangles, uvs, ref NumFaces); } if (!GetBlock(x, y, z - 1).isVisible()) { AddNegZFace(x, y, z, ours, vertices, triangles, uvs, ref NumFaces); } } } } } // Clear whatever data was in the mesh previously mesh.Clear(); // Add in newly calculated values mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); // Optimize, and normal calculation MeshUtility.Optimize(mesh); mesh.RecalculateNormals(); collider.sharedMesh = mesh; }