Геймдев
#статьи

Как работает система частиц в Unity и что с её помощью можно сделать

Разбираемся в нюансах настройки системы частиц в Unity.

Иллюстрация: Yulia Gadalina / Unsplash / Annie для Skillbox Media

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

В том или ином виде она присутствует в каждом игровом движке. В последней версии Unreal Engine, например, она называется Niagara, а в Unity, о котором и пойдёт речь ниже, это буквально Particle System. В этом тексте мы разберёмся, что собой представляет система частиц в Unity, как её создать и настроить.

Важное уточнение: в Unity есть встроенная система Particle System, которая может создавать тысячи частиц. А есть устанавливаемое дополнение Visual Effect Graph, которое за счёт графического процессора способно создавать миллионы частиц. В этом материале мы говорим именно про встроенную Particle System.

Создаём систему частиц

Чтобы добавить в сцену систему частиц, в окне Hierarchy нажмите на значок «+». В выпавшем меню выберите пункт Effects, а далее — Particle System.

То же самое меню можно получить, если кликнуть правой кнопкой мыши в окне Hierarchy по свободному пространству или если нажать в верхней панели на GameObject.

Скриншот: Skillbox Media

После этого в окне Scene у вас появится конус, испускающий белые полупрозрачные круги. Это система частиц с настройками по умолчанию. Изменив их, мы можем придать частицам любой необходимый вид и поведение.

Обратите внимание, что, когда система частиц выделена, в окне Scene справа внизу появляется небольшое окно Particles с кнопками Pause, Restart и Stop. С его помощью можно запустить генерацию частиц, остановить её, перезапустить или поставить на паузу, чтобы посмотреть, как частицы будут себя вести.

Выделив систему частиц, вы можете передвинуть её в нужное место или повернуть под нужным углом, как и любой другой игровой объект. Все изменения его положения и наклона отражаются в окне Inspector в компоненте Transform. Но куда важнее здесь другой компонент, который находится ниже, — Particle System.

Вы можете сделать систему частиц дочерней для любого объекта, чтобы она перемещалась вместе с ним. Например, если вы сделали огонь, то его можно прикрепить к объекту с моделью факела. Также вы можете добавить компонент Particle System к любому уже существующему объекту, если выделите этот объект и в его окне Inspector нажмёте Add Component, а затем выберете пункт Effects и далее Particle System.

Скриншот: Skillbox Media

Как показано на скриншоте выше, компонент Particle System состоит из множества модулей, каждый из которых отвечает за свой набор настроек поведения и внешнего вида частиц. Система частиц при работе учитывает лишь те из них, которые помечены галочкой. На скриншоте, например, по умолчанию включены только модули Emission, Shape и Renderer.

При этом самый главный модуль, который раскрыт по умолчанию, активен всегда, ведь он содержит набор самых базовых настроек для генератора частиц. В Inspector этот модуль никак не подписан, но в официальной документации Unity, например, его называют модулем Main. Разберёмся, что он собой представляет.

Настройки модуля Main

Самый главный модуль в компоненте Particle System состоит из 25 параметров. Первый пункт, Duration, отвечает за то, сколько секунд будут испускаться частицы. Поставите 1 — и частицы будут вылетать ровно одну секунду. Поставите 10 — будут вылетать десять секунд.

Важно, что эффект от Duration будет виден, лишь если в следующем пункте Looping не поставить галочку. Потому что иначе частицы будут генерироваться бесконечно снова и снова. Пункт Duration в этом случае будет обозначать длительность одного цикла генерации частиц.

В каких случаях использовать Looping

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

Активированный Looping делает доступным для изменения следующий параметр — Prewarm. Если его включить, система частиц при запуске игры будет выглядеть так, словно она полностью прошла один цикл и частицы генерируются уже давно. В противном случае вы увидите, как частицы постепенно появляются одна за другой, начиная с самой первой.

