Частицы в Unity3d

Всем привет! Меня зовут Евгений Серегин, на рендер.ру я под ником lazycow Smile. Портфолио можете посмотреть тут http://evgenyseregin.wix.com/portfolio.В свое время я работал художником по спецэффектам в компании Biart. Дело было для меня новым и поэтому интересным. Давно хотел попробовать себя в данном качестве. Сейчас решил поделиться некоторым опытом Smile.

Итак, урок посвящен частицам в Unity3d. Предназначен скорее для новичков, но каждый, думаю, найдет что-то для себя интересное. Движок сегодня очень популярен и не осваивает его только ленивый. К тому же проект, над которым я сейчас работаю мы делаем тоже на Юнити.

Пару вводных фраз о самих эффектах, чтобы понимать что к чему куда и как. Мое личное мнение, что 70% отлично выглядящего эффекта составляет правильно сделанная, качественная текстура. Сюда же входят цвета, наилучшим образом передающие суть эффекта, ее размер, анимированная она или нет, с альфа каналом или без. Текстура всегда должна быть оптимальной. К примеру, нет смысла делать маленькую искру на листе 256х256. Тут достаточно 8х8 или 16х16. Оставшиеся 30% успеха создаются умело настроенным поведением частиц. Чтобы развить этот навык – смотрите больше референсов, подмечайте различные эффекты в жизни, в кино, в играх. Изучайте физику вещей. Очень хороши замедленные съемки всякого рода взрывов, выстрелов, горящего огня и т.д.
Начнем. Перед тем, как настраивать эффект необходимо определиться из каких частей он будет состоять. В нашем примере – это пламя, искры, дым и немного искажения в стиле горячего воздуха в пустыне Smile. Всегда помните, что чем проще и оптимальнее эффект, тем больше их можно использовать на сцене и тем меньше все будет тормозить. Далее мы определяемся с общим видом эффекта – что это будет. Собираем референсы, изучаем, как ведет себя огонь в горящих бочках, что там горит – это дает понимание какой будет дым по цвету и по интенсивности. Бывает неплохо набросать эффект, несколько фаз его развития на бумаге, чтобы понимать что делать. Своеобразная раскадровка.
Запускаем Юнити. У меня версия 4.1. В какой-то из предыдущих версий была переделана система частиц, поэтому на очень старых версиях редактора урок может быть не актуаленSmile. Из меню выбираем GameObject>Create Other>Particle System. У нас появилась система частиц с летящими белыми пятнами. В правом нижнем углу вьюпорта должно появиться маленькое окошко, которое помогает запускать симуляцию эффектов, останавливать их, ставить на паузу, менять скорость проигрывания (ВНИМАНИЕ! Скорость самого эффекта изменяется не здесь).Это позволяет отловить различные артефакты и косяки при очень быстрых эффектах, например выстрел. Чтобы понимать размер эффекта относительно мира я рекомендую настраивать на уже готовых объектах. В нашем случае – это бочка. Ставим бочку в координаты 0,0,0, вводя их в свитке Inspector в окошки сабсвитка Transform. Если свитка нет, то в меню Window включите его, а так же свиток Hierarchy. Далее выбираем нашу Particle System и ставим ее так же в 0,0,0. И чуть поднимаем вверх, чтобы огонь горел не на самом дне, а начинался чуть выше. Систему частиц можно переименовать, кликнув по ней в свитке Hierarchy и нажав F2. Я назвал нашу систему частиц FireMetalBarrelы.

рис. 001

ОГОНЬ

Теперь в свитке Inspector в сабсвитке Particle System появились настройки нашей системы частиц. В принципе можно настраивать и отсюда их. Но удобнее будет нажать кнопку «Open Editor…». Откроется окно со всеми эмитерами и их настройками. Очень удобно, если настраивается сложный эффект. Визуально все понятно и не возникает путаницы. Справа вверху у Вас будет несколько вспомогательных кнопок Show Selected, Resimulate, Wireframe. Show Selected чуть затемняет все не выбранные эмитеры и подсвечивает тот, который Вы выбрали в данный момент. 

 рис. 002 Выбирать эмитеры(после того, как Вы их создали, конечно) можно в свитке Hierarchy.

