~3 мин чтения

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)
Считается наCPUGPU (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 SpaceLocal (частицы движутся с 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.
Sub-emitters — лучший друг геймдизайнера

Хороший взрыв — это не один партикл-эффект, а 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

  1. 5 разных prefab’ов “взрыв”, испускаемых одновременно. Лучше один с sub-emitters.
  2. Mesh particles из тяжёлых мешей. Каждая частица — это draw call… ну, не совсем (batching спасает), но всё равно дорого.
  3. Сложные расчёты в OnParticleTrigger. Этот колбэк вызывается часто, аллокации тут — путь к лагам.
  4. Простой эффект через VFX Graph “на всякий случай”. Compute shader не бесплатен, для дыма из трубы Particle System в разы дешевле.

В следующей главе — Timeline и кат-сцены: связать всё в кинематографическую последовательность.