Saat ini saya sedang mengerjakan dunia tanpa batas, sebagian besar terinspirasi oleh minecraft.
Sebuah Chunk terdiri dari 16x16x16 blok. Blok (kubus) adalah 1x1x1.
Ini berjalan sangat lancar dengan ViewRange 12 Potongan (12x16) di komputer saya. Baik.
Ketika saya mengubah tinggi Chunk ke 256, ini menjadi - jelas - laggy yang luar biasa.
Jadi pada dasarnya yang ingin saya lakukan adalah menumpuk potongan. Itu berarti duniaku bisa [∞, 16, ∞] Bongkahan besar.
Pertanyaannya sekarang bagaimana cara menghasilkan bongkahan dengan cepat?
Saat ini saya menghasilkan tidak ada potongan melingkar di sekitar posisi saya (dekat ke jauh). Karena saya belum menumpuk, ini tidak terlalu rumit.
Sebagai catatan penting di sini: Saya juga ingin memiliki bioma, dengan tinggi min / maks berbeda. Jadi di Biome Flatlands , lapisan tertinggi dengan balok adalah 8 (8x16) - di Pegunungan Biome lapisan tertinggi dengan balok adalah 14 (14x16). Seperti contohnya.
Apa yang bisa saya lakukan adalah memuat 1 Chunk di atas dan di bawah saya misalnya.
Tetapi di sini masalahnya adalah, bahwa transisi di antara bioma yang berbeda dapat lebih besar dari satu potongan pada y.
Pemuatan chunk saya saat ini sedang beraksi
Untuk kelengkapan di sini "algoritma" pemuatan potongan saya saat ini
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;
}
}
sumber
Saya tidak percaya Anda dapat melakukan ini hanya dengan memuat lapisan tertentu karena masalah transisi.
Kecenderungan saya adalah menyimpan beberapa metadata dengan setiap chunk:
1) Apakah blok sepenuhnya udara. Jika demikian, tidak perlu untuk membuatnya.
2) Untuk setiap muka balok apakah buram. Wajah buram berarti Anda tidak perlu mempertimbangkan potongan berikutnya. (Namun, perhatikan bahwa tergantung pada di mana bongkahan itu ada, mungkin ada sebanyak tiga wajah yang terlibat - bongkahan harus diberikan jika salah satu dari ketiganya tidak buram. Saya menduga ini adalah yang terbaik yang dihitung sebelumnya - render begitu lama b1 terlihat dan memiliki wajah non-buram f1 atau b2 terlihat memiliki wajah non-buram f2 atau b3 terlihat memiliki wajah non-buram f3.)
Sayangnya ada lebih dari 7000 bongkahan dalam rentang penglihatan 12 bongkahan. Namun, saya berharap beberapa lokasi memiliki lebih dari tiga bongkahan vertikal yang sebenarnya perlu dirender menggunakan pendekatan ini yang memotong jumlah bongkahan menjadi mungkin tidak lebih dari 1500.
Saya akan menerapkan jenis logika yang sama di dalam chunk - ketika Anda memuat chunk menghitung persimpangan apa yang transparan dan persimpangan apa yang opak menyentuh buram - Anda hanya perlu benar-benar membuat wajah di mana seseorang dapat melihatnya. (Perhatikan bahwa di Minecraft Anda memiliki tiga jenis blok - transparan, buram dan mengubah visi - kaca, pintu, pagar, dll. Anda hanya dapat melewati transparan-transparan dan buram-buram.)
sumber