Розробка системи частинок та VFX для мобільної гри

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Розробка системи частинок та VFX для мобільної гри
Середній
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Ми розробляємо системи частинок і VFX для мобільних ігор, які виглядають переконливо навіть на бюджетних пристроях. У нашій практиці десктопний ефект із 50 000 частинок на iPhone 11 призводив до перегріву та 20 FPS. Ми знайшли межу: ефект виглядає якісно при 10 000 частинках або менше, дотримуючись температурного режиму. З накопиченим досвідом понад 5 років ми підбираємо оптимальний стек і техніку для кожної платформи. Правильна система частинок підвищує retention гравців на 15% за нашими даними, при цьому не потребує дорогих пристроїв.

Вибір інструменту: Unity vs SpriteKit vs Metal

Більшість мобільних ігор використовують одне з трьох: Unity Particle System (Shuriken), Apple SpriteKit SKEmitterNode, або кастомну систему на Metal/OpenGL ES/Vulkan для особливих вимог. Порівняємо їх у таблиці.

Інструмент Платформа Продуктивність Гнучкість Коли використовувати
Unity Shuriken Cross-platform Висока (GPU Instancing) Середня 2D/3D ігри на Unity
SpriteKit SKEmitterNode iOS Дуже висока (нативний) Низька 2D ігри тільки на iOS
Metal Compute Shaders iOS Максимальна Висока Складні кастомні ефекти

Unity Shuriken — де-факто стандарт. Візуальний редактор, підтримка Sub Emitters, GPU Instancing, Burst компілятор для CPU-симуляції. VFX Graph (GPU-симуляція через Compute Shaders) працює на мобілі починаючи з Metal (iOS 12+) та Vulkan (Android API 24+). На старих пристроях VFX Graph недоступний — потрібен fallback на Shuriken.

SpriteKit SKEmitterNode — для 2D-ігор нативно на iOS. Простий, швидкий, без overhead Unity. Але обмежений: немає Sub Emitters, немає custom shaders без Metal. Для нескладних ефектів (вогонь, дощ, конфетті) достатньо.

Який інструмент обрати для VFX у мобільній грі?

Якщо проєкт крос-платформний, беріть Unity Shuriken. Для iOS-only 2D-ігор вистачить SpriteKit. Якщо потрібні унікальні ефекти з повним контролем — пишіть кастомні шейдери на Metal. Наша команда гарантує, що обраний стек не впреться в обмеження GPU на цільових пристроях.

Бюджет частинок та GPU обмеження

На мобільних GPU (Apple A-серія, Adreno, Mali) bottleneck часто не в кількості частинок, а в overdraw — кількості разів, який один піксель екрана перемальовується за кадр.

Напівпрозорі частинки з адитивним blending (Additive shader mode) дають overdraw кратно кількості шарів. На вибуху з 5000 частинок у центрі екрана реальний overdraw може бути 50–100x. Це вбиває fill rate навіть на A15.

Стратегії зниження:

  • Texture Atlasing: всі спрайти частинок — в один атлас 512×512 або 1024×1024. Мінус drawcall на кожну зміну текстури
  • Billboard imposters: для об'ємних ефектів (хмара вибуху) — quad із запеченою текстурою замість сотень сфер
  • LOD для частинок: на відстані / при низькому fps — зменшити maxParticles вдвічі через QualitySettings.particleRaycastBudget або кастомний LOD-менеджер
// Unity: динамічний LOD системи частинок по FPS
public class ParticleLODManager : MonoBehaviour {
    [SerializeField] private ParticleSystem targetSystem;
    private ParticleSystem.MainModule _main;
    private float _fpsTimer;

    void Start() {
        _main = targetSystem.main;
    }

    void Update() {
        _fpsTimer += Time.deltaTime;
        if (_fpsTimer < 1f) return;
        _fpsTimer = 0;

        float fps = 1f / Time.smoothDeltaTime;
        if (fps < 45f) {
            _main.maxParticles = Mathf.Max(100, _main.maxParticles / 2);
        } else if (fps > 58f && _main.maxParticles < originalMax) {
            _main.maxParticles = Mathf.Min(originalMax, _main.maxParticles * 2);
        }
    }
}