Первое, что мы должны сделать, чтобы увидеть не дефолтные белые шарики, а нужную текстуру – это сделать материал и текстуру огня. Сразу оговорюсь, что делать текстуры то еще развлечение. Достаточно долгая и кропотливая работа. Но как я уже говорил – это стоит того в итоге. Я использую свои давние наработки, которые я делал для игры Deep Black. Для текстур огня и дыма я использовал FumeFX плагин для 3dsmax. Моделировал различные взрывы, интенсивность, направления и т.д. Потом рендерил в серии кадров. Так я получал различной интенсивности и размера огненные всполохи. С дымом чуть проще. Как? Расскажу позже.

Итак, чтобы создать новый материал достаточно кликнуть правой кнопкой по любому месту в папке Materials (для моего проекта)

рис. 003

Материал можно поместить куда угодно, в любую папку. Главное не запутаться, когда их будет много Smile. Называем материал, в нашем случае это FireMed. Назначаем материалу шейдер Particles/Additive. В нашем случае это то, что нужно. Можете поэкспериментировать с шейдерами и назначить понравившийся. Tint Color позволяет корректировать цвет текстуры, а так же интенсивность альфаканала. Насколько материал будет прозрачным. Soft Particles Factor – это параметр, который позволяет сгладить пересечение частиц с плоскостью, на которой находится эмитер. Но и добавляет немного расчётов видеокарте, когда частиц много )). В пустом сером маленьком окошке нажимаем маленькую кнопку «Select», открывается окно выбора текстур. Ищете свою текстуру (все текстуры должны находиться в папке проекта, чтобы Юнити их видел). Можно набрать имя текстуры и найти ее.

 рис. 004

Возвращаемся в наш редактор частиц, выбираем эмитер FireMetalBarrel и сразу же переходим в самый нижний сабсвиток Renderer. Ставим галочку (это значит, что он не будет игнорироваться и будет активен Smile) и разворачиваем его кликом по нему. Render Mode оставляем Billboard. Это значит, что при любом угле обзора текстуры частиц всегда будут направлены в камеру. Снимаем галочки Cast и Receive Shadows так как шейдер материалов, типа Particles не принимает тени и не отбрасывает их. Перетаскиваем наш заготовленный материал в строчку Material и видим что-то отдаленно похожее на огонь. Материал можно так же назначить выбрав его из всех доступных, нажав маленький кружок обведенный зеленым цветом.

 рис. 005

Возвращаемся в начало нашего свитка FireMetalBarrel и начинаем настраивать один сабсвиток за другим. Сразу подскажу, что наведя мышку на любой параметр вы увидите всплывающую краткую подсказку о том, что он значит и как работает. Все настроенные параметры я приведу на скриншотах. У некоторых параметров есть опции – они обозначены маленькими черными треугольничками справа от параметра. Constant -постоянная величина, Curve – изменение параметра по кривой, например размер от малого к большому и опять к малому. Random between two constants – случайное значение в промежутке от одного до другого указанных значений. Random between two curves – то же, что и предыдущее, только крайними значениями выступают кривые.

рис. 006

Опишу действие параметров:

Duration – общая продолжительность эффекта. Как показала практика особо не влияет при зацикленных эффектах.

Looping – зацикленность

Prewarm – как бы прогрев эффекта, чтобы он начался уже с основной интенсивностью

Start Delay – задержка в старте проигрывания в секундах

Start Lifetime – Время жизни в секундах

Start Speed – скорость, с которой стартуют частицы

Start Rotation – стартовая повернутость частицы на определенный градус. В нашем случае от 0 до 360.

Start Color – стартовый цвет. Можно регулировать по альфе или по цвету.

Gravity Multiplier – множитель гравитации. 9,82 м/c– гравитация для планеты Земля.

Inherit Velocity – наследуемая скорость для следующих частиц.

Simulation Space – система координат. В нашем случае – world. При Local позволяет частицам перемещаться вместе с эмитером, как например, двигатель космолета. При world – частицы ведут себя, как факел, который несут, т.е. отстают от эмитера.

Play on Awake – частицы стартуют автоматически.

Max Particles – максимальное кол-во частиц одновременно проигрываемых из этого эмитера.



Emission


Rate – количество частиц генерируемое в секунду.

Bursts – Параметр, который позволяет выбрасывать сразу нужное кол-во частиц в указанные промежутки времени, а не одна за другой последовательно. Выключен, в нашем случае.

 

