Настройка процедурной генерации уровней в играх
Roguelite без процедурной генерации — не roguelite. Survival-sandbox с фиксированными картами — теряет реиграбельность после первых часов. Процедурная генерация — не модный термин, это архитектурное решение, которое требует серьёзного проектирования. Сделанная небрежно, она генерирует «мусорные» уровни: непроходимые коридоры, изолированные комнаты, скучную равномерность вместо интересного разнообразия.
Ключевые подходы к генерации
BSP (Binary Space Partitioning). Рекурсивное деление пространства на прямоугольные секции, в каждой — комната, между комнатами — коридоры. Классика dungeon crawler: Rogue, NetHack. Плюс — гарантированная проходимость. Минус — прямоугольная монотонность без дополнительного post-processing.
Wave Function Collapse (WFC). Алгоритм, использующий ограничения совместимости между тайлами. Каждая ячейка имеет набор допустимых состояний; при выборе состояния соседние ячейки получают ограничения. Результат — органичные структуры с высоким контроль качества через набор правил. Работает с 2D-тайлами и 3D-воксельными структурами. В Unity — готовые реализации на GitHub (mxgmn/WaveFunctionCollapse), есть поддержка в движке через TilemapRule.
Noise-based terrain. Для открытых миров — Perlin Noise, Simplex Noise или более современный Domain-Warped FBM (Fractional Brownian Motion). Unity Terrain с TerrainData.SetHeights() принимает 2D float array — генерация высот через шум делается за 30 строк кода. Сложность начинается с биомов: переходы между биомами, размещение объектов по биому, контроль плотности.
Grammar-based генерация. Для нарративных уровней с обязательными событиями: граф прохождения описывается через правила (start → combat → loot → boss → exit), генератор строит уровень, обеспечивающий этот граф. Применяется в action-roguelite, где важна драматургия прохождения, а не только разнообразие.
Самая сложная часть — контроль качества
Генерация работает, но не каждый сгенерированный уровень «хороший». Три проблемы, которые возникают всегда:
Гарантия проходимости. Flood fill или pathfinding (A*) от точки входа ко всем ключевым точкам (выход, обязательные предметы, боссы). Если pathfinding не находит путь — перегенерация. Важно: перегенерация должна быть быстрой (< 16ms на мобильном), иначе игрок видит задержку при загрузке.
Избыточная равномерность. WFC и BSP без дополнительных правил дают «пресный» результат — нет акцентов, нет интересных мест. Решение: явные «якорные» точки (anchor rooms): стартовая комната, босс-комната, секретная комната — генерируются по фиксированным шаблонам и размещаются в обязательных позициях. Остальное — процедурное.
Слишком пустые или слишком заполненные уровни. Размещение объектов (врагов, предметов, ловушек) нельзя делать pure random — получается или пустыня, или непроходимое скопление. Работающий подход: Poisson Disk Sampling для равномерного распределения с минимальным расстоянием между объектами + весовые коэффициенты по типу комнаты и расстоянию от старта.
Пример реализации на Unity
Типичная архитектура для 2D dungeon-генератора:
LevelGenerator
├── RoomGenerator — BSP / шаблоны
├── CorridorConnector — соединение комнат
├── ValidityChecker — flood fill проходимости
├── PopulationSystem — расстановка объектов
└── TilemapPainter — запись в Tilemap
LevelGenerator принимает LevelConfig (ScriptableObject с seed, размерами, параметрами) и возвращает LevelData — граф комнат с метаданными. TilemapPainter рендерит LevelData в Tilemap с нужным набором тайлов. Разделение генерации и рендеринга позволяет использовать один генератор для разных визуальных тем (dungeon, cave, ship).
Seed для воспроизводимости. Random.InitState(seed) перед генерацией — и тот же seed всегда даёт тот же уровень. Это нужно для: шеринга уровней между игроками (Daily Run в roguelite), дебаггинга конкретного уровня, серверной валидации прохождения.
Производительность генерации
На мобильных устройствах генерация должна укладываться в загрузочный экран. Ориентиры:
- 50×50 тайловый уровень (BSP + population) — 5–20ms на среднем Android
- 200×200 тайловый уровень — уже требует разбивки на chunks с async генерацией
- Terrain 512×512 через Perlin Noise — 50–200ms, обязательно в async/Thread
Unity Job System позволяет вынести вычисления noise-генерации в бурст-компилированный job — ускорение в 5–10 раз по сравнению с managed кодом.
Этапы работы
- Анализ требований — тип генерации под жанр и механики.
- Прототип алгоритма — быстрая проверка подхода без финального арта.
- Контроль качества — валидатор уровней, итерация правил.
- Интеграция контента — тайлсеты, шаблоны якорных комнат.
- Производительность — профилирование, async, Job System.
- Параметризация — конфиги для геймдизайнера (сложность, размер, плотность).
| Масштаб | Срок |
|---|---|
| Базовый BSP dungeon-генератор (2D) | 2–4 недели |
| WFC-генератор с контролем качества | 4–8 недель |
| Noise-based открытый мир с биомами | 6–12 недель |
Стоимость определяется после анализа жанра, платформы и требований к разнообразию уровней.