Чому overdraw — головний ворог продуктивності?

GPU-симуляція через VFX Graph працює в 4 рази швидше CPU-симуляції на A14 Bionic, але overdraw з'їдає цей виграш. При адитивному змішуванні кожен піксель може перемальовуватися десятки разів. Щоб цього уникнути, ми застосовуємо Texture Atlasing та скорочуємо кількість частинок з високим альфа-накладанням.

Кастомні шейдери для мобільних VFX

Вбудовані Unity шейдери для частинок (Particles/Standard Unlit) безпечні, але обмежені. Для dissolve-ефекту, heat distortion, energy shield — потрібен кастомний шейдер.

На мобілі правила жорсткі: немає discard у шейдері (ранній Z-test ламається, fill rate падає), мінімум texture samples, уникаємо dependent texture reads. Shader Model 2.0 як baseline для широкого охоплення.

Приклад простого distortion-ефекту для вибуху (Unity HLSL):

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

sampler2D _NoiseTex;
float _DistortionStrength;
float _FadeEdges;

fixed4 frag (v2f i) : SV_Target {
    float2 noise = tex2D(_NoiseTex, i.uv + _Time.y * 0.3).rg * 2 - 1;
    float2 distortedUV = i.uv + noise * _DistortionStrength * i.color.a;

    float edge = 1 - saturate(distance(distortedUV, float2(0.5, 0.5)) * _FadeEdges);
    fixed4 col = tex2D(_MainTex, distortedUV) * i.color;
    col.a *= edge;
    return col;
}
ENDCG

i.color.a — це alpha частинки від Unity Particle System, синхронізується з lifetime. Distortion затухає разом із частинкою автоматично.

Ефекти на SpriteKit: вогонь та конфетті

SKEmitterNode налаштовується або в редакторі Xcode (.sks файл), або програмно. Програмно — переважно для динамічних параметрів:

func makeFireEmitter() -> SKEmitterNode {
    let emitter = SKEmitterNode()
    emitter.particleTexture = SKTexture(imageNamed: "spark")
    emitter.particleBirthRate = 120
    emitter.particleLifetime = 1.2
    emitter.particleLifetimeRange = 0.4
    emitter.particleSpeed = 80
    emitter.particleSpeedRange = 40
    emitter.emissionAngle = .pi / 2  // вгору
    emitter.emissionAngleRange = .pi / 8
    emitter.particleScale = 0.15
    emitter.particleScaleSpeed = -0.1
    emitter.particleAlphaSpeed = -0.8
    emitter.particleColorSequence = SKKeyframeSequence(
        keyframeValues: [SKColor.yellow, SKColor.orange, SKColor.red, SKColor.clear],
        times: [0, 0.3, 0.7, 1.0]
    )
    emitter.particleBlendMode = .add
    return emitter
}

.add blending — адитивне змішування. Вогонь та іскри виглядають світними. Не використовуємо для диму та пилу — там потрібен .alpha.

Інструменти профілювання GPU

Xcode Metal Debugger — frame capture для Metal-ігор. Видно кожен draw call, текстури, overdraw visualization. Для Unity на iOS: через Xcode GPU Frame Debugger при підключенні через USB.

Android GPU Inspector (AGI) — від Google для Adreno та Mali. Frame Profiler показує pipeline stages, де GPU чекає.

Unity Profiler — вбудований, покаже час CPU/GPU на рендер кожного ефекту. Rendering → ParticleSystem.Update займає > 2ms — дивимось на CPU-симуляцію та зменшуємо maxParticles або переходимо на GPU Mode.

