Attualmente sto lavorando a un mondo infinito, per lo più ispirato a Minecraft.
Un Pezzo consiste di 16x16x16 blocchi. Un blocco (cubo) è 1x1x1.
Funziona in modo molto fluido con un ViewRange di 12 blocchi (12x16) sul mio computer. Belle.
Quando cambio l'altezza di Chunk a 256 questo diventa - ovviamente - incredibile ritardo.
Quindi quello che sostanzialmente voglio fare è impilare blocchi. Ciò significa che il mio mondo potrebbe essere grande [∞, 16, ∞].
La domanda è adesso come generare blocchi al volo?
Al momento, generi blocchi circolari non esistenti attorno alla mia posizione (vicino al lontano). Dal momento che non impilare ancora blocchi, questo non è molto complesso.
Come nota a margine importante qui: voglio anche avere biomi, con diversa altezza min / max. Quindi in Biome Flatlands lo strato più alto con blocchi sarebbe 8 (8x16) - in Biome Mountains lo strato più alto con blocchi sarebbe 14 (14x16). Proprio come esempio.
Quello che potrei fare sarebbe caricare 1 pezzo sopra e sotto di me, per esempio.
Ma qui il problema sarebbe che le transizioni tra diversi biomi potrebbero essere più grandi di un pezzo su y.
Il mio pezzo attuale si sta caricando in azione
Per completezza qui il mio attuale "algoritmo" di caricamento di blocchi
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;
}
}