Інтеграція фізичного рушія та налаштування колайдерів

Наша компанія з розробки відеоігор веде незалежні проекти, спільно з клієнтом створює ігри та надає додаткові операційні послуги. Досвід нашої команди дозволяє нам охопити всі ігрові платформи та розробити приголомшливий продукт, що відповідає баченню клієнта та перевагам гравців.

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1 послугУсі 242 послуг
Інтеграція фізичного рушія та налаштування колайдерів
Середня
від 2 робочих днів до 2 тижнів
Часті питання

Наші компетенції

Які етапи розробки гри?

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    683
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    862
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    491
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    533

Інтеграція фізичного рушія та налаштування коллайдерів

Некоректно налаштовані коллайдери — одна з найчастіших та при цьому малозаметних проблем у 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 для складних сцен.