Інтеграція фізичного рушія та налаштування коллайдерів
Некоректно налаштовані коллайдери — одна з найчастіших та при цьому малозаметних проблем у Unity-проектах. Персонаж проваливається крізь пол на високій швидкості, кулі зникають не попавши в ціль, фізичні об'єкти дрижать на статичній поверхні. Причини майже завжди в основах: неправильний тип коллайдера, відсутність Continuous collision detection, невірна настройка шарів.
Типи коллайдерів та коли що використовувати
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-коллайдери та зони-триггери, та повертає неочікувані хіти.
Collision Detection Mode та тоннельний ефект
За замовчуванням Rigidbody використовує Discrete collision detection: позиція об'єкту перевіряється на початку та в кінці кожного FixedUpdate. Якщо об'єкт рухається швидше, ніж розмір_об'єкту / 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. Застосовувати лише до швидких снарядів та персонажів — не до всіх об'єктів підряд.
PhysicsMaterial та налаштування тертя
PhysicMaterial (Physics Material asset) задає 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.
Для транспортних засобів: окремі BoxCollider для корпусу, бамперів, колісних арок. WheelCollider — спеціалізований компонент для реалістичної поведінки підвіски; не є звичайним коллайдером та не бере участь у стандартних OnCollisionEnter подіях.
Орієнтовні строки
| Задача | Строк |
|---|---|
| Базова настройка коллайдерів персонажа + 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 занадто низький або об'єкт знаходиться під дією конкуруючих сил. Збільшити Edit → Project Settings → Physics → Default Solver Iterations з 6 до 10–12 для складних сцен.





