Интеграция физического движка и настройка коллайдеров
Некорректно настроенные коллайдеры — одна из самых частых и при этом малозаметных проблем в 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 для сложных сцен.





