Ich arbeite derzeit an einer unendlichen Welt, die hauptsächlich von Minecraft inspiriert ist.
Ein Chunk besteht aus 16x16x16 Blöcken. Ein Block (Würfel) ist 1x1x1.
Dies läuft sehr reibungslos mit einem ViewRange von 12 Chunks (12x16) auf meinem Computer. Fein.
Wenn ich die Chunk-Höhe auf 256 ändere, wird dies offensichtlich zu einer unglaublichen Verzögerung.
Grundsätzlich möchte ich also Brocken stapeln. Das heißt, meine Welt könnte [∞, 16, ∞] Chunks groß sein.
Die Frage ist nun, wie man Brocken im laufenden Betrieb erzeugt.
Im Moment generiere ich nicht vorhandene Brocken, die kreisförmig um meine Position liegen (nah bis fern). Da ich noch keine Chunks staple, ist dies nicht sehr komplex.
Als wichtige Randnotiz hier: Ich möchte auch Biome mit unterschiedlicher Min / Max-Höhe haben. In Biome Flatlands wäre die höchste Schicht mit Blöcken 8 (8x16) - in Biome Mountains wäre die höchste Schicht mit Blöcken 14 (14x16). Nur als Beispiel.
Was ich tun könnte, wäre zum Beispiel 1 Stück über und unter mir zu laden.
Aber hier wäre das Problem , dass Übergänge zwischen verschiedenen Biomen größer als ein Stück auf y sein könnten.
Mein aktueller Chunk wird in Aktion geladen
Der Vollständigkeit halber hier mein aktueller Chunk-Lade- "Algorithmus"
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;
}
}