Розробка системи зіткнень (Collision System) мобільної гри
Ви запускаєте раннер на Android, і персонаж провалюється крізь платформу на 60-му рівні. FPS падає з 30 до 20 на Galaxy A10. Тунелювання та хибні спрацювання — симптоми неоптимізованої фізики. Стандартні колайдери Unity та Godot працюють на десктопі, але на мобільних пристроях з непостійним FPS та троттлінгом процесора система зіткнень дає збої. За роки ми оптимізували collision detection для ігор різних жанрів — від раннерів до платформерів. Більше 40 проєктів з кастомною фізикою, і ми гарантуємо якість на всіх етапах. Економія на тестуванні та доопрацюваннях — до 40% бюджету. Зниження витрат на реалізацію кастомної фізики — до 50%.
Проблеми штатних колайдерів на мобільних пристроях
Тунелювання — об'єкт на високій швидкості проходить крізь інший між двома фізичними кроками. CollisionDetectionMode.Continuous в Unity вирішує це, але коштує приблизно вдвічі дорожче по 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.







