Atualmente, estou trabalhando em um mundo infinito, principalmente inspirado em minecraft.
Um Chunk consiste em blocos 16x16x16. Um bloco (cubo) é 1x1x1.
Isso funciona muito bem com um ViewRange de 12 pedaços (12x16) no meu computador. Bem.
Quando mudo a altura do Chunk para 256, isso se torna - obviamente - incrível.
Então, basicamente, o que eu quero fazer é empilhar pedaços. Isso significa que meu mundo pode ter [∞, 16, ∞] pedaços grandes.
A questão agora é como gerar pedaços em tempo real?
No momento, gero pedaços circulares não existentes em torno da minha posição (perto ou longe). Como ainda não empilhe pedaços, isso não é muito complexo.
Como nota lateral importante aqui: eu também quero ter biomas, com diferentes alturas mín. / Máx. Assim, em Bioma Plains a camada mais alta com blocos seriam 8 (8x16) - em Bioma Montanhas a camada mais alta com blocos seriam 14 (14x16). Apenas como exemplo.
O que eu poderia fazer seria carregar 1 pedaço acima e abaixo de mim, por exemplo.
Mas aqui estaria o problema , que as transições entre diferentes átomos poderiam ser maiores que um pedaço de y.
Meu pedaço atual de carregamento em ação
Para completar, meu atual algoritmo de carregamento de blocos
private IEnumerator UpdateChunks(){
for (int i = 1; i < VIEW_RANGE; i += ChunkWidth) {
float vr = i;
for (float x = transform.position.x - vr; x < transform.position.x + vr; x += ChunkWidth) {
for (float z = transform.position.z - vr; z < transform.position.z + vr; z += ChunkWidth) {
_pos.Set(x, 0, z); // no y, yet
_pos.x = Mathf.Floor(_pos.x/ChunkWidth)*ChunkWidth;
_pos.z = Mathf.Floor(_pos.z/ChunkWidth)*ChunkWidth;
Chunk chunk = Chunk.FindChunk(_pos);
// If Chunk is already created, continue
if (chunk != null)
continue;
// Create a new Chunk..
chunk = (Chunk) Instantiate(ChunkFab, _pos, Quaternion.identity);
}
}
// Skip to next frame
yield return 0;
}
}