Найти тему

☁️ Игра от первого лица на Godot Engine | Часть I

Моему проекту от первого лица понадобился FPS контроллер. Решил поделится опытом, а также научить вас, если вы новичок в Godot, созданию игрока.
Предисловие, данный код работает для Godot 3.5, на версиях ниже или выше не тестировался

ГЛАВА I - Немного о проекте и задачи

Я планирую сделать что-то похожее на проект майнкрафт, но с настоящими вокселями, которые будут гореть, ломаться, раскалываться и тд. (если хотите, могу рассказать о том, как я пытаюсь подружить воксели с Godot). Для этого мне в первую очередь нужен контроллер от первого лица, возможность бегать, прыгать, идти медленно, крутить головой и тд.

ГЛАВА II - С чего начнем?
Прежде всего мы начнем с подготовки отдельной сцены для персонажа. Мы создаем новую сцену, корневой нодой которой будет
KinematicBody (KinematicBody3d в Godot 4.x он вроде бы называется так), добавляем к нему дочерние элементы, такие как форму столкновения (CollisionShape), любую пространственную ноду (Position3d или Spatial, лично я выбрал первое) и прикрепляем камеру к пространственной ноде. В конечном итоге у нас должно получиться следующее:

Дерево нод
Дерево нод
Сцена
Сцена

Названия в данном примере не имеют значения, но если хотите, можете сделать как у меня.

ГЛАВА III - Приступаем к коду
Создаем скрипт и привязываем к нашему
KinematicBody. Начнем мы с определения нужных переменных:

-4

Записываем ссылку на пространственную ноду с камерой в переменную head (названия не важны, но если проще, то делайте как у меня). Onready даст нам возможность записывать в переменные ссылки.

Переменная speed будет содержать в себе базовую скорость, или конечную скорость. На нее будут влиять разные факторы, поэтому начальное значение для нее 0.0

Переменные walking_speed, run_speed и crouching_speed будут содержать в себе максимальные скорости, скорость обычного движения, скорость бега и скорость медленной ходьбы соответственно. Выставьте такие же параметры как и у меня, если вам нужно другие значения, то поменяете. Чтобы постоянно не лазить в код, вы можете поменять const на export var и в таком случае переменные будут доступны в окне редактора

Переменная accel будет влиять на то, с какой плавностью скорость возрастает с нуля до максимального значения. Задаем 25, это оптимальное значение. Чем меньше число, тем больше "скольжения" у персонажа.

JUMP_VELOCITY содержит силу, с которой персонаж будет прыгать
mouse_sensity - это чувствительность мыши. Лучше всего держать ставить маленькое значение.

gravity перед из настроек проекта гравитацию. Их можно поменять в настройках по пути: "physics/3d/default_gravity"

И последняя velosity содержит в себе вектор, который будет "толкать" персонажа.

ГЛАВА IV - Ловим перемещение мыши

-5

Для того, чтобы скрыть мышь, нужно прописать в функции _ready() (она вызывается один раз перед созданием проекта)

Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

Теперь нам необходимо брать значения перемещения мыши. В функции _input(e): где e это event (сокращенно) прописать проверку, если мышка двигается (строка 23) то, начинаем вращать игрока по горизонтали (начало строки 24), преобразуя в угол инвертированное положение мыши по х координаты монитора, умноженное на чувствительность мыши (строка 24)

Аналогично поступаем и с вертикальным поворотом, но с одним изменением. Вращать мы будем уже голову, а не всего персонажа, и используем инвертированное положение мыши уже по y (строка 25), и для того, чтобы мы не вращали головой на 360 градусов вверх и вниз, делаем ограничение (строка 26). Clamp позволяем нам менять значение переменной в заданных пределах, в данном случае у нас [угол поворота головы, минимальны угол поворота, максимальный угол поворота].

ГЛАВА V - Учимся ходить, бегать и прыгать

-6

В функции _physics_process(delta): мы прописываем движение. Для начала получаем вектор от нажатых клавиш и записываем в переменную input_dir. В переменную direction записываем нормализованный изменения вектора движения (строка 30)

Далее идет проверка, если изменение в direction то мы к начальному вектору, который толкает игрока, записываем интерполированное значение начального вектора, вектора направления умноженного на скорость, и плавность умноженную на delta времени. Так мы делаем для обеих координат направления, x и z
Если же проверка показывает что
direction не меняется, то задаем для начального вектора интерполированное значение текущего начального вектора, нуля и плавность умноженную на delta, для плавного замедления движения игрока.

На строчках 38-43 мы производим проверки нажатия и зажатия клавиш, которые нужно добавить в настройках проекта (см. ниже):

-7

При таком подходе мы получим что Shift замедляет скорость, а Ctrl увеличивает.

На строчках 45-48 мы проверяем, находится ли игрок на полу, функцией is_on_floor()

И в финале мы записываем в начальный вектор через move_and_slide() измененный начальный вектор и вектор позиционирования.

-8

ГЛАВА VI - Заключение
На самом деле, может показаться что это сложно, но на самом деле если это понять и изучить, то сложного ничего нету. Если у вас возникли вопросы, пишите их в комментарии

Поддержите меня на Бусти! Ссылка: тут.

Курсы XYZ School:
-
Бесплатные курсы
-
Стилизация Hand-Paint

🗿Конференция разработчиков игр - пишем о разработке игр: о тонкостях, о технологиях, о разрабатываемых инди-играх и не только! Подписаться📩 Чат, обсуждения, флудилка, поиски работы - тут.