Найти тему
Votline

Скорость и Выносливость: Реализация механики бега в играх на Godot Engine с использованием дочерних скриптов

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

Для начала добавим клавишу для бега в Input Map, следуя привычным нам действиям:

Я назначу клавишу Left Shift
Я назначу клавишу Left Shift

Теперь переходим к объявлению и инициализации переменных isRunning, isMoving и run_speed. Первые две переменные помогут нам избежать различных багов:

-2

Наконец переходим к объявлению функции run(), где будет вся основная логика нашей механики, и изменению функции move:

-3

  1. Мы присваиваем значение true переменной isMoving, когда персонаж движется, чтобы предотвратить возможность бега на месте.
  2. Затем проверяем, бежит ли игрок, и если нет, устанавливаем скорость на walk_speed.
  3. В функции run() мы проверяем, нажата ли наша клавиша (в моём случае, shift) и движется ли игрок. Если оба условия выполняются, устанавливаем значение isRunning в true
  4. Если одно из условий не выполняются, то устанавливаем значение на false
  5. Если значение isRunning true, то мы плавно изменяем скорость на run_speed.

Но зачем нам 2 условия? Разве нельзя написать всё в одном? Использование двух условий обеспечивает гибкий доступ к механике бега. Например, мы можем запретить игроку бегать даже тогда, когда клавиша бега зажата и игрок движется.

Однако, непрерывный бег - не самая лучшая идея. Именно здесь в игру вступает механика выносливости. Давайте создадим дочерний скрипт, который будет отвечать за управление нашей выносливостью.

Кликните на объект CharacterBody3D (ваш персонаж), затем выберите "Extend Script". В появившемся окне на щелкните значок папки и выберите главный скрипт вашего персонажа, в моем случае PlayerController.gd. После этого создайте новый скрипт.
Кликните на объект CharacterBody3D (ваш персонаж), затем выберите "Extend Script". В появившемся окне на щелкните значок папки и выберите главный скрипт вашего персонажа, в моем случае PlayerController.gd. После этого создайте новый скрипт.

Отлично. В новом скрипте нам необходимо объявить переменную stamina, а также функцию stamina_change с аргументом stamina_new и coef(coefficient):

-5

Для чего нам нужно явно преобразовывать значения во float? Я сталкивался с ошибками, связанными с типами переменных. Чтобы избежать их, мы будем проводить явное преобразование во float. Вот так может выглядеть подобная ошибка:

-6

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

Я назвал эту переменную "PlayerStamina"
Я назвал эту переменную "PlayerStamina"

Вернёмся к нашей функции run() и проведём там следующие изменения:

-8

Вот что мы сделали:

  1. Добавили условие, чтобы минимальное значение стамины было строго больше 5.
  2. Реализовали плавное уменьшение стамины.
  3. Внедрили плавное восстановление стамины.

Однако, при проведении тестов вы можете столкнуться с ошибкой: ваша выносливость будет тратиться ниже 5 и моментально восстанавливаться до значения выше 5, что приведет к бесконечному бегу. Вот какой я нашёл способ решения:

-9
  1. Мы добавили переменную canrun с логическим типом данных в условие.
  2. Если одно из условий ложное (например, стамина меньше 5), то выполняется ветвь else.
  3. В этой ветви мы проверяем значение стамины, и если оно меньше или равно 15, то запрещаем нашему игроку бежать, в ином случае разрешаем.

Вот и все! Вы также можете рассмотреть добавление уменьшения стамины при прыжке, но у меня отсутствует данная механика. В следующей статье мы рассмотрим не менее важные вещи - приседание (crouch), а так же возможные баги с коллизией. Удачи в разработке!


С подпиской рекламы не будет

Подключите Дзен Про за 159 ₽ в месяц