Shape

Shape – форма эмитера. Конус, сфера, полусфера, бокс, меш.

Angle – угол разброса. В нашем случае 15 градусов.

Radius – радиус эмитера.

Emit from – откуда генерируются частицы. Из одной точки, из всего тела эмитера и т.д.

Random Direction – Задает случайное направление движения частиц. Помогает создать некую мелкую хаотичность в нашем случае с генерацией языков пламени.

 

Velocity over Lifetime

Параметр позволяет рандомайзить скорость движения частиц в течение их жизни. В нашем случае система координат world и направление вверх, т.е. по Y. Случайная скорость от 0.5 до 1. Получается, что языки пламени движутся с разной скоростью.

Force over Lifetime

Система координат тоже world. Помогает задать влияние небольших сил, которые смещают частицы в стороны по Х и по Y на небольшие расстояния. Y в данном случае почему то работает, не вверх, как в предыдущем.

Color over lifetime

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

рис. 007 Тут можно регулировать цвета и альфаканал.

Rotation over Lifetime

Параметр позволяет придать некоторое вращение в течение жизни. В нашем случае от -20 до 30 градусов. Частицы вращаются в случайные разные стороны с медленной скоростью, что тоже придает реализма.
Остальные параметры нам оказались без надобности, но Вы можете поэкспериментировать и попытаться настроить еще лучше Smile.

ДЫМ.

Если Вы все сделали правильно, то у Вас должно получиться довольно неплохое пламя. Но, сам эффект еще не готов и на половину и поэтому не стоит расстраиваться, если огонь далек от идеала. Сейчас я расскажу о том, как сделать дым. По сути с ним все просто – это тот же самый огонь лишь клонированный и немного перенастроенный

рис. 008

и с материалом (текстурой дыма). Копируем так – выбираем наш эмитер огня FireMetalBarrel, нажимаем Ctrl+D переименовываем в Smoke и перетаскиваем новый эмитер прямо на FireMetalBarrel, чтобы эмитер Smoke стал дочерним объектом и все они вместе образовывали иерархию. Все это делается в свитке Hierarchy. Подробнее хочу остановиться на том, как сделать текстуру дыма. Тут я не использовал никаких плагинов – только старый добрый Фотошоп и Гугл Smile. Ищем картинку одинокого облака в Гугле. Я нашел вот такую

 рис. 009

После небольшой обработки по размерам и десатурейту (превратил в ч/б) и добавления альфа канала путем копирования самого изображения и вставки в канал альфа – имеем нечто похожее на текстуру дыма.

 рис. 010

Кстати я рекомендую стараться делать все текстуры кратные степени двойки по сторонам, типа 128х128, 1024х512, 64х16 и т.д. Это сэкономит Вам уйму времени, если надумаете использовать их потом еще в других проектах.
Создаём новый материал Smoke и настраиваем его по образу и подобию материала огня с той разницей, что используем немного другой шейдер и другую текстуру.

 рис. 011

Вводим параметры, как показано на рисунке 008.


ИСКРЫ.


Искры, по сути, тот же клонированный огонь с измененными параметрами и другим материалом. Назовем этот эмитер Spark. Настройки для него показаны на рис. 012.

рис. 012

Текстуру можете сделать в Фотошопе – это маленькая точка или точка с небольшим свечением вокруг. Размер текстуры, как я уже говорил в начале 16х16 или около того. Шейдер – Particles/Additive.


ГОРЯЧИЙ ВОЗДУХ.

Здесь опять тот же хорошо настроенный, клонированный и чуть модифицированный эмитер огня, но все дело делает шейдер, который по дефолту не идет с Юнити. У нас он был написан нашими программистами для проекта. Думаю не составит труда найти подобный шейдер в инете.

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

Ну и финальный результат смотрите на видео:

816 0 850 15
5
2013-05-07
Да, с появлением Сюрикена, работать с частицами в Юнити стало удобнее и приятнее) Хороший урок, многим будет полезен.
2013-05-11
Очень хороший урок, хорошо все пункты расписал. Молодец!
2013-05-20
очень актуально! спасибо!
2013-10-13
отличный урок но почему он только один на render.ru??) по больше б таких..
2016-09-13
зарегистрировался специально для того, чтобы сказать спасибо!)
RENDER.RU