В настоящее время я работаю над бесконечным миром, в основном вдохновленным 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;
}
}