Параметр Start Delay — это задержка в секундах перед тем, как генератор начнёт создавать частицы. Учтите, что если вы используете параметр Prewarm, то Start Delay будет недоступен, так как в этом случае в задержке нет никакого смысла.

Start Lifetime определяет, сколько секунд «проживёт» каждая частица, прежде чем исчезнет. На примере ниже видно, что чем меньше срок существования частиц, тем меньший путь каждая из них успевает пройти.

Start Speed — начальная скорость частиц. Чем выше значение, тем дальше успеет улететь каждая, прежде чем истечёт срок её существования.

Далее у нас два пункта 3D Start Size и Start Size. Начнём с последнего. В нём мы указываем, какого размера будут частицы сразу по всем трём осям — X, Y, Z. Но если мы поставим галочку у 3D Start Size, то сможем менять размер по каждой оси отдельно.

На примере ниже сначала мы просто задали Start Size равным 5, из-за чего частицы стали большими и визуально слились во что-то похожее на пар. Затем с помощью 3D Start Size мы сделали равным 5 только размеры частиц по оси X, из-за чего они растянулись по горизонтали. В третьем примере мы присвоили значение 5 только размеру по оси Y, из-за чего частицы растянулись по вертикали.

Следующие два пункта, Start Rotation и 3D Start Rotation, работают по похожему принципу. В Start Rotation можно задать на сколько градусов будет повёрнут объект сразу по всем осям. Если поставить галочку в 3D Start Rotation, то можно задать поворот по каждой из осей отдельно.

Рядом стоит пункт Flip Rotation, в котором можно задать значение от 0 до 1. Он добавляет небольшое разнообразие к повороту частиц: часть из них разворачивается в противоположном направлении. Лучше всего разница видна при значении 0,5.

Пункт Start Color, как понятно из названия, задаёт начальный цвет частицам.

Gravity Source позволяет выбрать, какую физику использовать для гравитации частиц — 2D или 3D. Общие настройки для каждого вида физики можно посмотреть, если выбрать в меню вверху Edit, а потом Project Settings. Там будут разделы Physics и Physics 2D. Не стоит здесь что-либо менять без чёткого понимания, для чего вам это нужно.

Следующий после Gravity Source пункт Gravity Modifier определяет воздействие гравитации на частицы. При 0 частицы существуют в невесомости. Если значение увеличивать, то частицы начнёт притягивать к земле.

Simulation Space определяет, будут ли частицы использовать локальные координаты (Local), мировые координаты (World) или же координаты какого-то другого объекта (Custom). В случае Local куда бы ни переместился объект с Particle System, частицы перемещаются вслед за ним. Если же вы хотите, чтобы частицы не двигались следом, а оставляли позади него шлейф, то надо выбрать вариант World.

Дым, который идёт от факела на стене, можно оставить в пространстве Local. А вот если этот факел несёт какой-нибудь персонаж, то частицы, формирующие дым, для реалистичности лучше создавать в пространстве World, чтобы за факелом оставался дымный след.

При варианте Simulation Space: Custom частицы после появления начинают существовать в локальных координатах указанного объекта. В примере ниже частицы испускаются синей сферой, но мы указали, что существуют они в координатах красного куба. Поэтому когда он сдвигается влево или вправо, то частицы двигаются вместе с ним.

Самый очевидный вариант того, что с помощью этого можно сделать, — ветер, который сдувает капли дождя то в одну, то в другую сторону.

С помощью Simulation Speed можно ускорить либо замедлить работу системы частиц. Нормальная скорость — это значение 1. При 0 система замрёт. При 2 все процессы будут происходить в два раза быстрее. При 10 — соответственно, в десять раз быстрее.

Delta Time определяет, зависит система частиц от времени или нет. В Unity есть параметр timeScale, который определяет, как течёт время в игре. Если он равен 1, то время течёт с нормальной скоростью. Если поставить значение 2, то оно будет идти в два раза быстрее. Если 0,5, то в два раза медленнее. Так можно реализовать механику bullet time, о чём мы рассказывали в одном из предыдущих материалов. А если timeScale = 0, то время останавливается и всё замирает. Так можно сделать паузу.

