Particle System и VFX Graph
Две системы спецэффектов — когда выбирать каждую, и базовые приёмы.
Спецэффекты в Unity делятся на две большие системы: Built-in Particle System (часто называется Shuriken) и VFX Graph (часть Visual Effect Graph package). Они существуют параллельно и не конкурируют — у каждой свой случай.
Когда что выбирать
| Параметр | Particle System (Shuriken) | VFX Graph |
|---|---|---|
| Где работает | Везде, любой пайплайн | URP / HDRP (не Built-in) |
| Считается на | CPU | GPU (compute shader) |
| Максимум частиц | ~10 000 без просадок | Миллионы |
| Взаимодействие со скриптами | Простое (свойства, методы, события) | Через Exposed Properties и Event API |
| Кривая обучения | Низкая | Средняя (визуальный граф) |
| Подходит для | Дым, искры, удары — простые эффекты | Толпы, fluid, ribbon trails, GPU-симуляция |
Грубое правило: если эффект простой и нужен на мобильных — Particle System. Если нужно много частиц или сложная GPU-симуляция — VFX Graph.
Particle System — main module
ParticleSystem — компонент, привязанный к GameObject. В Inspector — десятки модулей-секций, можно включать и выключать. Главное в Main:
- Duration — длина “выпуска” в секундах.
- Looping — повторять или одноразово.
- Start Lifetime — сколько живёт каждая частица.
- Start Speed / Size / Color / Rotation — начальные значения. Можно константой, диапазоном, кривой по времени.
- Simulation Space —
Local(частицы движутся с GameObject) илиWorld(остаются на месте, даже если эмиттер сдвинулся). - Max Particles — жёсткий лимит.
using UnityEngine;
public class Explosion : MonoBehaviour
{
[SerializeField] private ParticleSystem effect;
public void Boom() {
effect.Play();
}
private void OnParticleSystemStopped() {
// Все частицы прожили жизнь — можно удалить
Destroy(gameObject);
}
}
Play(), Stop(), Pause(), Clear() — главные методы. Для одноразового эффекта в скрипте часто
ставят флаги “Play On Awake” + “Stop Action: Destroy” в самом ParticleSystem.
Ключевые модули
- Emission — частота испускания: rate over time / rate over distance / bursts (всплески).
- Shape — форма источника: Sphere, Cone, Box, Mesh, …
- Velocity over Lifetime — изменение скорости по времени.
- Color over Lifetime — например, искры: жёлтые → красные → исчезают.
- Size over Lifetime — рост или сжатие.
- Rotation over Lifetime — вращение каждой частицы.
- Noise — добавляет turbulence для естественности.
- Trails — следы за каждой частицей.
- Sub Emitters — частица сама становится эмиттером (взрыв → разлетающиеся осколки → искры от осколков).
- Collision — частицы сталкиваются с миром (дёшево в режиме Planes, дороже в World).
- Renderer — как рисуются: Billboard (всегда лицом к камере), Mesh, Stretched Billboard.
Хороший взрыв — это не один партикл-эффект, а 4-5 наложенных: вспышка, дым, искры, ударная волна, обломки. Каждый — отдельный child Particle System внутри одного prefab. Sub-emitters позволяют цепочки: “крупный обломок при касании земли испускает 10 искр”.
Реакция на столкновения
Если включить модуль Collision и поставить в Send Collision Messages, ваш скрипт получит
OnParticleCollision:
private void OnParticleCollision(GameObject other) {
// other — это объект, в который попала частица (если у него Rigidbody / Collider)
if (other.TryGetComponent<Health>(out var hp)) {
hp.TakeDamage(1); // огонь обжигает!
}
}
VFX Graph — GPU-симуляция
Visual Effect Graph — отдельный пакет (com.unity.visualeffectgraph). Эффект описывается графом
нод: Spawn → Initialize → Update → Output. Подобно Shader Graph, но для всего жизненного цикла
частиц.
Базовая структура графа
[Spawn Context] — сколько частиц в секунду
│
▼
[Initialize Context] — стартовая скорость, позиция, цвет, lifetime
│
▼
[Update Context] — каждый кадр: velocity, force, turbulence, age
│
▼
[Output Context] — как рисуется (Quad, Mesh, Lines)
Каждый блок — это compute shader, который выполняется на GPU. Это даёт миллионы частиц без просадок FPS.
Exposed Properties и связь с кодом
Свойства графа можно “expose” — они появятся в Inspector компонента VisualEffect на GameObject:
public class FireEffect : MonoBehaviour
{
[SerializeField] private UnityEngine.VFX.VisualEffect vfx;
public void SetIntensity(float value) {
vfx.SetFloat("FlameIntensity", value);
}
public void TriggerExplosion() {
vfx.SendEvent("OnExplosion"); // именованное событие из графа
}
}
Когда VFX Graph критичен
- Толпы частиц — снег, дождь, песчаная буря, нашествие саранчи.
- Симуляции — флюиды, поля, ленты (ribbon).
- Сложные эффекты порталов — где нужны thousands of particles с интерактивной физикой.
- VFX, тесно интегрированный с Shader Graph — VFX Graph умеет читать из текстур, signed distance fields, нативно подключается к рендеру.
Что НЕ делать в Particle System
- 5 разных prefab’ов “взрыв”, испускаемых одновременно. Лучше один с sub-emitters.
- Mesh particles из тяжёлых мешей. Каждая частица — это draw call… ну, не совсем (batching спасает), но всё равно дорого.
- Сложные расчёты в
OnParticleTrigger. Этот колбэк вызывается часто, аллокации тут — путь к лагам. - Простой эффект через VFX Graph “на всякий случай”. Compute shader не бесплатен, для дыма из трубы Particle System в разы дешевле.
В следующей главе — Timeline и кат-сцены: связать всё в кинематографическую последовательность.