Найти в Дзене

Godot engine. Движение и столкновение.

Оглавление

При перемещении KinematicBody вы используете методы move_and_collide() или move_and_slide(). Эти методы перемещают тело вдоль заданного вектора и мгновенно останавливаются, если обнаружено столкновение с другим телом. После столкновения KinematicBody любая реакция на столкновение должна быть закодирована вручную.

Примечание: кинематическое движение тела должно быть сделано только в _physics_process() ,хотя я описывал движение кинематического тела.

move_and_collide

Этот метод принимает один параметр: Vector, указывающий на относительное движение тела. Как правило, это ваш вектор скорости, умноженный на временной шаг кадра (delta). Если движок игры обнаруживает столкновение в любом месте вдоль этого вектора, тело немедленно прекратит движение.

move_and_slide

Метод move_and_slide() предназначен для упрощения реакции столкновения в общем случае, когда вы хотите, чтобы одно тело скользило вдоль другого. Это особенно полезно в платформерах или с видом сверху.

Примечание: move_and_slide() автоматически вычисляет движение на основе кадра с помощью delta. Не умножайте свой вектор скорости delta, прежде чем передать его move_and_slide().

В дополнение к вектору скорости, move_and_slide принимает ряд других параметров, позволяющих настроить поведение скольжения:

floor_normal - значение по умолчанию: Vector( 0, 0, 0 )

Этот параметр позволяет определить, какие поверхности двигатель должен рассматривать в качестве пола. Установка этого параметра позволяет использовать методы is_on_floor() ,is_on_wall() и is_on_ceiling() для определения типа поверхности, с которой тело находится в контакте. Значение по умолчанию означает, что все поверхности считаются стенами.

slope_stop_min_velocity - значение по умолчанию: 5

Это минимальная скорость при стоянии на склоне. Это предотвращает сползание тела вниз с наклона ,когда оно неподвижно.

max_bounces - значение по умолчанию: 4

Это максимальное количество столкновений до того, как тело перестанет двигаться. Установка этого слишком низкого значения может полностью предотвратить движение.

floor_max_angle - значение по умолчанию: 0.785398(в радианах, эквивалентных 45 градусам)

Это максимальный угол, при котором поверхность больше не считается “полом”.

Что же использовать?

Распространенный вопрос от пользователей Godot: "Какую функцию движения лучше использовать?” Часто ответ заключается в использовании move_and_slide(), потому что это “проще”, но это не всегда так бывает. Один из способов думать об этом move_and_slide() - это особый случай, и move_and_collide() - это уже более общее. Например, два следующих фрагмента кода приводят к одинаковому ответу на столкновение:

Пример скольжения
Пример скольжения

1. ____________________________________________

var collision = move_and_collide(velocity * delta)
if collision:
velocity = velocity.slide(collision.normal)

2._____________________________________________

velocity = move_and_slide(velocity)

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

Например вы используете move_and_collide() он работает, как и ожидалось, перемещение тела происходит вдоль вектора скорости. Теперь давайте посмотрим, что происходит, когда вы добавляете определенные препятствия. Добавьте StaticBody с прямоугольной формой столкновения. Для видимости, вы можете использовать любой Mesh.Попробуйте двигаться в препятствие. Вы увидите, что KinematicBody не может проникнуть через препятствие. Тем не менее, попробуйте двигаться в препятствие под углом и вы обнаружите, что препятствие действует как клей - кажется, что тело застревает.Это происходит потому, что нет никакой реакции столкновения . move_and_collide() просто останавливается движение тела при столкновении.

Попробуйте изменить функцию на move_and_slide() и запустить ее снова. Обратите внимание, что мы не используем delta из расчета скорости.Метод move_and_slide() обеспечивает реакцию столкновения по умолчанию и дает сползать телу вдоль столкновения с объектом. Это полезно для очень многих типов игр, и поможет вам получить то поведение вашего объекта,которое вам необходимо.

print('Спасибо за внимание')