Решил записать видео системы частиц, над которой работаю. Сейчас она называется "Hexagon Lab". Ее можно применить в очень разных играх или видео. Например, тот эффект волны, что на видео можно использовать для обьемного фона. Сейчас волна движется за камерой, но можно задать любые точки ( взрывы,порталы и т.д). Если кто-то хочет использовать такую штуку в играх - пишите, сделаю asset :)
Сегодня закончил последнего босса из AlcoInvaders. Всего их 6, как и планет. Больше всего времени заняла система разрушения боссов. Каждый из них состоит из 3-5 частей, а при взрыве эти части распадаются на мелкие кусочки. Все они будут доступны в обновлении 1.3
Привет юнити девелопер ! Сегодня хочу поделится своим опытом в создании интересного эффекта для игры.
Игра называется AlcoInvaders, поэтому события происходят в космосе.
Особенностью игры должны стать визуальные эффекты и разрушение всего,что в игре можно увидеть . Поэтому реалистичные взрывы - очень важная часть игры.
Речь пойдет о том, как сделать эффект разрушения объекта на части (mesh destruction) . В этом мне помог плагин Exploder (asset store link). При желании его можно найти и на других сайтах.
Сам плагин неплохо взрывает объекты, но когда нужно взрывать много моделей, то начинаются проблемы с производительностью. Взрывы начинают подвисать и играть становится сложно.
Чтобы решить эту проблему я немного переписал код плагина. Главная идея в том, чтобы сохранять полученные кусочки модели как ассеты и потом заменять ими модель во время взрыва. Это очень улучшает производительность и уменьшения FPS практически нету.
Вот как выглядят полученные кусочки изначально :
Чтобы создать такой взрыв - создаем в сцене объект со скриптом ExploderObject. Нужную модель отмечаем тегом "Explode" и вызываем функцию Explode() у ExploderObject. Вот его параметры.
Если поставить Force > 0 то частички будут разлетаться как при взрыве ( на скриншоте) . Но если Force =0 то частички останутся на своих местах и их можно будет сохранить. Также лучше заблокировать движение частиц через параметры Freeze Position X,Y,Z и Freeze Rotation X,Y,Z .
Для этого я изменил код скрипта FragmentPool. Ее можно вызывать сразу после разрушения нужного мэша.
Функция будет сохранять кусочки всех взорванных моделей. Поэтому для сохранения фрагментов каждого объекта лучше перезапускать сцену.
В результате полученные кусочки можно сохранить для дальнейшего использования.
В полученных фрагментах лучше убрать все скрипты и MeshCollider заменить на SphereCollider. Также частички можно пометить как отдельный layer и выключить его столкновения друг с другом (Project Setting-> Physics )
После этого все фрагменты можно объединить в один объект и прикрепить к нему скрипт взрыва. Например такой :
У нас получился объект взрыва частичек. Его нужно создавать в сцене сразу при взрыве модели ( в моем случае корабля ). Результат будет примерно такой:
Update:
- Для оптимизации можно создать low-poly модель разрушаемого обьекта и разрушать ее. При взрыве разницу будет мало заметно, даже если уменьшить колличество полигонов в 3-4 раза
(например в Maya через Polygon>Cleanup а потом Polygon>Reduce )
- Для всех полученных кусочков старайтесь использовать один и тот же материал. Это значительно уменьшит колличество Drawcall.
- Для тех, кто дочитал до конца - даю прямую ссылку на сам плагин :)Exploder 1.2
Спасибо за интерес к материалу. Подписывайтесь в twitter @Oxygamer . Буду рад любым предложениям и вопросам.