Разработка системы столкновений (Collision System) мобильной игры
Вы запускаете раннер на Android, и персонаж проваливается сквозь платформу на 60-м уровне. FPS падает с 30 до 20 на Galaxy A10. Туннелирование и ложные срабатывания — симптомы неоптимизированной физики. Стандартные коллайдеры Unity и Godot работают на десктопе, но на мобильных устройствах с непостоянным FPS и throttling-ом процессора система столкновений даёт сбои. За годы мы оптимизировали collision detection для игр разных жанров — от раннеров до платформеров. Более 40 проектов с кастомной физикой, и мы гарантируем качество на всех этапах. Экономия на тестировании и доработках — до 40% бюджета. Снижение затрат на реализацию кастомной физики — до 50%.
Проблемы штатных коллайдеров на мобильных устройствах
Туннелирование — объект на высокой скорости проходит сквозь другой между двумя физическими шагами. CollisionDetectionMode.Continuous в Unity решает это, но стоит примерно в 2 раза дороже по CPU, чем Discrete. На бюджетных Android-устройствах это ощутимо — мы фиксировали просадки до 15% FPS при массовом использовании Continuous.
Ложные срабатывания на стыках. PolygonCollider2D с несколькими вершинами на стыке двух тайлов часто генерирует фантомный коллижн — персонаж спотыкается на ровной поверхности. В Unity решается через Composite Collider 2D, который объединяет коллайдеры соседних тайлов в одну полигональную форму. В Godot аналог — TileMap с автоматическим объединением коллизионных форм.
Дорогие MeshCollider. MeshCollider с Convex = false в Unity не участвует в dynamic-to-dynamic коллизиях — только static. Если нужны произвольные формы для динамических объектов, аппроксимируйте примитивами: несколько BoxCollider/CapsuleCollider вместо одного MeshCollider. Это ручная работа, но сокращает нагрузку на broadphase в разы.
Как настроить матрицу слоёв коллизий для мобильных игр?
Первое, что настраиваем — Layer Collision Matrix. Типичная ошибка — оставить все слои взаимодействующими. В игре с 5 типами объектов это 25 пар проверок вместо 6-8 реально нужных. Для мобильного проекта это напрямую влияет на broadphase. Меньше активных пар — меньше работы на каждый физический шаг.
| Типов объектов | Все пары | Оптимизированные пары | Экономия проверок |
|---|---|---|---|
| 5 | 25 | 8 | 68% |
| 10 | 100 | 20 | 80% |
| 15 | 225 | 35 | 84% |
Оптимизация матрицы слоёв даёт экономию до 84% проверок без потери точности. Снижение нагрузки на CPU до 84% — это реальный выигрыш на слабых устройствах.
Пример настройки Fixed Timestep
Для устройств с 60 FPS рекомендуется Fixed Timestep = 0.0167 с. Для 30 FPS — 0.0333 с. Но не меняйте его бездумно: слишком низкий — избыточная нагрузка, слишком высокий — туннелирование. Профилируйте на целевом устройстве.Когда использовать Trigger, а когда Collision?
| Сценарий | Тип | Пример |
|---|---|---|
| Физическое столкновение с отталкиванием | Collision (OnCollisionEnter) | Удар мяча о стену |
| Логическое пересечение без физики | Trigger (OnTriggerEnter) | Зона получения предмета |
| Проверка нажатия кнопки | Trigger | UI Raycast |
Коллизия — физическое столкновение с импульсом, триггер — логическое пересечение без физики. Частая ошибка: использовать Collision там, где нужен только Trigger, добавляя лишние Rigidbody и нагружая solver. На Godot 4 аналог: Area2D для триггеров, CharacterBody2D.move_and_collide() для физических взаимодействий. move_and_slide() автоматически скользит по наклонным поверхностям — то, что в Unity нужно реализовывать вручную через нормаль поверхности.
Когда движковая физика избыточна: кастомный raycast
Для некоторых жанров движковая физика избыточна. Пример: раннер, где нужна только коллизия персонажа с землёй и препятствиями. Вместо Rigidbody + Collider — raycast-based система:
void CheckGround() { RaycastHit2D hit = Physics2D.Raycast( transform.position, Vector2.down, groundCheckDistance, groundLayer ); isGrounded = hit.collider != null; if (isGrounded) groundNormal = hit.normal; } void CheckObstacles() { RaycastHit2D hit = Physics2D.BoxCast( transform.position, colliderSize, 0f, Vector2.right, obstacleCheckDistance, obstacleLayer ); if (hit.collider != null) OnObstacleHit(hit); } Это легче, полностью детерминировано и даёт прямой контроль. Нет случайных джитер-эффектов от solver-итераций. На слабых устройствах такая система в 2-3 раза быстрее стандартной Rigidbody-физики.
Как мы оптимизируем collision detection: пошаговый план
- Профилирование на целевом устройстве. Используем Unity Profiler (Deep Profile), смотрим Physics.Processing и Physics2D.Processing. Выявляем узкие места: слишком мелкий Fixed Timestep, interpolate на десятках объектов, динамические CompositeCollider2D.
- Настройка матрицы слоёв. Убираем лишние пары, определяем только необходимые взаимодействия. Это снижает нагрузку на broadphase до 80%.
- Выбор типа детектора. Для быстрых объектов включаем Continuous, для остальных Discrete. Если нужна полная детерминированность — реализуем raycast-based систему.
- Аппроксимация коллайдеров. Заменяем MeshCollider на комбинацию примитивов. Оптимизируем PolygonCollider2D через Composite Collider 2D или TileMap.
- Тестирование на 10+ устройствах. Проверяем на флагманах и бюджетных Android-устройствах. Фиксируем FPS и потребление CPU.
Что входит в работу
- Анализ текущей физики — профилирование на реальных устройствах, выявление узких мест.
- Проектирование слоёв коллизий — настройка матрицы, оптимизация пар.
- Реализация кастомных детекторов — raycast, sweep, AABB при необходимости.
- Тестирование — на 10+ моделях устройств от флагманов до бюджетных.
- Документация — подробное описание системы, рекомендации по настройке.
- Обучение команды — разбор работы с компонентом.
Сроки: простые механики — от 3 до 5 дней, сложные (с многослойной геометрией и кастомным детектором) — от 1 до 3 недель. Стоимость рассчитывается индивидуально — оценим ваш проект бесплатно. Свяжитесь с нами для консультации. Закажите оптимизацию collision detection — получите бесплатную оценку вашего проекта.
Наши решения проходят App Store Review Guidelines и Google Play Console без замечаний. 8+ лет опыта в мобильной gamedev, более 40 выполненных проектов с кастомной физикой, гарантия качества и поддержка после сдачи. Для углублённого понимания см. Collision detection.







