Формы столкновений (2D)

В этом руководстве объясняется:

  • Типы форм столкновений, доступные в 2D в Godot.

  • Использование изображения, преобразованного в многоугольник, в качестве формы столкновения.

  • Вопросы производительности применительно к 2D-столкновениям.

Godot предоставляет множество видов форм столкновений, с различными компромиссами по производительности и точности.

Вы можете определить форму объекта PhysicsBody2D, добавив один или несколько узлов CollisionShape2Ds или CollisionPolygon2Ds в качестве прямых дочерних узлов. Косвенные дочерние узлы (т.е. дочерние узлы дочерних узлов) будут игнорироваться и не будут использоваться в качестве форм столкновений. Также обратите внимание, что необходимо добавить ресурс Shape2D к узлам форм столкновений в панели инспектора.

Примечание

При добавлении нескольких фигур столкновений в один PhysicsBody2D вам не нужно беспокоиться об их наложении. Они не будут "сталкиваться" друг с другом.

Примитивные формы столкновений

Godot предоставляет следующие примитивные типы форм столкновений:

Столкновение большинства небольших объектов можно представить с помощью одной или нескольких примитивных фигур. Однако для более сложных объектов, таких как большой корабль или целый уровень, вам могут понадобиться выпуклые или вогнутые формы. Подробнее об этом ниже.

Мы рекомендуем использовать примитивные формы для динамических объектов, таких как RigidBodies и CharacterBodies, поскольку их поведение наиболее надёжно. Кроме того, они часто обеспечивают более высокую производительность.

Выпуклые формы столкновений

Предупреждение

В настоящее время Godot не предлагает встроенного инструмента для создания двумерных выпуклых фигур столкновений. Этот раздел представлен здесь в основном в справочных целях.

Convex collision shapes представляют собой компромисс между примитивными формами коллизий и вогнутыми формами коллизий. Они могут представлять фигуры любой сложности, но с важным ограничением. Как следует из названия, отдельная форма может представлять только выпуклую форму. Например, пирамида — выпуклая, а полый параллелепипед — вогнутая. Чтобы определить вогнутый объект с помощью одной формы коллизий, необходимо использовать вогнутую форму коллизий.

В зависимости от сложности объекта, можно добиться лучшей производительности, используя несколько выпуклых фигур вместо вогнутой формы столкновения. Godot позволяет использовать выпуклое разложение для генерации выпуклых фигур, приблизительно соответствующих полому объекту. Обратите внимание, что это преимущество в производительности теряет силу после определённого количества выпуклых фигур. Для больших и сложных объектов, таких как целый уровень, мы рекомендуем использовать вогнутые фигуры.

Вогнутые или тримешевые формы столкновений

Concave collision shapes, также называемые формами столкновений с тримеш-сеткой, могут принимать любую форму, от нескольких треугольников до тысяч. Вогнутые формы — самый медленный вариант, но и самый точный в Godot. В StaticBodies можно использовать только вогнутые формы. Они не будут работать с CharacterBodies или RigidBodies, если режим RigidBody не установлен на Static.

Примечание

Несмотря на то, что вогнутые формы обеспечивают наиболее точное столкновение, сообщение о контакте может быть менее точным, чем у примитивных форм.

Если для проектирования уровней не используются TileMaps, то вогнутые формы являются наилучшим подходом для столкновений на уровне.

Вы можете настроить режим построения узла CollisionPolygon2D в инспекторе. Если выбрано значение Solids (по умолчанию), столкновения будут охватывать полигон и его ограниченную область. Если выбрано значение Segments, столкновения будут охватывать только рёбра полигона.

Вы можете создать вогнутую форму столкновения в редакторе, выбрав Sprite2D и воспользовавшись меню Sprite2D в верхней части 2D-окна просмотра. В раскрывающемся меню Sprite2D есть пункт Create CollisionPolygon2D Sibling. При нажатии на него открывается меню с тремя настройками:

  • Simplification (Упрощение): Более высокие значения приведут к менее детальной форме, что повысит производительность за счет точности.

  • Shrink (Сжатие) (пикселы): Более высокие значения сжимают созданный полигон столкновения относительно краев спрайта.

  • Grow (Pixels): Более высокие значения увеличат размер сгенерированного полигона столкновения относительно краёв спрайта. Обратите внимание, что установка одинаковых значений Grow и Shrink может привести к результатам, отличным от тех, которые указаны для обоих параметров, равными 0.

Примечание

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

Чтобы использовать отдельное изображение для генерации полигона столкновения, создайте ещё один Sprite2D, сгенерируйте на его основе полигон столкновения, а затем удалите узел Sprite2D. Таким образом, вы сможете исключить мелкие детали из генерируемого полигона столкновения.

Предостережения относительно производительности

Вы не ограничены одной формой столкновения для каждого PhysicsBody. Тем не менее, мы рекомендуем использовать как можно меньше форм для повышения производительности, особенно для динамических объектов, таких как RigidBodies и CharacterBodies. Кроме того, избегайте перемещения, вращения и масштабирования CollisionShapes, чтобы воспользоваться внутренними оптимизациями физического движка.

При использовании одной непреобразованной формы столкновения в StaticBody алгоритм движка широкой фазы может отбрасывать неактивные PhysicsBodies. В этом случае узкая фаза будет учитывать только формы активных тел. Если StaticBody имеет несколько форм столкновения, широкая фаза не сработает. Узкая фаза, которая медленнее, должна выполнить проверку столкновения для каждой формы.

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