Skip to content
E
Egmatic
настройка 2d физикиошибки физикиигровая физикаBox2Dразработка игр

Настройка 2D-физики: 8 частых ошибок, которые ломают игру

Большинство проблем с 2D-физикой — это не баги движка, а ошибки настройки. Вот восемь, за которыми стоит почти каждый случай: физика считает в пикселях, а не в метрах, шаг симуляции привязан к частоте кадров, выбран неверный тип тела, выключено непрерывное обнаружение столкновений, персонажем управляют как физическим телом, задано слишком мало итераций, позиция тела меняется напрямую и спящие тела не используются. Почините это на этапе настройки — и большинство дрожаний, проскоков и «прыгучего» управления исчезнет.

Vladislav Kovnerov13 июля 2026 г.11 мин

Большинство проблем с 2D-физикой — это не баги движка, а ошибки настройки. Восемь ошибок ниже объясняют почти каждый случай дрожания, проскоков сквозь стены, «прыгучего» управления и ненадёжных столкновений, которые начинающие разработчики списывают на движок. Ни одна из них не требует менять движок — требуется лишь настроить его так, как он задуман.

Если ваша игра использует движок 2D-физики — а так делает большинство, потому что Unity, Godot и GameMaker считают 2D-физику на Box2D или его близком родственнике, — то значения по умолчанию разумны. Но они предполагают, что вы соблюли несколько правил, которые легко нарушить с первого раза. Эта статья — те самые правила, оформленные в чеклист.

1. Физика считает в пикселях, а не в метрах

Самая частая ошибка, и из неё вырастает целое семейство симптомов: объекты падают слишком медленно или слишком быстро, стопки рушатся, трение ощущается не так, вся симуляция выглядит «не той».

Box2D настроен на метры, килограммы и секунды (МКС). В его документации прямо сказано: движущиеся объекты должны быть размером от 0,1 до 10 метров, причём около 1 метра — оптимально. Эрин Катто, автор Box2D, посвятил отдельную заметку тому, почему не стоит использовать пиксели как единицы. Гравитация, решатель и пороги усыпления в движке откалиброваны именно под этот масштаб.

Когда вы даёте ему игрока высотой 64 пикселя и стену толщиной 128 пикселей, вы сообщаете движку, что игрок примерно размером с здание. Гравитация, соотношения масс и поведение контактов в этом масштабе работать не задумывались.

Решение: выберите масштаб (обычно 32 или 100 пикселей в метре), заведите под него одну константу и переводите значения на границе. Физический мир мыслит метрами, ваш рендерер — пикселями. Не смешивайте их.

2. Шаг физики привязан к частоте кадров

Если шаг симуляции равен времени кадра, физика движется с разной скоростью в каждом кадре. При проседании до 30 fps шаг становится огромным, на 240-герцовом мониторе — крошечным. Большие шаги ведут к проскокам сквозь препятствия и взрывающимся стопкам; маленькие меняют то, как разрешаются трение и упругость. В итоге физика ведёт себя по-разному на разных машинах и даже в разные моменты времени.

Решение: фиксированный шаг с аккумулятором. Двигайте симуляцию вперёд одинаковыми порциями (обычно 1/60 c), накапливайте остаток реального времени и ограничивайте аккумулятор сверху, чтобы проседание не привело к «спирали смерти». При желании интерполируйте позицию при отрисовке между шагами физики для плавности. Каноническое описание этого приёма — «Fix Your Timestep!» Гленна Фидлера, и большинство движков реализуют его внутри себя, но вы должны следить, чтобы ваш собственный код движения пользовался фиксированным шагом, а не временем кадра.

3. Неверно выбран тип тела

В движках физики есть три типа тел, и ошибка с типом сразу ломает поведение:

ТипРеагирует на силы и гравитациюСдвигается при столкновенииДля чего подходит
СтатическоеНетНетСтены, пол, неподвижная геометрия уровня
КинематическоеНетНет (но может двигаться само)Движущиеся платформы, двери, триггеры
ДинамическоеДаДаЯщики, враги, всё, что должно падать и подвергаться толчкам

Частая ошибка — случайно сделать пол динамическим, и тогда весь уровень падает. Другая — сделать игрока кинематическим, а потом недоумевать, почему ящики не реагируют на столкновение с ним: кинематические тела толкают динамические, но лишь если движок настроен замечать такой контакт. Сначала подберите тип под роль тела, и только потом — всё остальное.

