Модульная сборка это способ построить большой уровень из небольшого набора повторяющихся кусков. Экономия огромная, но держится она на дисциплине: стоит один раз нарушить сетку, и куски перестают стыковаться, а весь смысл подхода пропадает. Как организовать общие данные между файлами, разобрано в материале про линковку и библиотеки.
Пройдём по тому, как выбрать шаг, из чего собирать набор, какие правила стыковки работают и как прятать однообразие повторов.

Сетка: с чего всё начинается
Первое решение определяет всё остальное.
Шаг сетки это базовое расстояние, кратно которому строятся все куски. Выбирается он один раз и не меняется, потому что смена шага означает переделку всего набора.
Как выбирать. Отталкиваться от роста персонажа и размеров проходов: коридор должен быть кратен шагу и при этом комфортен для перемещения. Брать число, удобное для деления пополам: половина шага понадобится постоянно.
Типичная ошибка новичка: выбрать слишком мелкий шаг. Уровень тогда собирается из тысяч кусочков, и работа превращается в мозаику.
Вторая ошибка: выбрать слишком крупный. Пространства становятся однообразными, потому что нет промежуточных размеров.
Что входит в набор
Минимальный комплект, покрывающий большинство ситуаций.
Стены. Прямая, с дверным проёмом, с оконным, глухая. Все одной высоты и ширины.
Углы. Внутренний и внешний. Их часто забывают, и потом стены не сходятся.
Полы и потолки. Плита в размер ячейки, плюс варианты с отверстиями под лестницы.
Переходы. Лестницы, пандусы, проёмы между уровнями.
Декор. Балки, трубы, карнизы, которые накладываются поверх и ломают однообразие.
Правило, экономящее месяцы: сначала сделать серый набор без текстур и собрать на нём весь уровень. Только после того, как планировка утверждена, доводить куски.
Точка отсчёта и ориентация
Техническая мелочь, от которой зависит вся сборка.
У каждого куска должна быть точка отсчёта в предсказуемом месте: обычно в углу основания, а не в центре. Тогда кусок при установке садится в ячейку сетки без ручной подгонки.
Ориентация осей должна быть одинаковой у всех кусков набора. Стена, вывернутая на 90 градусов относительно остальных, ломает привязку.
Проверка простая: поставить кусок в начало координат и посмотреть, куда он смотрит. Если каждый смотрит в свою сторону, набор придётся править.
Эта же дисциплина важна при переносе сцены между пакетами, о чём говорится в материале про перенос экстерьерной сцены в UE5.
Правила стыковки
То, что отличает работающий набор от набора красивых кусков.
Границы плоские. Место стыка должно быть ровным и одинаковым у всех кусков. Любая выпуклость на границе означает, что соседний кусок с ней не сойдётся.
Геометрия на границе совпадает. Если у одного куска на краю три яруса кирпича, у соседнего должно быть столько же.
Текстура продолжается. Развёртка на границе выстроена так, чтобы рисунок не обрывался.
Шов прикрывается декором. Даже при идеальной стыковке шов видно на просвет. Балка или стойка на стыке решает вопрос надёжнее, чем попытки добиться идеала.
Как бороться с однообразием
Главный упрёк модульным уровням: всё выглядит одинаково.
Варианты одного куска. Три версии стены вместо одной, отличающиеся деталями, уже сильно меняют картину.
Накладной декор. Отдельные объекты, ставящиеся поверх базовой геометрии в произвольных местах.
Поворот и зеркалирование. Один и тот же кусок, повёрнутый на 180 градусов, читается иначе.
Свет. Самое сильное средство: одинаковые коридоры с разным освещением воспринимаются как разные места.
Наполнение. Мебель, ящики, следы обитания. Они разрушают ощущение шаблона сильнее, чем разнообразие самих стен.
Крупные и мелкие куски
Вопрос баланса, на который отвечают по ходу проекта.
Мелкие куски дают гибкость: из них можно собрать что угодно. Но их много, сборка долгая, а количество объектов в сцене растёт.
Крупные куски собираются быстро и дают меньше объектов, но ограничивают планировку.
Рабочий компромисс: базовый набор среднего размера плюс несколько крупных готовых блоков для типовых помещений, которые повторяются часто.
Уровень, собранный целиком из мелочи, обычно тормозит не из-за полигонов, а из-за количества отдельных объектов.
Развёртка и текстуры набора
Место, где модульность даёт второй выигрыш после геометрии.
Куски набора делят один атлас, и это не только вопрос производительности. Общая текстура означает, что стена и угол выглядят одним материалом, а не двумя похожими.
Как это устроено на практике. Базовая поверхность берёт бесшовную текстуру с тайлингом: она повторяется и не требует уникальной развёртки. Уникальные детали, потёртости и надписи добавляются отдельным слоем поверх.
Такой подход развязывает размер куска и разрешение текстуры: стена длиной в два шага выглядит так же чётко, как в один.
Что проверять на границах. Масштаб текстуры одинаков у всех кусков набора. Направление развёртки совпадает. Рисунок не обрывается на стыке.
Расхождение масштаба между кусками это самая заметная ошибка в модульных уровнях: геометрия сходится, а материал выдаёт шов мгновенно.
Коллизии
То, о чём вспоминают перед тестированием.
Коллизия модульного куска должна быть простой: несколько коробок вместо копии геометрии. Точная коллизия по мешу на сотнях объектов это прямой путь к просадке.
Стыки требуют внимания отдельно. Если коллизии соседних кусков не смыкаются, между ними появляется щель, в которую персонаж проваливается. Если перекрываются слишком сильно, в углах возникают невидимые препятствия.
Рабочий подход: делать коллизию чуть больше видимой геометрии на границе, чтобы соседние объёмы гарантированно смыкались. Лишний сантиметр внутри стены никому не мешает.
Проверять коллизии надо на собранном уровне, а не на отдельном куске: почти все проблемы возникают именно на стыках.

