Некорректно настроенные коллайдеры — одна из самых частых и малозаметных проблем в Unity-проектах. Мы, как инженеры с 10+ летним опытом, видим это постоянно: персонаж проваливается сквозь пол на высокой скорости, пули исчезают, не попав в цель, физические объекты дрожат на статичной поверхности. Причины почти всегда в основах: неправильный тип коллайдера, отсутствие 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 задаёт 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, 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 для сложных сцен.
Наши инженеры с многолетним опытом помогут избежать этих ловушек. Закажите настройку физики — получите консультацию и готовое решение.






