Hi all.
I am making a game like minecraft.
the game has problems with loading chunks. (chunk is place in terrain 16 * 16 blocks) it works very slowly, like in old minecraft versions. I have a third diserminal array with types of the blocks. If next to the block is an air block, i add to the mesh a voxel.
This is a code:
public void Optimize()
{
Mesh mesh = new Mesh();
List<Vector3> verts = new List<Vector3>();
List<int> tris = new List<int>();
List<Vector2> uvs = new List<Vector2>();
//Vector3 Vplus = new Vector3(1f, 0f, 1f);
for(int x = 1; x < 17; x++){
for(int z = 1; z < 17; z++){
for(int y = 1; y < maxHeight + 20; y++){
if(true)
{
Vector3 blockPos = new Vector3(x-1, y, z-1);
int numFaces = 0;
bool [] transparentTiles = new bool[6];
if(bloks[x, y, z] != BlockType.Air) {
transparentTiles = Block.blocks[bloks[x, y, z]].isTransparent;
} else {
transparentTiles = new bool[]{false, false, false, false, false, false};
}
BlockType thisBT = bloks[x, y, z];
Vector3 [] Vpos = new Vector3[4];
//up
if(!transparentTiles[2] && bloks[x, y+1, z] != BlockType.Air){
blockPos = new Vector3(x, y+1, z);
Vpos = Block.blocks[bloks[x, y+1, z]].returnVerts(1);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x, y+1, z]].bottomPos.GetUVs());
}
//bottom
if(!transparentTiles[0] && bloks[x, y-1, z] != BlockType.Air){
blockPos = new Vector3(x, y-1, z);
Vpos = Block.blocks[bloks[x, y-1, z]].returnVerts(0);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x, y-1, z]].topPos.GetUVs());
}
//front
if(!transparentTiles[2] && bloks[x, y, z-1] != BlockType.Air){
blockPos = new Vector3(x, y, z-1);
Vpos = Block.blocks[bloks[x, y, z-1]].returnVerts(4);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x, y, z-1]].sidePos.GetUVs());
}
//right
if(!transparentTiles[2] && bloks[x+1, y, z] != BlockType.Air){
blockPos = new Vector3(x+1, y, z);
Vpos = Block.blocks[bloks[x+1, y, z]].returnVerts(5);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x+1, y, z]].sidePos.GetUVs());
}
//back
if(!transparentTiles[2] && bloks[x, y, z+1] != BlockType.Air){
blockPos = new Vector3(x, y, z+1);
Vpos = Block.blocks[bloks[x, y, z+1]].returnVerts(2);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x, y, z+1]].sidePos.GetUVs());
}
//left
if(!transparentTiles[2] && bloks[x-1, y, z] != BlockType.Air){
blockPos = new Vector3(x-1, y, z);
Vpos = Block.blocks[bloks[x-1, y, z]].returnVerts(3);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x-1, y, z]].sidePos.GetUVs());
}
int tl = verts.Count - 4 * numFaces;
for(int i = 0; i < numFaces; i++)
{
tris.AddRange(new int[] { tl + i * 4, tl + i * 4 + 1, tl + i * 4 + 2, tl + i * 4, tl + i * 4 + 2, tl + i * 4 + 3 });
}
}
}
}
}
mesh.vertices = verts.ToArray();
mesh.triangles = tris.ToArray();
mesh.uv = uvs.ToArray();
mesh.RecalculateNormals(); //g
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
isOptimized = true;
}
will it work faster if I write it in a vertex shader?