Гид по технологиям

Обнаружение коллизий в Godot 4 — практическое руководство

6 min read Разработка игр Обновлено 11 Apr 2026
Коллизии в Godot 4 — практическое руководство
Коллизии в Godot 4 — практическое руководство

Игровой мир с платформами и персонажем

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

Настройка проекта в Godot 4

Перед началом создайте простой 2D‑платформер: сцена с игроком и платформами. В качестве корневого узла для персонажа используйте CharacterBody2D и добавьте дочерний Sprite2D для визуального представления.

Код, показанный ниже, доступен в репозитории на GitHub и распространяется под MIT‑лицензией — вы можете адаптировать его в своём проекте.

Создайте новый сцену и добавьте CharacterBody2D как root. Затем добавьте Sprite2D внутри него.

Добавим простое движение на GDScript:

extends CharacterBody2D  
  
var speed = 300  
  
func _physics_process(delta):  
    var input_dir = Vector2.ZERO  
  
    if Input.is_action_pressed("ui_left"):  
        input_dir.x -= 1  
  
    if Input.is_action_pressed("ui_right"):  
        input_dir.x += 1  
  
    if Input.is_action_pressed("ui_up"):  
        input_dir.y -= 1  
  
    if Input.is_action_pressed("ui_down"):  
        input_dir.y += 1  
  
    velocity = input_dir.normalized() * speed  
    move_and_collide(velocity * delta)

Важно: значение speed в примере — это скорость в единицах движка (обычно пиксели в секунду), подберите под разрешение и масштаб сцены.

Добавьте платформы как StaticBody2D узлы, укажите для них CollisionShape2D с подходящей формой.

Простой 2D уровень Godot с игроком и платформами

Формы коллизий и когда их применять

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

Важно: форма определяет область, внутри которой движок будет вычислять столкновения.

Круглая форма

Круг (CircleShape2D) удобен для персонажей и объектов с радиальной симметрией: шары, бомбы, враги‑катящиеся объекты. Круг прост в расчётах и экономит ресурсы.

Пример добавления круга в скрипт персонажа:

# Inside the player character's script  
var collision_shape = CollisionShape2D.new()  
var circle_shape = CircleShape2D.new()  
circle_shape.radius = 32  
collision_shape.shape = circle_shape  
add_child(collision_shape)

Плюсы: быстро, мало вычислений. Минусы: плохо подходит для персонажей с «коробчатой» формой.

Прямоугольная форма

RectangleShape2D хорошо подходит для платформ, коробок и персонажей с вертикальной ориентацией.

# Inside the player character's script  
var collision_shape = CollisionShape2D.new()  
var rect_shape = RectangleShape2D.new()  
rect_shape.extents = Vector2(32, 64)  
collision_shape.shape = rect_shape  
add_child(collision_shape)

Плюсы: предсказуемость, легко комбинировать. Минусы: углы могут вести себя неестественно при скольжении.

Вытянутый выпуклый полигон

ConvexPolygonShape2D даёт гибкость для нестандартных силуэтов и близкого соответствия спрайту, но дороже в вычислениях.

# Inside the player character's script  
var collision_shape = CollisionShape2D.new()  
var polygon_shape = ConvexPolygonShape2D.new()  
polygon_shape.set_points([Vector2(-32, -64), Vector2(32, -64), Vector2(0, 64)])  
collision_shape.shape = polygon_shape  
add_child(collision_shape)

Плюсы: точность. Минусы: сложнее в конфигурировании и дороже по CPU.

Комбинация форм

Часто лучше объединять простые формы (несколько CollisionShape2D) для приближения сложного контура — это компромисс между точностью и производительностью.

Обнаружение столкновений (детекция)

Deteкция выполняется встроенным физическим шагом. В kinematic сценариях для CharacterBody2D удобно использовать move_and_collide или move_and_slide (в зависимости от желаемого поведения).

Пример базовой детекции столкновения:

# Detecting Collisions in _physics_process  
func _physics_process(delta):  
    var input_dir = Vector2.ZERO  
    # ... (input handling)  
  
    velocity = input_dir.normalized() * speed  
    var collision = move_and_collide(velocity * delta)  
  
    if collision:  
        print("collided")