Но что, если вам в момент паузы надо, чтобы система всё равно продолжала генерировать частицы? На этот случай и существует пункт Delta Time. В режиме Scaled система будет зависеть от времени. И если оно остановится, то замрут и частицы. А вот в режиме Unscaled частицы живут своей жизнью, независимо от того, как быстро или как медленно течёт время в игре.

Следующий параметр Scaling Mode определяет, как система частиц применяет компонент Transform по отношению к самим частицам. Речь тут идёт в частности о том, как на них будет влиять параметр Scale. Он, напомним, отвечает за широту или узость объекта по каждой из трёх осей X, Y, Z.

У Scaling Mode есть три режима работы: Hierarchy, Local, Shape.

Если выбрать режим Hierarchy, то Scale системы частиц будет меняться вместе с изменением Scale не только самой системы частиц, но и родительского объекта. Если в окне Hierarchy вы поместили внутрь объекта факела систему частиц и решили, что факел надо сделать широким, то широкими станут и сами частицы. В примере ниже мы сделали систему частиц дочерней для сферы, а затем расширили сферу по оси X до 5 единиц (по умолчанию Scale по оси X равен 1). Как видите, частицы тоже стали широкими.

При режиме Local будут учитываться изменения параметра Scale только у самой системы частиц. У родительского объекта вы можете менять его как угодно, частицы будут неизменного размера.

Третий режим, Shape, меняет не размер частиц, а только их положение. Этот параметр привязан к модулю Shape, о котором мы подробнее поговорим ниже. Модуль Shape определяет направление частиц и трёхмерный объём в виде геометрической фигуры, внутри которого они создаются. Если родительский объект станет широким, то расширится и этот объём. Соответственно разлёт частиц тоже расширится.

В примере выше над сферой видно очертания фигуры Cone, внутри которой создаются частицы. Меняя Scale по оси X сферы, мы соответственно меняем и ширину самого конуса. Разлёт частиц тоже меняется, но размер они сохраняют прежний.

Параметр Play On Awake отвечает за то, будут ли частицы создаваться сразу, как только запустится игра, ну или когда объект с частицами вдруг появится в сцене. В противном случае запуск частиц произойдёт лишь при определённом условии, которое можно указать, например, в коде.

Emitter Velocity Mode определяет добавочную скорость для частиц. У него есть три режима работы: Transform, Rigidbody и Custom.

Режим Transform подразумевает, что при создании каждой частицы к ней будет добавляться скорость объекта, определяемая через компонент Transform. Чтобы лучше проиллюстрировать это, мы настроили систему частиц так, что она генерирует их по прямой линии. А чтобы частицы после создания не двигались за зелёной сферой, параметр Simulation Space мы переключили на World.

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

Так происходит потому, что в параметре Emitter Velocity Mode при режиме Transform каждая частица получила скорость и направление от компонента Transform сферы. Пока она двигалась влево, её скорость была −10. Аналогично каждая частица двигалась со скоростью −10. Поэтому какое-то время казалось, что они приклеились к сфере. Но когда сфера пошла в другую сторону со скоростью 10, у частиц, выпущенных ранее, скорость осталась равной −10. Поэтому они продолжили движение в прежнюю сторону.

В свою очередь режим Rigidbody добавляет скорость частицам на основе физической скорости объекта. Соответственно, к системе частиц должен быть подключён компонент Rigidbody, который и отвечает за физически корректное перемещение объекта.

Тут важно уточнить, что в режиме Transform для передвижения сферы мы использовали transform.Translate. А для режима Rigidbody в ход пошёл AddForce. В чём разница между ними, мы объясняли в отдельном материале. Если вкратце, то первый двигает объект без использования физики, а второй — с её помощью, благодаря чему набравшая скорость сфера не сразу останавливается, когда вы отпускаете кнопку. Её скорость затухает постепенно (при правильных настройках Rigidbody). Соответственно, каждая новая частица получает всё меньшее значение добавочной скорости, и кривая получается более плавной.

