Разрушение здания в игре выглядит неестественно — куски камня ведут себя как картонные коробки. Игровая физика твёрдых тел решает не задачу физической точности, а задачу визуального правдоподобия при минимальных вычислительных затратах. Разница принципиальная: PhysX SDK в Unity просчитывает rigid body interactions в реальном времени на CPU, и при 50 одновременно активных Rigidbody с mesh collider вместо примитивов вы легко теряете 10ms frame time на физику в пустой сцене. Наш опыт показывает, что правильная архитектура спасает проект от провала по FPS budget. Экономия времени на отладку — до 40% бюджета разработки.
Нужна реалистичная физика разрушений? Свяжитесь с нами для консультации — разберём ваш проект за один день.
Как симуляция физики твердых тел влияет на производительность?
Debris simulation при разрушении — самая распространённая задача. Здание взрывается, куски летят. Наивный подход: разбить меш на части, добавить Rigidbody на каждую, активировать при взрыве. Проблемы этого подхода очевидны после первого профилирования.
Как оптимизировать коллайдеры: Mesh Collider vs примитивы
Mesh Collider для каждого фрагмента — это convex mesh computation при каждом FixedUpdate'е. Для 20 фрагментов на GPU это приемлемо, для 200 — нет. Правильное решение: составной collider из примитивов (несколько Box Collider или Capsule Collider на одном GameObject), которые аппроксимируют форму фрагмента. Это в 5–10 раз дешевле, визуально почти неотличимо при быстром движении debris.
| Тип коллайдера |
Примерная стоимость (CPU) |
Когда использовать |
| Mesh Collider (convex) |
1x |
Малое количество фрагментов (до 20) |
| Mesh Collider (non-convex) |
0.5x (только статика) |
Статические объекты |
| Примитивный составной |
0.1x |
Debris, активные объекты |
Sleeping. Rigidbody переходит в Sleep состояние, когда скорость падает ниже Physics.sleepThreshold. Спящие Rigidbody не потребляют CPU. Критично: убедиться, что sleepThreshold не слишком низкий (default 0.005 — обычно нормально), и что объекты действительно засыпают после приземления. Если фрагмент лежит на неровной поверхности и микровибрирует — он никогда не заснёт. Это фиксируется через AddTorque = 0 + принудительный rigidbody.Sleep() через Coroutine с проверкой velocity < threshold.
Pooling. Debris объекты должны возвращаться в Object Pool, а не уничтожаться через Destroy(). Destroy() вызывает GC allocation, что даёт frame spike именно в момент взрыва — когда performance и так под нагрузкой. Pool с фиксированным максимум 50–100 фрагментов, LRU вытеснение (самый старый деактивируется при нехватке) — стандартный паттерн.
Почему pre-broken геометрия дешевле realtime?
Realtime fracturing (Voronoi разбивка меша при ударе) — красиво в демо, дорого в продакшне. На PC это допустимо для редких событий (взрыв раз в 30 секунд), на мобильных — практически неприемлемо.
Индустриальный стандарт: pre-broken geometry. Объект заранее разбивается на фрагменты в DCC-инструменте (Blender Fracture Modifier, 3ds Max ProBoolean, или специализированный инструмент типа RayFire). Все фрагменты существуют в сцене изначально, но без Rigidbody, в режиме Kinematic или просто статические. При взрыве: включаем Rigidbody, применяем AddExplosionForce, фрагменты разлетаются.
Explosion Force в Unity: Rigidbody.AddExplosionForce(force, explosionPos, radius, upwardsModifier). upwardsModifier — важный параметр, часто игнорируемый. Он добавляет вертикальную составляющую к силе, что делает взрыв более «вверх» вместо чисто радиального разлёта. Значение 0.5–1.0 создаёт более кинематографичный вид.
Для крупных объектов (здание, стена) фрагменты могут быть иерархическими: крупные куски разбиваются на более мелкие при приземлении через secondary fracture trigger.
Cloth Simulation как часть rigid body сцены
PhysX в Unity содержит Cloth компонент для Skinned Mesh Renderer — это soft body simulation. Флаг на ветру, плащ персонажа, верёвки — всё это Cloth. Интеграция Cloth и Rigidbody — распространённая задача: флаг, прикреплённый к столбу, который падает как Rigidbody.
Cloth Constraint — это fixed particles (вершины, прибитые к transform) и свободные. При падении столба: Constraint Target трансформируется вместе с Rigidbody столба, cloth следует. Ограничение: Unity Cloth не поддерживает collision с динамическими Rigidbody — только со сферами и капсулами, задаваемыми через cloth.capsuleColliders и cloth.sphereColliders. Это означает, что ткань не будет корректно взаимодействовать с обломками — нужна либо аппроксимация через примитивы, либо fake через animation.
| Параметр Cloth |
Рекомендуемое значение |
Влияние на производительность |
| Max Distance |
0.0 (off) |
Максимальное растяжение |
| Surface Drag |
0.1–0.5 |
Демпфирование движения |
| Bending Stiffness |
0.1–0.3 |
Жёсткость ткани |
Ragdoll и active ragdoll для персонажей
Ragdoll — это набор Rigidbody + Joint на скелете персонажа, активируемый при смерти или падении. Стандартный Unity Ragdoll Wizard создаёт базовую структуру, но его результат требует тонкой настройки.
Ключевые проблемы дефолтного ragdoll:
- ConfigurableJoint с слишком широкими angular limits → конечности складываются в физически невозможные позиции
- Мелкие Rigidbody (пальцы, стопы) с малой массой → нестабильность physics solver, jitter
- Переход из Animator к Ragdoll виден как «щелчок» позы
Active Ragdoll — гибридный подход: Animator продолжает работать, но Rigidbody joints применяют force для следования за анимированными позами. В Unity это реализуется через ConfigurableJoint.targetRotation = разница между текущей rotation joint и target из Animator. Вес физики vs анимации управляется через Joint.slerpDrive.positionSpring. Это даёт процедурное падение с сохранением анимационного контроля — персонаж «борется» с физикой вместо того, чтобы мгновенно стать тряпичной куклой.
Процесс работы и что входит
Мы работаем под ключ: анализируем сцену, проектируем архитектуру, реализуем физику и проводим стресс-тестирование. Стоимость рассчитывается индивидуально под каждый проект.
| Что входит в работу |
Описание |
| Архитектура физики |
Выбор подхода (pre-broken, realtime), настройка коллайдеров |
| Реализация debris |
Object Pool, AddExplosionForce, sleep-оптимизация |
| Настройка ragdoll |
Joint limits, active ragdoll blend |
| Cloth integration |
Constraint setup, collision proxies |
| Документация |
Описание архитектуры, инструкции по настройке |
| Техподдержка |
2 недели после внедрения |
| Тип задачи |
Ориентировочный срок |
| Debris система (pre-broken, 20–50 фрагментов) |
3–5 дней |
| Ragdoll настройка для персонажа |
2–4 дня |
| Active Ragdoll с blend анимация/физика |
5–10 дней |
| Полная destructible environment система |
2–4 недели |
Оценим ваш проект за 1 день. Свяжитесь с нами — пришлём коммерческое предложение с описанием этапов и гарантией результата. Наш опыт — более 5 лет в геймдеве, более 30 реализованных проектов. Экономия времени на отладку физики — один из ключевых результатов для наших клиентов. Получите консультацию, если хотите избежать типичных ошибок.
Как отличить рабочий шейдер от провального?
Программист добавляет в сцену воду — получает синий прямоугольник. Asset Store выдаёт устаревший ассет с артефактами на мобиле. Разработка шейдеров — это не просто натягивание текстуры, а сложная инженерная задача: нужно понимать depth buffer, семплировать нормали в несколько слоёв, организовывать foam на пересечении с геометрией. Без этого шейдер либо не работает, либо убивает FPS. Мы занимаемся профессиональной разработкой шейдеров и VFX более пяти лет — за это время прошли десятки проектов от инди до AAA. Однажды заказчик принёс сцену с водой из Asset Store: на мобильном устройстве она выдавала 12 FPS из-за отсутствия LOD и неправильного бэтчинга. Переписали шейдер под URP — получили 60 FPS с сохранением визуала. Подробнее о шейдерах
URP vs HDRP: что выбрать для вашего проекта?
Выбор Render Pipeline фиксируется на старте — шейдеры под HDRP не работают в URP и наоборот. Оцените компромиссы по таблице:
| Параметр |
URP |
HDRP |
| Целевые платформы |
Mobile, PC, консоли |
PC, консоли (High-end) |
| Производительность |
Низкий overhead, до 40% быстрее на мобайле |
Высокая нагрузка, фотореализм |
| Screen Space Reflections |
Ограниченно (с версии 14) |
Полноценно с настройками |
| Volumetric Fog |
Через кастом |
Встроенная система |
| Water System |
Отсутствует |
Встроенная |
| ShaderGraph ноды |
Базовый набор |
Расширенный (Diffusion Profile, Eye) |
Вывод: URP даёт до +40% FPS на мобильных устройствах по сравнению с HDRP. Для мобильной RPG выбрали URP — на iPhone 8 получили стабильные 60 FPS без потери качества. HDRP оправдан на PC/консолях, где нужен фотореализм и встроенная Water System.
Разработка шейдеров в ShaderGraph: от воды до растительности
ShaderGraph — нодовый редактор без HLSL, но понимание «под капотом» обязательно. Разберём водный шейдер — он включает несколько техник.
Нормали с движением. Два слоя normal map, семплированных с разными скоростями и направлениями:
Time → Multiply (speed1) → Add → Sample Texture 2D (normalMap)
Time → Multiply (speed2) → Add → Sample Texture 2D (normalMap)
→ Normal Blend → Normal (фрагментный шейдер)
Два разнонаправленных слоя создают эффект бегущих волн без тайловой периодичности. Потребление — 2 texture samples, что вписывается в бюджет 40 draw calls для водной поверхности.
Глубина и foam. Через нод Scene Depth (в URP/HDRP opaque texture должна быть включена) получаем разницу между глубиной сцены и позицией фрагмента воды. Малая глубина (пересечение с берегом) → foam через Step/Smoothstep. Большая глубина → более насыщенный синий, выше непрозрачность. Foam добавляет 1-2 ms на GPU, но даёт реалистичную береговую линию.
Рефракция. Scene Color + смещение UV по normal map — дно «плывёт». Вода рендерится в Transparent очереди, после всей непрозрачной геометрии. Обязательно включать Opaque Texture в настройках URP, иначе рефракция не работает.
Fresnel и отражения. Fresnel Effect нод — вблизи нормали к камере поверхность прозрачнее, под острым углом отражает. Физически корректно для диэлектриков. Поверх Fresnel-маски добавляется кубмап или Reflection Probe. На мобильных платформах Reflection Probe заменяем на кубмап низкого разрешения (128x128) — экономия 1-2 ms.
Шейдер растительности. Анимация кустов и травы без физической симуляции — через вертексный шейдер. В ShaderGraph: берём XZ-координаты вершины как фазовый сдвиг, Time → Sine с разной фазой, умножаем на Vertex Color канал R (белый = качается, чёрный = закреплён к земле). Результат: трава качается волнами, основание фиксировано. Для «ветра при беге игрока» — добавляем CPU-параметр _PlayerPosition. Такой шейдер обрабатывает 100 000 вершин за 0.3 ms на iPhone 11.
Детали оптимизации водного шейдера
Исходный ассет использовал 4 слоя normal map и dynamic cubemap reflections — на мобильном устройстве это давало 12 FPS. После переписывания под URP с двумя слоями, упрощённым foam и baked reflections получили 60 FPS. Экономия времени разработки: 1 день вместо 3 дней на адаптацию ассета.
VFX Graph: как управлять миллионами частиц на GPU
VFX Graph исполняется полностью на GPU через Compute Shaders. В отличие от Particle System (Shuriken), которая работает на CPU, здесь можно управлять миллионами частиц без нагрузки на CPU. Пример: взрыв с шрапнелью (200 частиц) на GPU занимает 0.05 ms, тогда как CPU Particle System той же сложности — 0.8 ms.
Граф делится на контексты: Spawn (burst, constant rate, event trigger), Initialize (начальные атрибуты), Update (гравитация, турбулентность, коллизии), Output (Quad, Mesh, Lit/Unlit, Distortion).
Пример: взрыв с шрапнелью
Spawn: Single Burst (count: 200)
↓
Initialize:
Position: Sphere Volume (radius: 0.1)
Velocity: Spherical * Random(5, 15)
Size: Random(0.05, 0.3)
Lifetime: Random(0.5, 2.0)
Color: Gradient по lifetime (белый → оранжевый → серый)
↓
Update:
Gravity (force: -9.8)
Drag (coefficient: 0.2)
Turbulence (intensity: 2.0)
Collision (SDF сцены или Depth Buffer)
↓
Output Quad (Unlit):
Texture: искра
Blend Mode: Additive
Turbulence использует Noise Field — трёхмерный шум, частицы отклоняются органично. Flipbook анимации в Output контексте — анимация спрайта для каждой частицы. Для мобильных платформ снижаем количество частиц до 50 и отключаем Collision — экономия 3 ms.
Почему пост-обработка требует настройки под платформу?
Post-processing — эффекты на финальном изображении после основного рендера. В Unity через Volume систему (Local/Global Volume). Типичный стек для action-проекта:
| Эффект |
Назначение |
Особенности |
| Bloom |
Свечение ярких источников |
Threshold 0.8, intensity 0.5 — экономия 1 ms |
| Tonemapping |
ACES filmic для реализма, Neutral для стилизации |
Стандарт для realistic проектов |
| Color Adjustments |
Контраст +10%, насыщенность +5% |
Коррекция под настроение |
| Vignette |
Затемнение краёв |
Intensity 0.3 — фокус на центре |
| Motion Blur |
Размытие по вектору движения |
На мобайле отключаем — -2 ms GPU |
| Depth of Field |
Боке |
В VR осторожно — ломает восприятие глубины |
| Screen Space Ambient Occlusion |
SSAO / HBAO |
Затемнение в углах геометрии, +1.5 ms |
Для мобильных платформ мы отключаем Motion Blur и SSAO, снижаем Bloom до 2-3 passes — итоговый бюджет пост-обработки 3-4 ms. На PC/HDRP стек может занимать 8-10 ms, но это компенсируется мощностью GPU.
Что входит в работу: от шейдера до поддержки
- Разработка кастомных шейдеров в ShaderGraph (URP / HDRP): вода, растительность, персонажные эффекты, голограммы, dissolve.
- VFX Graph эффекты: взрывы, огонь, дым, магия, окружение. Максимальная производительность — до 2 млн частиц на GPU при 60 FPS.
- Настройка и оптимизация Particle System (Shuriken) для мобильных платформ: замена на GPU-инстансы снижает draw calls на 70%.
- Построение Post-Processing стека под визуальный стиль проекта с замером времени рендера.
- Портирование шейдеров между URP и HDRP при смене пайплайна: среднее время 0.5-1 день на шейдер.
- Оптимизация VFX для целевой платформы: GPU instancing, LOD частиц, culling.
Deliverables: исходники шейдеров и VFX графов, документация по настройке, обучение команды (1 час консультации), поддержка в течение месяца после сдачи. Оценим проект за 1 рабочий день — свяжитесь с нами. Получите консультацию по вашему проекту — мы подберём оптимальное решение и назовём сроки.
Наш опыт и гарантии
Более 5 лет в геймдеве, 50+ проектов (мобильные, PC, консоли). Гарантируем, что шейдер будет работать на целевой платформе с заявленным FPS — если нет, дорабатываем бесплатно. Пример: для одной инди-студии переписали все шейдеры под URP — FPS на iPhone 8 вырос с 25 до 60, а бюджет времени на рендер сократился на 40%. Используем последние стабильные версии Unity (LTS) и Unreal Engine 5, работаем с Vulkan, Metal, DirectX 12.
Сравнение: готовый ассет из Asset Store часто требует доработки (совместимость, производительность) — кастомная разработка шейдеров обходится в 2-3 раза быстрее по времени, чем адаптация чужого кода. А шейдер, написанный с нуля под ваши задачи, даёт 100% контроль над производительностью и визуалом. Экономия бюджета на одном проекте достигает 30% за счёт отсутствия лишнего кода.
Этапы работы
- Анализ: изучаем сцену, целевые платформы, требования к FPS. Фиксируем визуальные референсы.
- Прототипирование: создаём шейдер/VFX граф, тестируем на референсном устройстве.
- Интеграция: встраиваем в проект, настраиваем параметры, оптимизируем draw calls и batching.
- QA: проверяем на всех целевых платформах (Android, iOS, PC, консоли), исправляем артефакты.
- Деплой и передача: отдаём исходники, документацию, проводим обучение. Поддержка — 1 месяц.
Сроки: от 2 до 10 рабочих дней в зависимости от сложности. Стоимость рассчитывается индивидуально — пишите, оценим ваш проект. Закажите разработку шейдеров — получите готовый результат с гарантией производительности.