Результат выполнения можно визуализировать во время отладки. Полезно выводить нормаль столкновения и позицию точки контакта для корректировки отклика.

Два объекта при столкновении в Godot: визуализация точки контакта

Сигналы столкновений и маски

Godot поддерживает сигналы физики и маски столкновений — это мощный инструмент для управления взаимодействиями и оптимизации.

Сигналы столкновений

Сигналы вроде body_entered/area_entered позволяют реагировать на события без постоянной проверки вручную. Пример: подбор предмета и проигрывание звука.

# Inside the player character's script  
func _ready():  
    connect("body_entered", self, "_on_body_entered")  
  
func _on_body_entered(body: Node):  
    if body.is_in_group("collectible"):  
        # Play a sound effect  
        play_collectible_sound()  
  
        # Perform additional logic like collecting the item  
  
        # Remove the collectible from the scene  
        body.queue_free()

Важно: подключайте сигналы в _ready или через сцену в инспекторе. Используйте группы (is_in_group) для гибкой фильтрации логики.

Маски и слои столкновений

Маски (collision layers and masks) — битовые флаги, задающие, с кем объект может столкнуться. Это снижает количество вычислений и упрощает логику взаимодействий.

Пример сценария: враги должны сталкиваться с платформами, но игнорировать друг друга; пули должны поражать врагов, но проходить сквозь платформы.

# Inside the enemy's script  
func _ready():  
    # Disable collision with other enemies  
    set_collision_mask_value(2, false)  
      
    # Enable collision with platforms  
    set_collision_mask_value(3, true)  
  
# Inside the bullet's script  
func _ready():  
    # Enable collision with enemies  
    set_collision_mask_value(2, true)  
  
    # Disable collision with platforms  
    set_collision_mask_value(3, false)

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

Лучшие практики для точных и быстрых коллизий

  • Используйте простые формы (круг, прямоугольник) где возможно.
  • Разделяйте слои и маски для уменьшения числа проверок.
  • Группируйте объекты по поведению и назначайте группы (is_in_group).
  • Применяйте bounding box (AABB) для быстрой грубой проверки перед точной детекцией.
  • Используйте kinematic queries (raycasts, shape casts) для предсказания столкновений.
  • Минимизируйте количество активных физик‑тел; чаще используйте StaticBody2D/Area2D для объектов без движения.

Важно: профилируйте физику в Godot Profiler и ориентируйтесь на узкие места.

Когда система коллизий может подвести (контрпримеры)

  • Pixel‑perfect анимации со сменой формы спрайта: простая Collider‑форма может не соответствовать текущему кадру, что приведёт к визуальным артефактам.
  • Очень тонкие объекты (ударные пластины, ниточки): физика может «проскакивать» при высокой скорости, если шаг физики недостаточен.
  • Сложные многоугольные объекты в большом количестве: производительность падает.

Рекомендация: для pixel‑perfect требований комбинируйте простые формы и ручные проверки перекрытия по маске или использованию Image.get_pixel при низком разрешении.

Альтернативные подходы

  • Raycasts и shape casts для предсказания столкновений и «сенсорного» поведения.
  • Area2D для обнаружения нахождения в зоне (триггеры), без физического удержания.
  • Pixel‑perfect collision (самая точная, но затратная) — используйте только для небольшого количества объектов.
  • Симуляция на сервере (для сетевых игр) с клиентской предсказуемостью: избегайте дублирования физики и используйте авторитетную модель.

Ментальные модели и эвристики

  • Простая форма + несколько дополнительных ресиверов = хорошая точность/производительность.
  • Отделяйте «детекцию» (Area2D, триггеры) от «физического ответа» (move_and_collide, move_and_slide).
  • Оптимизация через слои/маски часто даёт больше выигрыша, чем мелкая переработка форм.

Чек‑листы по ролям

Дизайнер:

  • Определил желаемое поведение при столкновениях (отскок, физический контакт, триггер).
  • Прописал назначение слоёв/масок.

