Разрушаемость в Unity ч.2
Ранее я писал пост про разрушаемость в Unity. В результате я получил отличные замечания и решил довести механику разрушений до ума. Ссылка на репозиторий проекта из видео в конце поста.
Основной комментарий, который убедил меня дорабатывать логику:
"Сразу бросилось в глаза, что верхняя часть, которая находится выше объекта разлетается на осколки, ниже объекта остаётся нетронутой, как будто материал не идентичный"
Второй момент, который я хотел проработать это оптимизация.
Для начала скажу очевидное: чтобы был весь контекст посмотрите первый пост, там не так много.
Добавляем реализм
То, что верхняя часть колонны разлеталась на маленькие кусочки следствие того, что мы разом высвобождаем все фрагменты графа, которые не связаны с якорными точками.
Для решения проблемы я написал функцию, которая объединяет все связанные фрагменты в одного родителя.
Каждый из маленьких кусочков при этом лишается собственной физике, но сам родитель получает Rigidbody с массой равной сумме фрагментов и BoxCollider, вмещающий в себя ровно все кусочки.
И уже с этим родителем мы поступаем как с обычным фрагментом, это мы уже умеем.
Таким образом, если после разрушения есть повисшие в воздухе группы фрагментов, мы высвобождаем их пачками, которые находятся в связных подграфах.
Для того, чтобы выглядело ещё интереснее я предварительно дроблю каждый такой компонент на пару случайных кусков.
Для этого используется функция SplitGraphComponent. В которой случайным образом выбираются вершины по количеству необходимых кусков и из каждой мы обходим граф в ширину получая из одной компоненты связности N различных подграфов.
Оптимизируем
Тут всё намного прозаичнее. Выключаем то, что уже не нужно.
Для каждого фрагмента, который высвобождается из конструкции мы сразу отключаем триггер SphereCollider.
А через 2 секунды после высвобождения все куски, которые остановились мы лишаем физики, остаётся только меш в том месте, где остановил своё движение его Rigidbody.
Сам меш также удаляется со сцены по истечении определенного времени.
Вот, как это происходит наглядно:
Спасибо за внимание! Как и обещал, ссылка репозиторий и телеграм.