Найти тему
Votline

Успешное приседание: Реализация механики Crouch в играх на Godot Engine и возможные баги с коллизией

В прошлый раз мы рассмотрели механику бега и выносливости в нашей 3D-игре на движке Godot Engine. В этой статье мы погрузимся в механику приседания, а так же рассмотрим один возможный баг с коллизией.

Сначала нам нужно добавить клавишу для приседания в Input Map:

Наведитесь на Project и кликните на Project Settings. В открывшемся окне перейдите на вкладку Input Map, добавьте новое действие. Назовите его "crouch" и назначьте клавишу для него, например, "Ctrl".
Наведитесь на Project и кликните на Project Settings. В открывшемся окне перейдите на вкладку Input Map, добавьте новое действие. Назовите его "crouch" и назначьте клавишу для него, например, "Ctrl".

Теперь перейдем в наш главный скрипт "Player Controller" и объявим там несколько переменных: isCrouching, crouch_speed, height_normal и height_crouch:

-2

Теперь давайте создадим функцию crouch(), в которой будет содержаться основная логика нашей механики приседания:

$CollisionShape3D.shape.height означает, что мы обращаемся к высоте коллизии объекта CollisionShape3D, который является дочерним для нашего персонажа. Здесь shape - форма коллизии, а height - высота коллизии. Однако высота доступна только для форм коллизии типа CapsuleShape3D и CylinderShape3D.
$CollisionShape3D.shape.height означает, что мы обращаемся к высоте коллизии объекта CollisionShape3D, который является дочерним для нашего персонажа. Здесь shape - форма коллизии, а height - высота коллизии. Однако высота доступна только для форм коллизии типа CapsuleShape3D и CylinderShape3D.

Разберём скрипт:

  1. Мы начнем с проверки, бежит ли игрок и нажата ли клавиша действия "crouch". Если оба условия верны, то мы устанавливаем значение переменной isCrouching на true, иначе false.
  2. Если переменная isCrouching установлена в true, мы изменяем значение высоты капсульной коллизии плавно. Затем мы также плавно изменяем значение скорости на скорость при приседании.
  3. Иначе, мы изменяем значение высоты нашей коллизии, на нормальное.

Вы можете оставить скрипт в этом состоянии, но я добавлю функцию height_change:

-4

Но с каким багом вы можете столкнуться? Это может произойти, если ваш персонаж по transform имеет разные размеры по разным осям. Например, при приседании вы изменяете не высоту коллизии, а размер по оси Y (scale.y), что приведёт к следующему багу:

Игрок не может спуститься с куба
Игрок не может спуститься с куба
Обратите внимание, что сам движок предупреждает нас об этой проблеме.
Обратите внимание, что сам движок предупреждает нас об этой проблеме.

Вот и всё! В следующей статье мы рассмотрим довольно интересную механику - скольжение (slide). Удачи в разработке!