Некорректно налаштовані колайдери — одна з найчастіших і малопомітних проблем у Unity-проєктах. Ми, як інженери з 10+ річним досвідом, бачимо це постійно: персонаж провалюється крізь підлогу на високій швидкості, кулі зникають, не влучивши в ціль, фізичні об'єкти тремтять на статичній поверхні. Причини майже завжди в основах: неправильний тип колайдера, відсутність Continuous collision detection, невірне налаштування шарів. Наша команда має 10+ років досвіду та понад 50 завершених проєктів — гарантуємо усунення цих проблем під ключ. Вартість базового налаштування фізики починається від $300.
Чому колайдери налаштовані неправильно?
Unity пропонує шість примітивних колайдерів: BoxCollider, SphereCollider, CapsuleCollider, MeshCollider, WheelCollider, TerrainCollider. Плюс 2D-аналоги. MeshCollider — головне джерело проблем у руках недосвідчених розробників. Convex MeshCollider працює з Rigidbody коректно, але обмежений 255 полігонами. Non-convex не може застосовуватися до динамічних об'єктів взагалі — Unity видасть попередження, але не заблокує, і поведінка буде невизначеною. Для персонажів і снарядів завжди використовуємо примітиви; MeshCollider — тільки для статичної геометрії рівня.
CapsuleCollider оптимальний для персонажів (вертикально) і куль (горизонтально). Два параметри: radius і height. Типова помилка — капсула персонажа налаштована по VisualMesh, а не по геймплейним потребам: занадто широка капсула робить персонажа «жирнішим», ніж він виглядає, і він не пролазить у вузькі проходи. SphereCollider — найдешевший за обчисленнями. Для снарядів, гранат і невеликих предметів переважніший CapsuleCollider, якщо форма дозволяє.
Як налаштувати Layer Matrix?
Physics Layer Collision Matrix (Edit → Project Settings → Physics → Layer Collision Matrix) визначає, які шари взаємодіють. Некорректно вибудована матриця призводить до: снарядів, що влучають у своїх; trigger-зон, що реагують на оточення, а не тільки на гравця; ворогів, що штовхають один одного при скупченні. Правильна структура шарів для типової гри: Default, Player, Enemy, Projectile, Environment, Trigger, Debris. Projectile взаємодіє з Player, Enemy, Environment — але не з Trigger, Debris, іншими Projectile. Trigger не взаємодіє ні з чим фізично — тільки OnTriggerEnter. При використанні Physics.Raycast або Physics.OverlapSphere завжди передавайте LayerMask явно — без маски каст перевіряє всі шари, включаючи невидимі UI-колайдери та зони-тригери, повертаючи несподівані хіти. За документацією Unity, Layer Matrix може знизити навантаження на CPU до 30% при правильному налаштуванні.
Collision Detection Mode: як перемогти тунельний ефект
За замовчуванням Rigidbody використовує Discrete collision detection: позиція об'єкта перевіряється на початку та в кінці кожного FixedUpdate. Якщо об'єкт рухається швидше, ніж size_object / fixedDeltaTime одиниць за секунду, він може «перестрибнути» крізь тонку геометрію — це тунельний ефект. Куля діаметром 0.1 units при швидкості 50 m/s пролітає 50 * 0.02 = 1 unit за один FixedUpdate. Стіна товщиною 0.5 units буде пропущена. Рішення:
- Встановіть Rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous для динамічних об'єктів, які можуть тунелювати крізь статику.
- Використовуйте CollisionDetectionMode.ContinuousDynamic для об'єктів, які можуть тунелювати крізь інші динамічні об'єкти.
- Для куль з дуже високою швидкістю — застосовуйте Physics.Raycast або Physics.SphereCast замість фізичного Rigidbody: це надійніше та продуктивніше.
Continuous режим дорожчий по CPU приблизно в 2 рази порівняно з Discrete, але забезпечує точність зіткнень на 99%. Застосовуємо тільки до швидких снарядів і персонажів — не до всіх об'єктів підряд.
PhysicsMaterial і налаштування тертя
PhysicMaterial задає dynamicFriction, staticFriction і bounciness. Комбінування двох матеріалів контактуючих об'єктів відбувається за правилом frictionCombine і bounceCombine (Average, Minimum, Multiply, Maximum). Для персонажа на Rigidbody: PhysicMaterial з dynamicFriction = 0, staticFriction = 0, frictionCombine = Minimum. Без цього персонаж ковзає по стінах, застрягає на ребрах, несподівано гальмує на похилих поверхнях. Для відскакуючих об'єктів: bounciness = 0.6, bounceCombine = Maximum. При bounceCombine = Average м'яч, кинутий на поверхню з bounciness = 0, не відскочить взагалі — навіть якщо у самого м'яча високе значення.
Compound Colliders і оптимізація
Складні форми об'єктів описуємо кількома примітивними колайдерами на дочірніх об'єктах — compound collider. Один Rigidbody на батьківському об'єкті керує всією фізичною одиницею. Це дешевше MeshCollider і точніше одного BoxCollider. Наприклад, compound collider з 3 BoxCollider зменшує кількість полігонів у 4 рази порівняно з MeshCollider. Для транспортних засобів: окремі BoxCollider для корпусу, бамперів, колісних арок. WheelCollider — спеціалізований компонент для реалістичної поведінки підвіски; не бере участі в стандартних OnCollisionEnter подіях.
Що входить у налаштування фізики під ключ
| Етап | Деталі |
|---|---|
| Аудит поточної конфігурації | Аналіз колайдерів, Layer Matrix, PhysicMaterial і collision detection |
| Проєктування та реалізація | Налаштування типів колайдерів, compound colliders, фізичних матеріалів |
| Оптимізація продуктивності | Налаштування Layer Matrix, зменшення draw calls за рахунок batching, налаштування solver iteration |
| Тестування | Перевірка на тунельний ефект, стабільність фізики на різних FPS |
| Документація та навчання | Опис архітектури, рекомендації для подальшої розробки |
Терміни: від 2 днів для базового налаштування персонажа до 8 тижнів для кастомного фізичного вирішувача. Вартість розраховується індивідуально — зв'яжіться з нами для оцінки.
| Задача | Термін |
|---|---|
| Базове налаштування колайдерів персонажа + Layer Matrix | 1–2 дні |
| Фізика транспорту (WheelCollider, suspension) | 3–7 днів |
| Система руйнівних об'єктів (fractured meshes + Rigidbody) | 1–2 тижні |
| Кастомний фізичний вирішувач (без PhysX) | 4–8 тижнів |
Типові помилки та як їх уникнути
Колайдер перекриває Renderer меш — персонаж візуально проходить крізь стіну, хоча фізично впирається в невидимий бар'єр. Слідкуйте за відповідністю габаритів колайдера та меша. OnCollisionEnter не викликається — один з об'єктів kinematic Rigidbody або StaticCollider без Rigidbody. OnCollisionEnter вимагає Rigidbody хоча б на одному з об'єктів. Для статичної геометрії рівня достатньо OnTriggerEnter на trigger-зонах. Фізичні об'єкти тремтять на місці — solver iteration count занадто низький або об'єкт знаходиться під дією конкуруючих сил. Збільшіть Default Solver Iterations з 6 до 10–12 для складних сцен. Частота помилок при правильному налаштуванні падає на 60%.
Наші інженери з багаторічним досвідом допоможуть уникнути цих пасток. Замовте налаштування фізики — отримайте консультацію та готове рішення.






