Воксельные миры
Генератор, mesher, viewer, LOD и сохранение изменений.
Terrain или объёмный мир
Обычный Terrain хранит поверхность высот. Voxel Tools хранит значения внутри объёма: это подходит для пещер, навесов, блочных построек и изменяемого рельефа. Воксельные данные и меш, который видит игрок, — разные части системы.
| Тип мира | Основные части |
|---|---|
| Блочный | VoxelTerrain, библиотека блоков, соответствующий генератор и VoxelMesherBlocky |
| Гладкий с LOD | VoxelLodTerrain, поле плотности/SDF и VoxelMesherTransvoxel |
| Уже подготовленная геометрия без изменения объёма | Меши и префабы; воксельная система может не понадобиться |
Генератор должен записывать те каналы, которые читает выбранный mesher. Библиотека блоков не заменяет поле плотности для гладкой поверхности.
Соберите минимальный рабочий мир
- Добавьте подходящий объект мира:
VoxelTerrainилиVoxelLodTerrain. - Назначьте совместимые генератор, mesher и материал. Начните с небольшого диапазона видимости.
- Добавьте
VoxelViewerк объекту, который перемещается вместе с игроком или игровой камерой. - Настройте диапазон загрузки viewer и необходимость коллизий. Камера сама по себе не является запросом на загрузку воксельных чанков.
- Запустите сцену и дождитесь генерации ближайших блоков.
- Переместите viewer: новая область должна появляться, а удалённая переставать держать ненужные данные.
Для редакторского предпросмотра проверьте Enabled In Editor у VoxelViewer. Предпросмотр и игровой viewer могут иметь разные положения; это частая причина разного результата после запуска.
Изменение данных из C#
VoxelBuffer — контейнер значений. Пример создаёт буфер и меняет одну ячейку:
using Reckfell;
using var data = new VoxelBuffer();
data.Create(32, 32, 32);
data.SetVoxel(1, 16, 8, 16);Чтобы увидеть изменение мира, используйте инструмент редактирования соответствующего Terrain и его обновление геометрии. Изменение отдельного временного буфера не помещает меш в сцену автоматически. У гладкого мира редактируется плотность/SDF, а не только идентификатор блока.
Проверяйте систему координат: глобальная позиция персонажа и координата ячейки не равны при смещённом или масштабированном корне мира.
Сохранение изменений
Генератор умеет восстановить исходный мир, но не обязан сохранять действия игрока. Для постоянных изменений назначьте поддерживаемый stream, используйте доступную операцию сохранения изменённых блоков и дождитесь завершения записи.
Сохраняйте игровые данные вне неизменяемого asset://, обычно в user://. Проверьте конкретный stream и состав сохраняемых каналов. Если после перезапуска возвращается исходный ландшафт, убедитесь, что чтение использует тот же stream и каталог.
Производительность и ограничения
Начните с малого диапазона загрузки. Отдельно измеряйте генерацию, построение мешей, физику и отрисовку: небольшое число видимых треугольников не гарантирует дешёвую генерацию.
Не стройте коллизии и густой декор на всей дальней области. У гладкого мира проверяйте переходы LOD, особенно после редактирования границ блоков. GPU-генерация зависит от рендерера и сборки; наличие настройки не означает доступность на любом устройстве.
Установленная Web-поставка C# использует отдельные ограничения браузерного выполнения. Изменения кооперативного выполнения voxel-задач и WebGPU относятся к более новым исходным сборкам и не означают, что установленный Web-шаблон уже обновлён. При выборе Web проверяйте именно используемый шаблон.
| Симптом | Что проверить |
|---|---|
| Мир пуст | Viewer, диапазон загрузки, генератор, mesher и материал |
| В редакторе есть, в игре нет | Положение игрового viewer и активность камеры |
| Блоки видны, персонаж проваливается | Запрос коллизий и физические слои/маски |
| Правка данных не видна | Канал, координаты и обновление геометрии через инструмент мира |
| Изменения пропадают | Stream, каталог и завершение записи |
API: VoxelBuffer, VoxelLodTerrain, VoxelViewer.