Що входить в роботу

  • Розробка кастомних шейдерів під цільову платформу
  • Оптимізація existing систем частинок (LOD, атласинг, overdraw)
  • Інтеграція в ігровий движок (Unity, SpriteKit, кастомний)
  • Профілювання та налаштування під слабкі пристрої
  • Документація по параметрах та підтримка

Процес роботи

Технічний арт-дирекшн: які ефекти потрібні, їх частота на екрані одночасно, цільові пристрої. Розробка шейдерів та систем частинок у редакторі з профілюванням на слабкому Android-девайсі. Налаштування LOD-системи. Інтеграція в ігровий движок, тест на теплові throttling (10-хвилинна ігрова сесія з аналізом температури).

Орієнтири по строках

3–5 робочих днів на базовий набір VFX (3–5 типів ефектів). Складна кастомна система на Metal Compute Shaders — від 2 тижнів. Конкретна вартість розраховується індивідуально після аналізу ваших вимог. Оцінимо ваш проєкт: зв'яжіться з нами для попереднього аналізу. Отримайте консультацію щодо вибору інструменту для ваших ефектів.

Анімації в мобільних додатках: Lottie, Rive, Spring та Reanimated

Ми зробили анімації для десятків проєктів — від ігрових інтерфейсів до bank-grade додатків. Знаємо, як змусити 120 fps працювати навіть на Android з ProGuard. Якщо анімація смикається — проблема не в інструменті, а у виборі підходу. Нижче покажемо, як обирати між Lottie та Rive, чому Spring physics перемагає UIView.animate, і як Reanimated 3 вичавлює 60 fps на старих пристроях. Отримайте консультацію щодо вашого проєкту — оцінимо анімаційний шар безкоштовно.

Чому UIView.animate ламається на складних сценаріях

UIView.animate(withDuration:) та ObjectAnimator на Android — правильний вибір для простих переходів. Але щойно анімація стає інтерактивною (користувач тягне елемент, швидкість залежить від жесту), потрібен інший підхід.

На iOS для gesture-driven анімації правильний інструмент — UIViewPropertyAnimator. Він дозволяє призупиняти, обертати та модифікувати анімацію в процесі. Типовий кейс: bottom sheet, який слідує за пальцем, продовжує рух з інерцією після відпускання та притягується до найближчої позиції. З UIView.animate це або не працює зовсім, або потребує ручної фізики.

У SwiftUI withAnimation працює з коробки, але інтерактивність обмежена — немає прямого аналога UIViewPropertyAnimator. Обхідний шлях: .gesture(DragGesture()) + @GestureState + явне обчислення позиції. Або йдемо в SwiftUI Animations API з Animation.spring(duration:bounce:).

Як React Native Reanimated обходить JS-міст

React Native Animated API виконує анімації в JS thread — це джерело джанка при завантаженому bridge. Reanimated 3 вирішує проблему через worklets: функції, які компілюються та виконуються прямо на UI thread без перетину JS-моста.

Приклад: parallax scroll header. На базовому Animated.Value при швидкому скролі FPS падає до 40-45 на mid-range Android. На Reanimated з useAnimatedScrollHandler — стабільні 60 fps, тому що весь перерахунок позиції відбувається на UI thread.

Reanimated 3 з useSharedValue, useAnimatedStyle та withSpring/withTiming — стандарт для анімацій у React Native. Gesture Handler v2 щільно інтегрований: useAnimatedGestureHandler замінює PanResponder і теж працює на UI thread.

Чому Lottie може знижувати FPS на Android і як це виправити

Lottie експортує After Effects анімацію в JSON. На iOS з lottie-ios працює стабільно, але на Android при складних ефектах (blur, частинки, градієнти) векторний рендеринг через Canvas призводить до просадок до 30-40 fps. Рішення — або спрощувати анімацію, або використовувати Rive з апаратним рендерингом. Ми тестували: Lottie-файл з розмиттям 5 МБ на Xiaomi Redmi Note 10 дає 48 fps, аналогічна анімація в Rive (.riv 400 КБ) — 60 fps. Rive працює в 1.25 раза швидше на однаковому пристрої, а при складних ефектах — до 4 разів легше за розміром.