Производительность
Сторона, которая проявляется на большом уровне.
Повторяющиеся куски это идеальный случай для инстансинга: движок рисует их одним вызовом. Но работает это только при одинаковых материалах.
Отсюда правило: у набора должно быть минимальное число материалов, в идеале один атлас на всё. Каждый лишний материал ломает объединение.
Второй момент: мелкие декоративные куски стоит объединять в группы после того, как планировка утверждена.
Что касается детализации самой геометрии, современный подход разобран в материале про требования Nanite к моделям.
Освещение модульного уровня
Отдельная сложность, о которой думают поздно.
Запекание света на повторяющихся кусках даёт швы: соседние куски получают чуть разное освещение на границе, и стык становится виден именно по свету, а не по геометрии.
Динамическое освещение этой проблемы лишено, но стоит дороже.
Промежуточный путь: динамический свет для основного освещения и отдельные объекты, дающие локальные затемнения в углах.
Подробнее про динамический подход в материале про Lumen в UE5.
Порядок работы над уровнем
Последовательность, которая экономит переделки.
Определить шаг сетки. Сделать серый набор из простых блоков. Собрать планировку целиком и проверить её на проходимость. Утвердить. Заменить серые блоки на доведённые куски. Добавить декор и наполнение. Настроить свет. Оптимизировать.
Ключевое в этом порядке: планировка утверждается до того, как потрачено время на детализацию. Красивый кусок, который пришлось выбросить из-за смены планировки, это потерянные дни.
Чего лучше не делать
Карточки
Когда модульность не нужна
Подход не универсален.
Маленькая сцена, один кадр, уникальное пространство: там модульность создаёт накладные расходы без выигрыша.
Органические среды: пещеры, лес, скалы. Их собирают иначе, комбинируя крупные уникальные формы.
Модульность оправдана там, где пространства много и оно рукотворное: здания, коридоры, города, промышленные помещения.
Частые вопросы
Какой шаг сетки выбрать?
Отталкиваться надо от габаритов персонажа и типовых проходов, а не от красивого числа. Главное требование: шаг должен делиться пополам без остатка, потому что половинные элементы понадобятся обязательно.
Сколько вариантов одного куска нужно?
Для базовой стены обычно хватает трёх. Дальше выгоднее вкладываться в накладной декор: он даёт больше разнообразия на единицу усилия.
Делать набор в одном файле или раздельно?
Удобнее держать набор в одном исходнике: так проще следить за единой сеткой и границами. В движок куски всё равно попадают отдельными объектами.
Как проверить, что набор стыкуется?
Собрать тестовую сцену, где каждый кусок стоит рядом с каждым. Это занимает полчаса и выявляет почти все несоответствия границ.
Как быть, если нужен кусок не по сетке?
Такой кусок делают переходным: с одной стороны он кратен шагу и стыкуется с набором, с другой имеет произвольную форму. Главное, чтобы неровная сторона смотрела наружу и ни с чем не стыковалась.
Можно ли смешивать модульные и уникальные объекты?
Нужно. Уникальные объекты в ключевых точках уровня работают ориентирами и разрушают ощущение повторения. Без них модульный уровень читается как лабиринт.
Определите шаг сетки и не меняйте его. Всё остальное в модульной сборке правится, а смена шага означает переделку набора целиком.


