Actualmente estoy trabajando en un mundo infinito, inspirado principalmente en Minecraft.
Un trozo consta de bloques de 16x16x16. Un bloque (cubo) es 1x1x1.
Esto funciona muy bien con un ViewRange de 12 Chunks (12x16) en mi computadora. Multa.
Cuando cambio la altura del fragmento a 256, esto se convierte, obviamente, en un retraso increíble.
Entonces, lo que básicamente quiero hacer es apilar trozos. Eso significa que mi mundo podría ser [∞, 16, ∞] pedazos grandes.
La pregunta ahora es cómo generar trozos sobre la marcha.
Por el momento, genero fragmentos no existentes circulares alrededor de mi posición (de cerca a lejos). Como todavía no apilo fragmentos, esto no es muy complejo.
Como nota al margen importante aquí: también quiero tener biomas, con diferente altura mínima / máxima. Entonces, en Biome Flatlands, la capa más alta con bloques sería 8 (8x16); en Biome Mountains, la capa más alta con bloques sería 14 (14x16). Solo como ejemplo.
Lo que podría hacer sería cargar 1 trozo encima y debajo de mí, por ejemplo.
Pero aquí el problema sería que las transiciones entre diferentes bioms podrían ser mayores que una porción en y.
Mi trozo actual cargando en acción
Para completar aquí mi "algoritmo" actual de carga de fragmentos
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;
}
}