Как разрушить всё при помощи Unity?

Мой новый проект – про полностью уничтожаемое окружение. Герой может разрушать и пожирать абсолютно всё, на что упадёт взгляд игрока. Мы проходим по карте безжалостным огненным смерчем, сметающим здания, предметы и врагов. А для этого нужно сделать так, чтобы окружение весело взрывалось, шустро ломалось и бодро разлеталось клочками по закоулочкам. Но в моём любимом Unity разрушаемость «из коробки» (в отличие от UE) пока не завезли. Потому я отправился в глубины Asset Store на поиски подходящей системы разрушаемости…

Цена: 75$

Первое, на что я наткнулся. Вот прямо на главной странице Asset Store. Самая разрекламированная и известная из систем разрушаемости под Unity. По заверениям разработчиков - всё умеет, всё может, всё поддерживает. Казалось бы, не система, а «мечта поэта». А похвастаться, и правда, DestroyIt есть чем:

  • Делает красиво. Пожалуй, красивее всех конкурентов.

  • Очень шустрая, даже когда ломаются сотни предметов одновременно.

  • Реализованы составные конструкции – из нескольких элементов, соединённых между собой. Хороший пример – охранная вышка на 4 опорах, накреняющаяся после повреждения одной-двух, и падающая после их уничтожения.

  • Есть система повреждений от ударов, падений и проч.

  • Поддержка прогрессивного урона (предмет по мере повреждения покрывается трещинами, искрит, и т.п.).

  • Куча мелких полезностей - возможность чинить сломанные предметы, системы повреждения для транспорта и деревьев.

  • Неплохая документация и примеры.
Пример ломающейся вышки (из документации DestroyIt)
Пример ломающейся вышки (из документации DestroyIt)

Важное замечание. Многие системы разрушаемости предполагают, что у разработчика на руках есть две модели: одна «целая», а вторая – набор «осколков». Я не ААА-студия, а хобби-разработчик – поэтому у меня нет нескольких месяцев на то, чтобы прогнать сотни моих моделей через Blender с его cell-fracture. Система должна сама разделять объекты на фрагменты. Или в runtime, или хотя бы внутри Unity.

И тут проблема – DestroyIt как раз из того многочисленного племени систем разрушаемости, что поддерживают разрушение только предварительно разделённых на фрагменты в 3D-редакторе объектов («pre-shattered»). Подход-то вполне жизнеспособный, но для моей задачи не подходит. Ну и по мелочи, из недостатков – сложной показалась настройка составных конструкций (до конца не раскопал, как там что делается), плюс не самый очевидный API.

Поехали дальше.

Цена: 180$ (скока-скока?!)

Мне слегка поплохело, когда я увидел цифру в графе «стоимость». Впервые-то я пощупал эту систему ещё в те времена, когда она была совсем молодой и бюджетной (долларов 45, если память мне не врёт). Это сейчас она обросла толстым жировым слоем из всяких редакторов верёвок и авто-LODов...

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

  • Умеет разбивать модели на фрагменты внутри себя (правда, только двумя алгоритмами – BSP и по Вороному). Без рантайма, только в редакторе.

  • Поддерживаются составные конструкции, причём редактор прост и удобен. Плюс, можно явно задать точки опоры и условия "отваливания" фрагментов, оставшихся без опоры.

  • Гибкий API с хорошими примерами – тут тебе и удары, и взрывы, и выстрелы, и разрушение предмета по появлению другого, и «быстрая незапланированная разборка».

  • Есть адаптация под мобилки.

Так почему бы не остановиться на ней?

Во-первых, Fracturing & Destruction не сумела «сломать» некоторые из моих объектов - то отказываясь корректно дробить их на части, то показывая мешанину из текстур. То ли незамкнутые границы объекта ей не понравились, то ли полости в объекте. Возможно, тут виноваты сами модели – но тут уже что имеем, от того и работаем.

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

В общем, платить за такое добро 180 долларов – мне показалось слишком жадно. Хотя, повторюсь, сама по себе система достойная.

Цена: 35$

Пожалуй, самая старая из ныне живущих систем разрушаемости. Только одних отзывов в Asset Store - 215 штук!

