Реалистичный ландшафт blender engine bge

Создаем разрушаемые объекты в Unreal Engine 4 и Blender

Современные игры становятся все реалистичнее, и один из способов этого добиться — создать разрушаемое окружение. К тому же, крушить мебель, растения, стены, здания и целые города просто весело.

Наиболее яркими примерами игр с хорошей разрушаемостью можно назвать Red Fraction: Guerrilla с ее возможностью пробивать тоннель сквозь Марс, Battlefield: Bad Company 2, где при желании можно превратить весь сервер в пепелище, и Control с его процедурным разрушением всего, что попадается на глаза.

В 2019 году Epic Games представила демо новой высокопроизводительной системы физики и разрушений Chaos движка Unreal. Новая система позволяет создавать разрушения разного масштаба, имеет поддержку редактора эффектов Niagara и при этом отличается экономным расходованием ресурсов.

А пока Chaos находится на стадии бета-тестирования, поговорим об альтернативных подходах к созданию разрушаемых объектов в Unreal Engine 4. В этой статье один из них опишем подробно.

Требования

Начнем с перечисления того, чего мы хотели бы достичь:

  • Художественный контроль. Мы хотим, чтобы наши художники могли создавать разрушаемые объекты, как им угодно.
  • Разрушения, не влияющие на геймплей. Они должны быть чисто визуальными, не нарушать ничего, что связано с игровым процессом.
  • Оптимизация. Мы хотим иметь полный контроль над производительностью и не допустить снижения производительности ЦП.
  • Простота установки. Настройка конфигурации таких объектов должна быть понятна художникам, поэтому необходимо, чтобы она включала только необходимый минимум шагов.

За референс в этой статье было взято разрушаемое окружение из Dark Souls 3 и Bloodborne.

Основная идея

На самом деле, идея проста:

Читайте также:  Идеальные цветы для клумбы

  • Создаем видимую базовую сетку;
  • Добавляем скрытые части сетки;
  • При разрушении: скрываем базовую сетку -> показываем ее части -> запускаем физику.

Подготовка ассетов

Для подготовки объектов будем использовать Blender. Для создания сетки, по которой они будут разрушаться, используем аддон Blender под названием Cell Fracture.

Включение аддона

Сначала нам понадобится включить аддон, поскольку по умолчанию он выключен.


Включение аддона Cell Fracture

Поиск аддона (F3)

Затем включаем аддон на выбранной сетке.

Настройки конфигурации

Запуск аддона

Посмотрите видео, сверьтесь с настройками оттуда. Убедитесь, что вы правильно настроили свои материалы.

Выбор материала для разворачивания разрезанных частей

Затем создадим UV-карту для этих частей.

Добавляем разделение границ (Edge Split)

Edge Split исправит затенение.

Модификаторы ссылок

Их использование позволит применить Edge Split ко всем выбранным частям.

Завершение

Вот как это выглядит в Blender. По сути, нам не нужно моделировать все части по отдельности.

Реализация

Базовый класс

Наш разрушаемый объект — это Актер, у которого есть несколько компонентов:

  • Корневая сцена;
  • Static Mesh — базовая сетка;
  • Бокс для столкновений;
  • Бокс для перекрытий;
  • Радиальная сила.

Изменим кое-какие настройки в конструкторе:

  • Отключим функцию таймера Tick (вообще никогда не забывайте отключать ее для актеров, которым она не нужна);
  • Устанавливаем статичную мобильность для всех компонентов;
  • Отключаем влияние на навигацию;
  • Настраиваем профили столкновений.

В Begin Play мы собираем некоторые данные и настраиваем их:

  • Ищем все части с тэгом «dest»;
  • Настраиваем столкновения для всех частей, чтобы художнику не нужно было думать об этом;
  • Устанавливаем статичную мобильность;
  • Скрываем все части.

Триггеры разрушения

Существует три способа спровоцировать разрушение.

Разрушение происходит в том случае, когда кто-то бросает или каким-либо другим образом использует предмет, активирующий процесс, — например, катящийся мяч.

Разрушаемый объект получает урон.

В этом случае один разрушаемый объект накладывается на другой. В нашем случае для простоты они оба ломаются.

Флоу разрушения объекта


Диаграмма разрушения объекта

Что делать с функцией сна

Когда срабатывает функция Sleep, мы отключаем физику/столкновения и устанавливаем статичную мобильность. Благодаря этому производительность увеличится.

Каждый примитивный компонент с физикой может перейти в режим сна. Привязываемся к этой функции при разрушении.

Эта функция может быть присуща любому примитиву. Мы привязываемся к ней для завершения действия над объектом.

Читайте также:  Как делаются крыши для беседки