Программист:

  • Выбрал базовые формы коллизий и обосновал выбор.
  • Настроил сигнал body_entered/area_entered где нужно.
  • Добавил ограничения скорости и проверку пропускания (tunneling).

Художник/аниматор:

  • Проверил, что анимации не создают рассинхрон между видимым спрайтом и коллайдером.
  • При необходимости предоставил схематичный контур для точного коллайдера.

QA:

  • Проверил столкновения на разных разрешениях и на разных скоростях.
  • Проверил накладки и «залипания» у стен и углов.

Критерии приёмки

  • Игрок не должен проходить сквозь платформы при обычных скоростях.
  • При попадании в предмет воспроизводится звук и предмет исчезает.
  • Пули поражают врагов и не реагируют на платформы (по сценарию).
  • Нет существенного проседания FPS при одновременном присутствии 100 статических платформ и 20 движущихся врагов (порог зависит от целевой платформы).

Шпаргалка (cheat sheet)

  • move_and_collide(velocity * delta) — мгновенное смещение с возвратом информации о столкновении.
  • move_and_slide() — смещение с учётом скольжения и нормалей для платформеров.
  • CollisionShape2D — обёртка над формой (Circle, Rectangle, ConvexPolygon).
  • Area2D + signals — для триггеров и зон обнаружения.
  • set_collision_mask_value(layer, bool) — включение/выключение конкретного битового слоя.

Тесты и сценарии приёмки

  • Юнит‑тест 1: Игрок прыгает и садится на платформу — коллизия фиксируется, позиция игрока над платформой.
  • Юнит‑тест 2: Пуля летит через платформу (если задано) — нет коллизии.
  • Юнит‑тест 3: Сбор предмета — предмет уходит и счёт увеличивается.
  • Нагрузочный тест: 200 динамических объектов с коллизиями — измерить среднее время шага физики.

Risk matrix и смягчения

  • Высокая нагрузка от сложных форм: заменять сложные формы на набор простых.
  • Сквозные столкновения при высокой скорости: уменьшать шаг физики или применять continuous collision (shape cast).
  • Несоответствие визуала и коллайдера: договориться об упрощённом контуре в артефайлах.

Краткая справка

  • CollisionShape2D — контейнер формы коллизии.
  • Area2D — зона обнаружения, не обязательно физически реагирует.
  • move_and_collide — перемещает и возвращает объект столкновения.

Визуальное правило принятия решения

flowchart TD
  A[Нужна ли физическая реакция?] -->|Да| B{Персонаж движется}
  B -->|Да| C[Использовать CharacterBody2D + move_and_slide]
  B -->|Нет| D[Использовать RigidBody2D или StaticBody2D]
  A -->|Нет| E[Использовать Area2D для триггеров]
  C --> F[Оптимизировать формы и маски]
  D --> F
  E --> F

Примечания

  • В Godot 4 изменилась часть API по сравнению с Godot 3 — проверьте соответствие методов и классов.
  • Документируйте назначение слоёв в репозитории проекта — это облегчит командную работу.

Вывод

Правильный выбор форм, грамотная настройка масок и использование сигналов позволяют сделать поведение персонажей и объектов в Godot 4 предсказуемым и производительным. Начинайте с простых форм, профилируйте узкие места и по мере необходимости усложняйте модель коллизий. Применяйте чек‑листы и тест‑кейсы перед релизом, чтобы избежать распространённых ошибок.

Ключевые ресурсы: официальная документация Godot, примеры репозитория с этим кодом.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Лучшие виджеты для iPhone — обзор и инструкция
iPhone

Лучшие виджеты для iPhone — обзор и инструкция

Темы WordPress: выбор, установка, управление
WordPress

Темы WordPress: выбор, установка, управление

KVM на Arch Linux: установка и первая виртуальная машина
Виртуализация

KVM на Arch Linux: установка и первая виртуальная машина

Эффект Зейгарник для продуктивности
Продуктивность

Эффект Зейгарник для продуктивности

Ремонт ноутбука: диагностика и практические советы
Ремонт техники

Ремонт ноутбука: диагностика и практические советы

Безопасное выключение Raspberry Pi
Raspberry Pi

Безопасное выключение Raspberry Pi