Моему проекту от первого лица понадобился FPS контроллер. Решил поделится опытом, а также научить вас, если вы новичок в Godot, созданию игрока.
Предисловие, данный код работает для Godot 3.5, на версиях ниже или выше не тестировался
ГЛАВА I - Немного о проекте и задачи
Я планирую сделать что-то похожее на проект майнкрафт, но с настоящими вокселями, которые будут гореть, ломаться, раскалываться и тд. (если хотите, могу рассказать о том, как я пытаюсь подружить воксели с Godot). Для этого мне в первую очередь нужен контроллер от первого лица, возможность бегать, прыгать, идти медленно, крутить головой и тд.
ГЛАВА II - С чего начнем?
Прежде всего мы начнем с подготовки отдельной сцены для персонажа. Мы создаем новую сцену, корневой нодой которой будет KinematicBody (KinematicBody3d в Godot 4.x он вроде бы называется так), добавляем к нему дочерние элементы, такие как форму столкновения (CollisionShape), любую пространственную ноду (Position3d или Spatial, лично я выбрал первое) и прикрепляем камеру к пространственной ноде. В конечном итоге у нас должно получиться следующее:
Названия в данном примере не имеют значения, но если хотите, можете сделать как у меня.
ГЛАВА III - Приступаем к коду
Создаем скрипт и привязываем к нашему KinematicBody. Начнем мы с определения нужных переменных:
Записываем ссылку на пространственную ноду с камерой в переменную 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 - Ловим перемещение мыши
Для того, чтобы скрыть мышь, нужно прописать в функции _ready() (она вызывается один раз перед созданием проекта)
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
Теперь нам необходимо брать значения перемещения мыши. В функции _input(e): где e это event (сокращенно) прописать проверку, если мышка двигается (строка 23) то, начинаем вращать игрока по горизонтали (начало строки 24), преобразуя в угол инвертированное положение мыши по х координаты монитора, умноженное на чувствительность мыши (строка 24)
Аналогично поступаем и с вертикальным поворотом, но с одним изменением. Вращать мы будем уже голову, а не всего персонажа, и используем инвертированное положение мыши уже по y (строка 25), и для того, чтобы мы не вращали головой на 360 градусов вверх и вниз, делаем ограничение (строка 26). Clamp позволяем нам менять значение переменной в заданных пределах, в данном случае у нас [угол поворота головы, минимальны угол поворота, максимальный угол поворота].
ГЛАВА V - Учимся ходить, бегать и прыгать
В функции _physics_process(delta): мы прописываем движение. Для начала получаем вектор от нажатых клавиш и записываем в переменную input_dir. В переменную direction записываем нормализованный изменения вектора движения (строка 30)
Далее идет проверка, если изменение в direction то мы к начальному вектору, который толкает игрока, записываем интерполированное значение начального вектора, вектора направления умноженного на скорость, и плавность умноженную на delta времени. Так мы делаем для обеих координат направления, x и z
Если же проверка показывает что direction не меняется, то задаем для начального вектора интерполированное значение текущего начального вектора, нуля и плавность умноженную на delta, для плавного замедления движения игрока.
На строчках 38-43 мы производим проверки нажатия и зажатия клавиш, которые нужно добавить в настройках проекта (см. ниже):
При таком подходе мы получим что Shift замедляет скорость, а Ctrl увеличивает.
На строчках 45-48 мы проверяем, находится ли игрок на полу, функцией is_on_floor()
И в финале мы записываем в начальный вектор через move_and_slide() измененный начальный вектор и вектор позиционирования.
ГЛАВА VI - Заключение
На самом деле, может показаться что это сложно, но на самом деле если это понять и изучить, то сложного ничего нету. Если у вас возникли вопросы, пишите их в комментарии
Поддержите меня на Бусти! Ссылка: тут.
Курсы XYZ School:
- Бесплатные курсы
- Стилизация Hand-Paint
🗿Конференция разработчиков игр - пишем о разработке игр: о тонкостях, о технологиях, о разрабатываемых инди-играх и не только! Подписаться📩 Чат, обсуждения, флудилка, поиски работы - тут.