Прост в использовании как автомат Калашникова – размещаешь компонент на объекте, вызываешь у него функцию Explode, и получаешь большой «БУХ» и много маленьких ошметок.

Пожалуй, Exploder - самое «из-коробочное» решение из всех. Плюс, умеет в интеграцию с UFPS. Ну и результат выглядит неплохо, без дураков. Правда, на этом достоинства Exploder-а кончаются. А вот минусы:

  • Ассет толком не поддерживается с 2018 года – у некоторых пользователей возникают необъяснимые ошибки в последних версиях Unity.

  • Часть кода реализована в DLL, отчего невозможно отыскать ошибки, и непонятно, соберётся ли проект под мобильные платформы.

  • Разрушения ТОЛЬКО в рантайме (и ТОЛЬКО «по Вороному») - потому при больших «бухах» иногда начинает подтормаживать.

  • Нет поддержки составных конструкций.

  • Некоторые объекты (особенно с полостями) всё-таки ломаются некорректно.

  • Если от разрушаемости нужно что-то сложное или нестандартное – будь добр, пиши это сам.

В целом, Exploder не так уж и плох для бедного и нетребовательного инди. Он прост, он делает своё дело, работа с ним не вызывает боли и страданий. Но лично я хотел всё-таки чего-то... пофункциональнее, что ли. И понадёжнее. И покрасивее. Потому – поехали дальше.

Интермедия: бесплатные альтернативы

Заглядывайте на GitHub почаще. Иногда там встречаются удивительные артефакты, и совершенно бесплатно.

К сожалению, сейчас эта сокровищница человеческой мысли не смогла меня порадовать. Всё, на что я наткнулся в плане разрушаемости – это либо системы в виде концепт-демок, либо «порежьте сами в Блендере, а мы тут вам всё красиво обыграем».

Тем не менее, есть пара очень любопытных штук, над которыми я «залип». Например, шейдер, красиво расчленяющий объект на полигоны. Это не та разрушаемость, которую я искал - но эстетично:

А вот другой заслуживающий внимания экземпляр - разрушение объектов при помощи библиотеки NVBlast. Красиво, быстро и невероятно перспективно, но... автор не довёл это дальше, чем до уровня техно-демо:

Посмотрели? А теперь к цели наших поисков!

Цена: 170$

Титан от мира разрушаемости, существующий также в виде standalone-программы, плагинов к 3D Max, Maya и Blender. Возвышается над большинством ассетов как Photoshop над MS Paint-ом. Давит пользователя обилием функционала и сложностью.

Проще назвать, что этот гигант не умеет, чем перечислить все его функции. Из полезного мне, может он:

  • Разбивать модели на фрагменты, в рантайме и в редакторе, используя ВОСЕМЬ разных алгоритмов.

  • Создавать составные конструкции, причём учитывать точки опоры, напряжения в конструкции и деградацию состояния конструкции по времени (т.е. слегка повреждённый дом может продолжать рассыпаться).

  • Реализовывать многоуровневые разрушения (а-ля Control), имеет систему повреждения материалов.

  • Симулировать на сложных моделях разрезы мечом, прострелы пулей, подрывы бомбами, да хоть бы даже и протыкание пальцем.
  • Осколки могут под действием силы динамически раскалываться на более мелкие фрагменты.

  • Осколки при повреждении рассыпают мусор (debris) и пыль.
  • Огромное множество вариантов активации всего функционала.

Выглядит сказочно, правда? Я был просто очарован, когда увидел промо-ролик и демки. Однако, очень скоро я понял, что RayFire хороша лишь с обложки. В нутре у неё - боль и страдание (а также куча TODO в коде).

Начать с того, что RayFire поставляется без внятной документации. Нам предлагается набор видео-уроков в стиле «программист бормочет под нос сам для себя». На каждую маловажную деталь уходит по четверть часа пространных рассуждений, а общие идеология и принципы работы толком не рассказываются. Хорошо работают эти уроки только в качестве снотворного – уже через полторы минуты просмотра я засыпаю здоровым, крепким сном :)