4. Непрерывное обнаружение столкновений выключено для быстрых объектов

Дискретное обнаружение проверяет: «не перекрывается ли этот объект прямо сейчас», один раз за шаг. Если за шаг пуля пролетает дальше, чем стена толще, то проверка в начале шага и проверка в конце шага обе дают «мимо», и пуля оказывается за стеной раньше, чем движок узнал о сближении. Это и есть туннелирование.

Решение: включить непрерывное обнаружение столкновений (CCD) — в терминах Box2D это режим bullet — для быстрых динамических тел. CCD «прокатывает» фигуру от старой позиции к новой и проверяет весь заметённый объём на пересечение. Это стоит дополнительных ресурсов процессора, поэтому включают его не глобально, а для отдельных тел. В дополнение держите разумную частоту симуляции, а для очень быстрых тонких объектов выполняйте явный рейкаст.

5. Персонажем управляют как физическим телом

Динамическое тело — это симуляция: силы накапливаются, инерция несёт, упругость отскакивает. Для ящика это прекрасно. Для платформенного персонажа, где нужно точное, чёткое управление — пробежал сюда, остановился здесь, прыгнул ровно на эту высоту, — это мучительно.

Разработчики, двигающие персонажа через скорость или силу физического тела, получают классические симптомы — «прыгучий прыжок», управление в воздухе как на льду и персонажа, который проезжает мимо точки остановки. Движок делает ровно то, о чём его просили.

Решение: используйте контроллер персонажа. Установившийся приём — кинематическое тело (или вообще без тела физики), которым двигает ваш код, плюс лучевая проверка или проверка формой, направленные вниз, чтобы определять, стоит ли персонаж на земле. Пусть движок физики считает ящики, которые бросает игрок, а самого игрока ему считать не нужно.

6. Слишком мало итераций решателя

Когда тела накладываются друг на друга, решатель движка расталкивает их за несколько итераций. Итераций мало — разрешение небрежное: стопка коробок дрожит и медленно утопает, шарниры ощущаются резиновыми, соединения шатаются. В Box2D по умолчанию 8 итераций по скорости и 3 по положению, что подходит для большинства сцен. Плотные стопки и сложные системы шарниров требуют большего.

Решение: поднимите число итераций (сначала по скорости, затем по положению) и следите, как стопка успокаивается. Это стоит ресурсов процессора, поэтому поднимайте только то, что нужно, и только там, где сцена этого требует. Заодно проверьте, что упругость равна нулю для объектов, которые должны покоиться, — ненулевая упругость на покоящихся контактах служит главной причиной непрекращающейся мелкой дрожи.

7. Позицию физического тела меняют напрямую

Если тело динамическое, а вы каждый кадр выставляете ему позицию напрямую (чтобы вести по маршруту, прилипнуть к сетке или исправить ошибку), вы вступаете в борьбу с решателем. У движка уже спланированы инерция и разрешение контактов для естественной позиции тела; вы телепортируете его в другое место; на следующем шаге движок дёргает его обратно или прикладывает огромные корректирующие импульсы к соседям. Симптом — резкая тряска или объекты, улетевшие через всю комнату.

Решение: для тела, которым владеет физика, никогда не пишите его позицию напрямую. Двигайте его через API движка — задавайте скорость, прикладывайте силу или импульс, либо сделайте тело кинематическим на то время, пока хотите управлять им вручную. Если телепортировать всё же необходимо, делайте это предусмотренным движком способом и сбрасывайте скорость.

8. Игнорируются спящие тела и широкая фаза

Две ошибки производительности, которые всплывают по мере роста игры. Во-первых, движок может усыплять покоящиеся тела и полностью пропускать их — но лишь если вы ему позволяете. Крошечный скрипт, который каждый кадр «шевелит» скорость всех тел, держит их начеку. Во-вторых, обнаружение столкновений ускоряется широкой фазой (деревом AABB), которая дёшево отсекает далёкие пары перед дорогой узкой фазой; если ваши коллайдеры огромны или у вас тысячи мелких пересекающихся, широкая фаза не может отсечь ничего, и кадр захлёбывается.

Решение: позвольте телам засыпать; не опрашивайте их, когда они в покое. Держите коллайдеры близко к видимой форме (никаких гигантских невидимых коробок «на всякий случай») и предпочитайте несколько составных коллайдеров десяткам мелких для сложных форм.