Як вибрати між Lottie та Rive для вашого проєкту?

Обидва інструменти вирішують задачу «дизайнер робить анімацію, розробник додає файл». Але принципово по-різному.

Критерій Lottie Rive
Формат JSON векторна анімація Бінарний .riv
Інтерактивність Ні (лінійне відтворення) State Machine, реакції на ввід
Продуктивність Середня (blur/частинки важкі) Апаратний рендеринг Metal/OpenGL
Розмір файлу 2-5 МБ 200-500 КБ
Підтримка платформ iOS, Android, Web, Flutter, RN iOS, Android, Web, Flutter, RN

Вибір простий: статична декоративна анімація (splash screen, onboarding ілюстрації) — Lottie. Інтерактивні UI-елементи зі станами — Rive. Наприклад, кнопка з hover, pressed, loading, success — одна Rive-анімація з чотирма станами проти чотирьох окремих Lottie-файлів. Це зменшує обсяг коду та спрощує підтримку.

Як впровадити анімації Lottie за 4 кроки?

  1. Експорт з After Effects через плагін Bodymovin — отримуєте .json.
  2. Додавання файлу до ресурсів проєкту (assets або drawable).
  3. Ініціалізація плеєра — в iOS використовуйте LOTAnimationView, в Android — LottieAnimationView.
  4. Запуск з параметрамиloopMode, animationSpeed, contentMode. Для складних сценаріїв — кастомний AnimationListener.

На практиці цей підхід працює, але потребує контролю версій Lottie-файлів. Ми рекомендуємо версіонувати їх разом з кодом і тестувати на цільових пристроях.

Spring-фізика та Hero transitions: як досягти природності

Spring-анімація відчувається природньо тому що імітує фізику — масу, жорсткість і демпфування. У SwiftUI: Animation.spring(response:dampingFraction:). В Android Compose: spring(dampingRatio = Spring.DampingRatioMediumBouncy).

Для Hero-переходів (елемент «перелітає» між екранами) на iOS використовуємо UIViewControllerTransitioningDelegate + UIViewControllerAnimatedTransitioning. У SwiftUI — matchedTransitionSource + navigationTransition(.zoom). На Flutter — Hero віджет, який працює з коробки.

Як уникнути типових помилок у Hero transitions?

Анімація починається нормально, але на цільовому екрані елемент «стрибає» в фінальну позицію. Причина — AutoLayout constraints застосовуються до завершення анімації. Рішення: layoutIfNeeded() в блоці анімації або використання transform замість frame-змін. На Flutter — перевіряйте HeroFlightShuttleConfiguration. Також слідкуйте за VSync: на Android при 90 Гц дисплеї Hero-перехід може виглядати смиканим, якщо не виставлений Choreographer.

Таблиця: Строки виконання та типові сценарії

Задача Час Коментар
Базові екранні переходи та мікроінтеракції 1 тиждень Стандартні gesture-driven sheets, каруселі
Lottie/Rive інтеграція з дизайн-системою 3-5 днів Після отримання фінальних файлів
Кастомна інтерактивність з фізикою (сustom sheet, drawer) 1-2 тижні Включає тестування на 4+ пристроях

Що входить в роботу: анімаційний шар під ключ

  • Інтеграція Lottie/Rive-файлів в дизайн-систему
  • Код gesture-driven переходів (bottom sheets, drawers, каруселі)
  • Тестування на реальних пристроях (iOS, Android)
  • Документація з анімацій (архітектура, ключі станів)
  • Підтримка при оновленні дизайну (гарантія 30 днів)

У нас 5+ років досвіду в мобільній розробці, понад 30 проєктів з анімаціями, сертифіковані iOS/Android розробники. Замовте анімації під ключ — перша консультація безкоштовна. Напишіть нам у месенджер, щоб узгодити деталі.

Apple Developer Documentation – UIKit Animations використовується як базова специфікація.