В настоящее время я работаю над бесконечным миром, в основном вдохновленным Minecraft. Кусок состоит из 16x16x16 блоков. Блок (куб) имеет размер 1x1x1.
Это работает очень гладко с ViewRange из 12 блоков (12x16) на моем компьютере. Хорошо.
Когда я изменяю высоту чанка на 256, это становится - очевидно - невероятно медленным.
Итак, что я в основном хочу сделать - это сложить куски. Это означает, что мой мир может быть [∞, 16, ∞] Большие куски.
Вопрос сейчас в том, как генерировать куски на лету?
В данный момент я генерирую несуществующие чанки, круглые вокруг моей позиции (от ближнего к дальнему). Поскольку я еще не складываю куски, это не очень сложно.
Как важной стороне записки здесь: Я тоже хочу иметь биомы, с различными мин / макс высоты. Таким образом, в равнинах Биома самый высокий слой с блоками будет 8 (8x16) - в горах Биома самый высокий слой с блоками будет 14 (14x16). Просто в качестве примера.
Я мог бы, например, загрузить 1 блок выше и ниже меня.
Но здесь проблема заключается в том, что переходы между различными биомами могут быть больше, чем один кусок на y.
Моя текущая загрузка чанка в действии
Для полноты здесь мой текущий блок загрузки "алгоритм"
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;
}
}
источник
Я не верю, что вы можете сделать это, просто загрузив определенные слои из-за проблемы переходов.
Я бы хотел хранить метаданные с каждым фрагментом:
1) Является ли блок полностью воздушным. Если так, то нет необходимости делать это.
2) Для каждого лица блока это непрозрачно. Непрозрачное лицо означает, что вам не нужно учитывать следующий кусок. (Тем не менее, обратите внимание, что в зависимости от того, где находится чанк, может быть задействовано до трех граней - чанк должен быть визуализирован, если любое из трех не является непрозрачным. Я подозреваю, что это лучше всего предварительно рассчитать - сделать так долго либо b1 видимый и имеет непрозрачную грань f1, либо b2 видимый имеет непрозрачную грань f2, либо b3 видимый имеет непрозрачную грань f3.)
К сожалению, в пределах 12-ти углового диапазона видимости имеется более 7000 фрагментов. Тем не менее, я ожидал бы, что в нескольких местах будет более трех вертикальных чанков, которые на самом деле нужно рендерить, используя этот подход, который сокращает количество чанков до, вероятно, не более 1500.
Я бы применил такую же логику внутри чанка - когда вы загружаете чанк, вычисляете, какие соединения прозрачны, а какие - непрозрачные, а прикосновения - непрозрачные - вам нужно только визуализировать лица там, где их могут видеть. (Обратите внимание, что в Minecraft у вас есть три типа блоков - прозрачный, непрозрачный и изменяющий зрение - стекло, двери, заборы и т. Д. Вы можете пропустить только прозрачный-прозрачный и непрозрачный-непрозрачный.)
источник