Tôi hiện đang làm việc trên một thế giới vô tận, chủ yếu lấy cảm hứng từ minecraft.
Một Chunk bao gồm các khối 16x16x16. Một khối (khối) là 1x1x1.
Điều này chạy rất mượt mà với ViewRange 12 Chunks (12x16) trên máy tính của tôi. Khỏe.
Khi tôi thay đổi chiều cao Chunk thành 256, điều này trở nên - rõ ràng - độ trễ đáng kinh ngạc.
Vì vậy, những gì tôi về cơ bản muốn làm là xếp chồng chunk. Điều đó có nghĩa là thế giới của tôi có thể là [, 16,] Chunks rộng lớn.
Câu hỏi bây giờ là làm thế nào để tạo khối khi đang bay?
Tại thời điểm này, tôi tạo ra các khối không tồn tại xung quanh vị trí của mình (gần đến xa). Vì tôi chưa xếp các khối, nên điều này không phức tạp lắm.
Như lưu ý phụ quan trọng ở đây: Tôi cũng muốn có quần xã, với chiều cao tối thiểu / tối đa khác nhau. Vì vậy, trong Biome Flatlands , lớp cao nhất với các khối sẽ là 8 (8x16) - ở Biome Mountains , lớp cao nhất với các khối sẽ là 14 (14x16). Chỉ là ví dụ.
Những gì tôi có thể làm sẽ là tải 1 Chunk ở trên và dưới tôi chẳng hạn.
Nhưng vấn đề ở đây là, sự chuyển tiếp giữa các sinh vật khác nhau có thể lớn hơn một đoạn trên y.
Tải chunk hiện tại của tôi trong hành động
Để hoàn thiện ở đây, "thuật toán" tải chunk hiện tại của tôi
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;
}
}