Иногда физический объект не переходит в режим сна и продолжает обновляться, даже если вы не видите при этом никакого движения. Если он продолжает моделировать физику, мы заставляем все его части перейти в режим сна спустя 15 секунд.

Что делать с разрушением

Нам необходимо проверить, можно ли разрушить актера (например, если игрок далеко). Если нет, проведем проверку повторно спустя некоторое время.

Вызов узла OnHit для частей объекта

В нашем случае Blueprints отвечают за аудиовизуальную часть игры, поэтому мы добавляем события Blueprints там, где это возможно.

End Play и очистка

В нашу игру можно играть в редакторе по умолчанию и некоторых пользовательских редакторах. Вот почему нам нужно очистить в EndPlay все, что можно.

Конфигурация в Blueprints

Конфигурация здесь проста. Вы просто помещаете части, прикрепленные к базовой сетке, и помечаете их как «dest». Вот и все.

Графическим художникам не нужно ничего делать в движке.

Наш базовый класс Blueprint выполняет только аудиовизуальные вещи из событий, которые мы предоставили на C ++.

BeginPlay — загружает необходимые ассеты. По сути, в нашем случае каждый ассет представляет собой указатель на программный объект, и необходимо использовать их даже при создании прототипов. Жестко запрограммированные референсы ассетов увеличат время загрузки редактора/игры и использование памяти.

On Break Event — отвечает на эффекты и звуки появления. Здесь вы можете найти некоторые параметры Niagara, которые будут описаны позже.

On Part Hit Event — вызывает эффекты и звуки ударов.

Утилита для быстрого добавления столкновений

Можно использовать Utility Blueprint для взаимодействия с ассетами, чтобы генерировать коллизии для всех частей объекта. Это намного быстрее, чем создавать их самостоятельно.

Эффекты частиц в Niagara

Далее описывается создание простого эффекта в Niagara.

Материал

Ключевой в этом материале является текстура, а не шейдер, так что он действительно очень простой.

Эрозия, цвет и альфа берутся из Niagara.


Канал текстуры R


Канал текстуры G

Большая часть эффекта достигается текстурой. Можно было бы еще использовать канал B, чтобы добавить больше деталей, но в настоящее время нам он не нужен.

Параметры системы Niagara

Мы используем две системы Niagara: одну для эффекта разрыва (она использует базовую сетку для порождения частиц), а другую — при столкновении деталей (без статичного расположения сетки).

Читайте также:  Низкие ограды для газонов


Пользователь может указать цвет и количество спаунов и выбрать статичную сетку, которая будет использоваться для выбора расположения спауна частиц

Niagara Spawn Burst


Здесь задействуется пользователь int32 для того, чтобы иметь возможность настроить счетчик появления для каждого разрушаемого объекта

Niagara Particle Spawn

  • Отбираем статичную сетку из разрушаемых объектов;
  • Устанавливаем случайные время жизни (Lifetime), массу и размер;
  • Выбираем цвет из пользовательских (он задается разрушаемым актером);
  • Создаем частицы в вершинах сетки,
  • Добавляем случайную скорость и скорость вращения.

Использование статичной сетки

Чтобы иметь возможность использовать статичную сетку в Niagara, на вашей сетке должен быть установлен флажок AllowCPU.

СОВЕТ: В текущей (4.24) версии движка, если вы повторно импортируете свою сетку, это значение будет сброшено на значение по умолчанию. А в доставочной сборке, если вы попытаетесь запустить такую систему Niagara с сеткой, у которой не включен доступ к ЦП, произойдет сбой.

Поэтому добавим простой код для проверки, установлено у сетки это значение.

Он используется в Blueprints до Niagara.

Можно создать виджет редактора для поиска разрушаемых объектов и установить их переменную Base Mesh AllowCPUAccess.

Приведем код на Python, который ищет все разрушаемые объекты и устанавливает доступ ЦП к базовой сетке.

Вы можете запустить его напрямую с помощью команды py или создать кнопку для запуска кода в Utility Widget.

Обновление частиц Niagara

При обновлении мы проделываем следующие вещи:

  • Масштабируем Alpha Over Life,
  • Добавляем curl noise,
  • Изменяем скорость вращения в соответствии с выражением: (Particles.RotRate * (0.8 – Particles.NormalizedAge);
  • Масштабируем параметр частиц Size Over Life,
  • Обновляем параметр размытия материала,
  • Добавляем вектор шума.

Отчего такой довольно олд-скульный подход?

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

Что же касается Chaos, подождем, когда он будет готов к полноценному релизу, и тогда посмотрим на его возможности.

Источник статьи: http://habr.com/ru/company/pixonic/blog/517684/

Оцените статью