Режим Custom позволяет вручную задать добавочную скорость для частиц по каждой из осей X, Y, Z. В примере ниже мы задали скорость для частиц по оси X равной 5. В итоге они стали двигаться вправо при появлении.

Параметр Max Particles отвечает за то, сколько частиц от данного генератора одновременно может существовать в сцене. Если указанное число достигнуто, то новые частицы не создаются, пока не исчезнут старые.

Включённый параметр Auto Random Seed отвечает за то, чтобы частицы каждый раз создавались случайным образом. Лучше всего это видно при выключенном Looping, когда частицы создаются ровно один цикл генерации. Если Auto Random Seed выключить, то появится поле Random Seed, где можно указать число, на основе которого будут сгенерированы частицы. То есть генерация, например, при числе 210, всегда будет одинаковой, но она будет отличаться от генерации при числе 211, или 0, или любых других. Таким образом, если вам надо, чтобы частицы всегда вылетали одинаковым образом, то вы просто находите число, при котором генерация вас устраивает, и используете его. Также здесь есть кнопка Reseed, которое генерирует в поле Random Seed случайное число.

Скриншот: Skillbox Media

Параметр Stop Action определяет, что произойдёт, когда система частиц закончит свою работу и все частицы исчезнут. Тут четыре варианта:

  • None — ничего не произойдёт.
  • Disable — объект будет выключен.
  • Destroy — объект будет уничтожен.
  • Callback — необходим, чтобы вызывать метод OnParticleSystemStopped () в скрипте, подключённом к системе частиц, и, соответственно, выполнять всё, что вы в нём укажете.

Важно: параметр Stop Action не будет работать, если генерация частиц зациклена, то есть если вы поставили галочку у Looping.

Параметр Culling Mode определяет, как будет работать система частиц, когда окажется вне поля зрения камеры.

  • Pause — останавливает симуляцию системы, пока она вне кадра.
  • Pause and Catch-up — делает то же самое, но, когда система попадает в поле зрения камеры, симуляция приходит в такое состояние, чтобы казалось, будто никакой паузы в работе не было.
  • Always Simulate — система частиц работает независимо от того, видит её камера или нет.
  • Automatic — для зацикленных систем включает Pause, когда они вне поля зрения, а для всех остальных включает Always Simulate.
Скриншот: Skillbox Media

Параметр Ring Buffer Mode не даёт частицам с истёкшим сроком существования исчезать, пока их количество не достигнет значения, указанного в Max Particles. После того как значение будет достигнуто, старые частицы начнут заменяться новыми.

Модули Emission, Shape и Renderer

Эти три модуля активны по умолчанию. Модуль Emission определяет, в каком количестве и как будут выбрасываться частицы. Есть несколько параметров. Первый Rate over Time определяет, сколько частиц будет создано за секунду. По умолчанию здесь выбрано значение 10.

Скриншот: Skillbox Media

Второй параметр, Rate over Distance, позволяет настроить выброс частиц с привязкой к расстоянию, а не ко времени. Выброс в этом случае происходит через каждый пройденный юнит. Эта единица измерения равна одному метру (если вы создадите простой куб в сцене, то он как раз будет равен одному кубическому метру).

Если вы выставите в этом параметре значение 1, то через каждый пройденный юнит будет создаваться по одной частице. Но в примере ниже мы выставили значение 10. Как видите, когда паровоз стоит, частицы не создаются. Когда же он начинает двигаться, то из его трубы валит пар.

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

  • Constant — одно постоянное число.
  • Curve — значение, определённое кривой.
  • Random Between Two Constants — случайное значение между двух постоянных величин.
  • Random Between Two Curves — случайное значение выбирается между двумя кривыми.
Скриншот: Skillbox Media