Симптом → ошибка настройки → решение

СимптомВероятная ошибкаРешение
Объекты падают с неверной скоростью, стопки рушатсяПиксели как единицы физикиПереведите в метры (диапазон 0,1–10 м)
Физика отличается от машины к машине, дрожит при лагахПеременный шагФиксированный шаг с аккумулятором
Быстрый снаряд проходит сквозь стенуCCD выключен для быстрого телаВключите bullet/CCD, поднимите частоту, рейкаст
Персонаж ощущается «прыгучим», проезжает мимо остановкиПерсонаж — динамическое телоКонтроллер персонажа на рейкастах/кинематике
Стопки коробок дрожат и проваливаютсяМало итераций, ненулевая упругостьПоднимите итерации, нулевая упругость в покое
Объекты резко трясутся или улетаютПозиция меняется напрямуюДвигайте через API физики, без телепортов
Кадры проседают по мере роста сценыНет усыпления, раздутые коллайдерыУсыпляйте тела, держите коллайдеры впритык

Как вписывается Egmatic

Каждая ошибка из списка — это ошибка настройки, а значит, разница между хорошей и плохой 2D-физикой сводится к скорости итераций: поменяли параметр — увидели результат — приняли решение. Egmatic построен вокруг живого предпросмотра: сцена продолжает работать, пока вы настраиваете свойства и логику, поэтому подкрутка гравитации, итераций решателя или типа тела — это то, за чем вы наблюдаете в реальном времени, а не то, что нужно пересобирать для проверки. Физика работает поверх кроссплатформенного движка, а физические события — столкновения, контакты, триггеры — представлены узлами, которые можно связать с геймплеем, не выходя из визуального редактора. Подробный разбор того, как устроен 2D-движок физики внутри, читайте в статье Движок 2D-физики: всё, что нужно знать; о настройке параметров на лету — в материале Редактор физики в реальном времени: меняйте параметры на лету.

Итог

Движок 2D-физики — это симулятор, и симулятор ведёт себя хорошо лишь тогда, когда вы соблюдаете условия его работы: кормите теми единицами, под которые он настроен, шагаете с фиксированной частотой, даёте каждому телу верный тип, включаете непрерывное обнаружение для быстрых объектов, держите игрока вне симуляции, даёте решателю достаточно итераций, не боретесь с ним прямым изменением позиции и позволяете покоящимся телам засыпать. Если настройка верна, большинство «багов физики» просто не возникает, а те немногие, что остаются, превращаются в узкие локальные задачи, которые легко диагностировать и которые решаются за минуты, — об этом статья Как починить баги физики в игре: метод диагностики.

Похожие статьи

godot слишком сложенgodotgdscript

Godot слишком сложен? Что на самом деле стоит знать новичку в 2026 году

Godot не слишком сложен для новичка — он просто другой. В статье разбирается, что именно делает Godot сложным на первый взгляд (модель из узлов и сцен, язык GDScript и ловушка устаревших руководств для третьей версии), даётся реалистичный срок обучения в 2–6 месяцев и честное сравнение Godot с Unity и Unreal как первого движка.

8 июля 2026 г.11 мин
быстро проверить игровую идеюпрототипированиегеймдизайн

Как быстро проверить игровую идею: рабочая методика прототипирования

Самый быстрый способ проверить игровую идею — выделить ту единственную механику, которая обязана быть увлекательной, собрать её в самом дешёвом виде и дать поиграть настоящим людям за несколько дней, а не месяцев. В статье: бумажное прототипирование, серый прототип основного цикла, дисциплина плейтеста и критерии отбраковки — чтобы понять, работает ли идея, до того как вложить в неё месяцы работы.

8 июля 2026 г.10 мин
починить баги физикиотладка физикитуннелирование

Как починить баги физики в игре: метод диагностики

Починка бага физики начинается с метода, а не с догадки: включите отладочную отрисовку, воспроизведите баг изолированно, а затем прочтите симптом. Проскоки означают, что шаг симуляции шире коллайдера; дрожание — что решатель не может успокоить накладывающиеся тела; прилипание — что мешает трение или застрявший контакт; «прыгучее» управление — что персонаж является физическим телом. Статья сопоставляет каждый симптом с причиной и точным решением и даёт диагностический чеклист, который можно прогнать за минуты.

15 июля 2026 г.9 мин