Набор настроек у каждого компонента в RayFire больше напоминает панель инопланетного космолёта, с десятками различных шкал, стрелочек и рычагов.

Под большинством свёрнутых пунктов скрывается ещё от 3 до 15 параметров. 
Под большинством свёрнутых пунктов скрывается ещё от 3 до 15 параметров. 

Да, к каждому из компонентов идёт документ-описание, но состоит он из строчек в духе «настройка тирьям-пам-пации – регулирует уровень тирьям-пам-пации при коллапсе, устанавливайте не более трёх д'зиргов на один эрг».
Очень полезно, спасибо! Контекстные подсказки и то помогают больше...

Местами совершенно непонятно, как решать возникающие проблемы. Вот случай из практики: возьмём префаб стены из стандартного примера (с настроенными компонентами разрушаемости).
Возьмём RigidBody потяжелее и бросим в неё со всей силы. Она сломается, красиво осыпавшись градом каменной крошки, оседая в облаках пыли, и разлетевшись на множество достоверных осколков.

Хорошо, а теперь возьмём модель этой стенки, и сами навесим на неё те же компоненты с теми же настройками. Что произойдёт? А вот что - стенку мгновенно разорвёт на сотню маленьких медвежат, усеяв её фрагментами всю сцену!

Но… как? Почему не работает? Что я сделал не так в стандартном, блин, примере?! Нет ответа.

И только спустя 3 часа экспериментов вида «изменим один параметр, вдруг сейчас не бахнет» мы натыкаемся (среди трёх экранов загадочных настроек) на мааааленькую и хорошо запрятанную галочку, свидетельствующую о том, что, видимо, по умолчанию в этом компоненте RayFire отключено масштабирование коллайдеров под масштаб объекта! «Главное для программиста качество - это уметь выдерживать огромные уровни фрустрации».

Тем не менее, реальной альтернативы RayFire под Unity я пока что не нашёл. Хочешь разрушаемости - будь готов бороться за неё. Система своевольна, упряма и непонятна – но... какие же крутые вещи она позволяет создавать!

Вот посмотрите на то, как будут выглядят разрушения в моей новой игре «Feed The Sun». Здесь использован гибридный подход - в самом начале падение зданий сделано через анимацию, а вот ближе к концу они разрушаются при помощи RayFire:

Тут не задействован pooling, потому в интенсивных местах игра пока тормозит. Как говорится, "не отражает финального качества".

Если Вам понравилось, то подпишитесь на мой Телеграм-канал, где я рассказываю о ходе разработки игры.

Хотели бы Вы увидеть продолжение темы разрушаемости?

5353
9 комментариев

Сперва подумал, что статья про создание системы разрушаемости, а по итогу - шоппинг в ассетсторе. Печально

16
Ответить

На GitHub есть бесплатная библиотека EzySlice, которая позволяет резать полигональные сетки плоскостями - отличный вариант для создания своей разрушаемости.

7
Ответить

Штука очень крутая, безусловно, но нишевая. Если кто-то делает игру про мечника - пожалуй, оно хорошо. А вот порезать модель на произвольные куски "в форме щепочек" она не может (хотя, может, я не разобрался).

1
Ответить

а я думал, что это статья про hybridrenderer v2 и ECS... :-)

3
Ответить

Комментарий недоступен

1
Ответить

Комментарий недоступен

1
Ответить

Blast - очень мощная система от NVidia.
Если протирать время и разобраться в ней от начала и до конца, можно потом делать плато божественные разрушения. У системы есть ограничения, и их надо не упускать из внимания.

Если рассматривать движок Unreal engine, то у него есть собственная система физики Chaos, которая ничем не уступает нвидиа, и даже чем-то круче. Но пока что сырая, поэтому если только побаловаться.

А всё остальное, все самописные физики за деньги - это просто переработки готовой физики от нвидиа. Физика - это очень и ооооооооочень большой объем работы, поэтому надо смотреть на решения, которые представляют те, кто на этом уже собаку схавал. В данном случае, это нвидиа. И только они.

Что касается разрушения, то это, повторюсь, бласт, апекс от нвидиа и Гудини. И хаос от анрила.

1
Ответить