I recently added collision to my voxel game, but the collision mesh is floating in the air far away from the visible mesh, I’m not sure what exactly is wrong.
The last foreach loop in start is where I create and Instantiate the collision mesh.
public class World : MonoBehaviour {
public GameObject worldItem;
public GameObject collider;
public Matrix4x4 id = Matrix4x4.identity;
public Texture texture;
Chunk chunk;
public Material material;
public int ViewDist = 1;
MainTerrainGenerator terrainGenerator;
FindChunk chunkHelp;
private int chunksize = Chunk.chunksize;
public Dictionary<Vector3Int, Chunk> chunks = new Dictionary<Vector3Int, Chunk>();
void Awake() {
terrainGenerator = worldItem.GetComponent<MainTerrainGenerator>();
chunkHelp = new FindChunk();
TextureManager.Initialize("Block Textures", texture);
}
private void Start() {
//float[,] biome = terrainGenerator.BiomeMapGen(new Vector3Int(0, 0, 0));
//biomeNoise.Add(new Vector3Int(0, 0, 0), biome);
for (int x = 0; x < ViewDist; x++){
for (int y = 0; y < ViewDist; y++){
for (int z = 0; z < ViewDist; z++){
chunk = new Chunk(new Vector3Int(x * chunksize, y * chunksize, z * chunksize), this, terrainGenerator);
chunk.CreateChunkNoise();
chunk.GenerateChunkArray();
chunks.Add(chunk.pos, chunk);
}
}
}
foreach(Chunk chunk in chunks.Values){
chunk.GrassCheck();
}
foreach(Chunk chunk in chunks.Values){
chunk.GetMesh();
GameObject col = Instantiate(collider, new Vector3(chunk.pos.x, chunk.pos.y, chunk.pos.z), Quaternion.identity);
MeshCollider coll = col.GetComponent<MeshCollider>();
coll.sharedMesh = chunk.mesh;
}
}
private void Update() {
foreach(Chunk chunk in chunks.Values){
Graphics.DrawMesh(chunk.mesh, id, material, 0);
}
}
public Blocks GetBlock(Vector3Int pos, int x, int y, int z) {
Vector3Int newpos = chunkHelp.ChunkToChunk(pos, x, y, z);
Chunk neochunk;
chunks.TryGetValue(newpos, out neochunk);
if (neochunk == null){
return Blocks.Stone;
}
Vector3Int nnpos = chunkHelp.ChunkToBlock(x, y, z);
return neochunk.blocks[nnpos.x, nnpos.y, nnpos.z];
}
}
Here’s what it looks like when in play.