Третий пункт в модуле Emission отвечает за резкий выброс определённого количества частиц — Burst. Если вам надо сделать эффект взрыва, то этот параметр как раз и поможет настроить частицы как надо.

Чтобы добавить эффект взрыва частиц, надо нажать «+» справа внизу. Для настройки поведения частиц есть пять параметров.

  • Time — через сколько секунд после начала работы Particle System случится выброс частиц.
  • Count — сколько частиц будет создано.
  • Cycles — сколько раз повторится генерация того количества частиц, которое указано в Count. Допустим, если параметр Count равен 2, а Cycles — 4, то при взрыве будет создано восемь частиц.
  • Interval — какой будет задержка между частицами при появлении. Хоть и кажется, что они появляются одновременно, на самом деле они создаются по очереди. Минимальный интервал между ними, выставленный в Unity по умолчанию, это 0,01. Если поставить больше, то вы увидите, как частицы вылетают из генератора, словно автоматная очередь.
  • Probability — вероятность, с которой частицы будут созданы. Значение можно задать в интервале от 0 до 1. При 0 частицы точно не появятся. При 1 — точно появятся.

Далее перейдём к другому обязательному модулю — Shape. Он определяет пространство, в котором создаются частицы. Это может быть геометрический объём в виде фигуры или некая поверхность. Исходя из формы, определяется и направление, в котором полетят частицы. Поставить нужную форму можно в параметре Shape через выпадающее меню.

Скриншот: Skillbox Media

Обратите внимание, что здесь 13 пунктов. Первые пять — это трёхмерные геометрические фигуры: Sphere, Hemisphere, Cone, Donut, Box. Их размеры, угол и положение в пространстве можно изменить через параметры, указанные ниже в модуле.

Далее три пункта — Mesh, Mesh Renderer и Skinned Mesh Renderer, — которые позволяют создавать частицы на поверхности полигональной сетки. Частицы в этом случае испускаются в том же направлении, в котором смотрит нормаль. При этом вариант Skinned Mesh Renderer предназначен для мешей, которые подключены к скелету и в связи с этим могут деформироваться при движении суставов.

Например, со Skinned Mesh Renderer можно сделать вот такой эффект
Видео: Kurt Dekker/ YouTube

Sprite и Sprite Renderer необходимы, если частицы должны генерироваться по форме какого-либо спрайта. А пункты Circle, Edge и Rectangle — это двухмерные фигуры (круг, прямая линия, четырёхугольник), генерирующие частицы.

Скриншот: Skillbox Media

Модуль Renderer отвечает за внешний вид частиц. Будут это звёздочки, искры, пули, камни, капли, сгустки дыма?.. Здесь также много параметров для настройки.

Первый и один самых важных из них — это Render Mode. Он позволяет определить, чем именно будут ваши частицы — плоскими спрайтами или объёмными моделями. В первом случае надо выбирать вариант Billboard. Это спрайт, который всегда смотрит на камеру. У него тоже есть варианты. Так, Stretched Billboard нужен для применения масштабирования. Horizontal Billboard делает частицы параллельными полу. Vertical Billboard делает частицы перпендикулярными оси Y. А для того, чтобы частицы были трёхмерными объектами, надо использовать вариант Mesh.

Частицы могут быть объёмными, как здесь

Помимо этого, в системе частиц Unity есть ещё 21 модуль. Они неактивны по умолчанию, но каждый из них уточняет внешний вид и поведение частиц и содержит массу настроек.

Например, модуль Trails оставляет за частицами след, а Color over Lifetime определяет, как будет меняться цвет частиц за время их существования. Но о них мы поговорим подробнее в другой раз, так как их лучше рассматривать в контексте конкретных примеров создания конкретных эффектов.

Запишите ребёнка на бесплатный урок в Skillbox Kids ➞
Учим детей программированию, веб-дизайну и разработке игр. Преподаватель — IT-эксперт — подберёт курс по интересам ребёнка. Подробности — по клику.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована