Ломать - не строить! Инди-разрушаемость.
Всем привет! Некторое время назад наткнулся на интересный инструмент, который сейчас использую для создания разрушаемости в своей игре.
Вчера запилил о ней дневник разработки и решил поподробнее рассказать о нём тут, может кому тоже пригодится.
Libre Fracture 2.0 - это опенсорсный инструмент для Юнити, которым можно "распилить" на куски любую модель, чтобы потом красиво её разбить. Пользоваться этой штукой довольно просто. Нажимем на него и откроется окошко плагина.
Перетаскиваем в поле Source модельку, которую хотим разломать. У неё также может быть и Mesh Collider.
Она сразу предстанет в разломанном виде, а в окошке появятся настройки:
В поле Inside Material - назначаем подходящий материал разломанных граней. У меня это простая деревянная текстура.
Дальше играемся с настройками:
Fracture Type - это алгоритм распиливания. Лучше всего работает дефолтный Voronoi. Clustered - более реалистичный вариант. Там часть кусков будет очень мелкими, а остальный - крупными. Как если бы объект разбился от удара в какое-то место. Skinned - для Skinned мешей. Ну а sliced просто нарезает ровными кусками. Полезно когда надо разрезать модель пополам, а потом ломать уже получившиеся части.
Total Chunks - сколько, собственно, куском хотим. Только водите слайдер осторожно, а лучше вбивайте число вручную. Редактор начнёт адово тормозить если случайно выставите 100+ чанков.
В поле Object Mass пишем примерный вес нашего объекта в килограммах. Это нужно для того чтобы наши обломки разлетались более-менее правдоподобно.
Почти готово! Жмём Regenerate Preview пока результат нас не устроит.
Затем жмём Create Prefab - он сделает из осколков префабы и модели и сохранит их в папку Assets/LibreFracture. Если нажать просто Generate - меши будут жить просто как свойство у объектов сцены, и переиспользовать их или залить под гит не выйдет.
В итоге у нас на сцене появился новый объект, дети которого - это осколки:
Libre Fracture добавляет в него свой Chunk Graph Manager (а в детей Chunk Node) - этот можно скрипт хранит связи осколков друг с другом и позволяет откалывать их в зависимости от применённой силы. Но у меня нанесение урона реализовано по-своему, поэтому им я не пользуюсь.
Вот, собственно, и всё. Пока объект не разрушен, имеет смысл использовать рендерер и коллейдер от исходной модели, а осколки уже активировать когда хотя бы один из них откололся - чтобы не перегружать физику и рендер.