Dynamic Bridge
Создание динамического sci-fi моста в Unreal Engine 4.
Привет всем!
Как создать динамический мост с возможностью его регулировки по длине?
Для формирования структуры моста понадобится несколько Static Meshes:
- Основная секция моста, которая будет приводится в движение
- Начальная (она же конечная секция) моста с расположенными местами под цилиндрические пины
- Секция боковых перил
- Начальная секция перил
- Модель выдвигающихся пинов
Технически мост состоит из нескольких основных компонентов на основе Hierarchical Instanced Static Mesh component:
- Левая сборная сторона моста
- Правая сборная сторона моста
- Левая составная сторона перил
- Права составная сторона перил
Регулировка по длине происходит с помощью добавления нужного количества копий Instances в Hierarchical Instanced Static Mesh comp:
Благодаря тому, что геометрия ренедрится с помощью HISM это не создаёт нагрузку в виде дополнительных draw call для каждой копии и мы имеем возможность неограниченной длины для моста в разумных пределах без потери производительности.
HISM поддерживают Lods, что позволяет еще сократить нагрузку на рендер, рисуя секции моста с более низкой детализацией в зависимости от их размера на экране.
Стартовая и сборная секции созданы из расчета ширины в 1 метр. Минимальная длина моста 4 метра плюс 2 метра на стартовую и конечную секцию.
Дополнительно используется несколько Static Mesh для начальной и конечной секции моста, стартовых секций и финальных секций перил и двух выдвигающихся цилиндрических пинов:
Сборка и разборка моста происходит следующим образом:
Формируется массив transform’ов для каждой в зависимости от кол-ва секций моста. . Каждый transform рассчитывается исходя из параметр BlendTime, который может иметь значение от 0 до 1.0.
Если значение BlendTime отрицательно мы его отсекаем с помощью clamp float до значения 0.
Чтобы секции моста разбирались с отставанием всё что нужно - заполнить массив BlendTime начиная от значение 0 для первой секции и далее с заданным шагом в отрицательную сторону для всех остальных секций.
Т.е. получим массив в виде:
0.0, -0.1, -0.2, -0.3 ….. - 3.0
Каждое значение в массиве соответствует одной секции моста.
Пересчитывая и изменяя эти значения в положительную сторону (с учетом delta time) мы получаем значение, которое используется для интерполяции между стартовым Rotation и целевым Rotation.
Далее, просчитанные transform поворота мы отправляем в HISM с помощью функции Batch Update Transfoms, которая на вход принимает массив transform'ов:
В зависимости от состояния моста - разобран или собран целевые и стартовые Rotation равны 0 или 90 градусов для Pitch.
Дополнительно в актёре моста присутствуют collision shape для блокировки проходимости моста в момент процесса сборки/разборки в районе выдвигающихся пинов и боковые collision объемы ограничивающие движение персонажа в зоне перил.
Звуковой компонент состоит из трёх частей:
- Стартовый звук
- Зацикленный (seamless) звук во время поворота секций
- Финальный звук для состояния собранного/разобранного моста
Дополнительные возможности и настройки:
- Мост поддерживает “питание” от электричества. Т.е. мост для работы использует “электричество” от Power Box. Если электричество иссякло, процесс сборки-разборки останавливается в текущей стадии либо не может быть запущен.
- Отдельная регулировка скорости сборки и разборки моста
- Batch разборка моста - все секции поворачиваются одновременно без расхождений в углах поворота
- Настраиваемое расхождение между секциями
- Стартовое состояние: собран или разобран
- Индикация на секциях: красным разобрано, голубым - мост собран
На сегодня всё, благодарю за внимание!