Сцена игрока и действия ввода

В двух следующих уроках мы будем создавать сцену игрока, оформлять пользовательские действия ввода и программировать движения игрока. К концу у вас будет персонаж, за которого можно будет играть и двигаться в восьми направлениях.

Создайте новую сцену, перейдя в меню Scene в левом верхнем углу и нажав New Scene.

../../_images/new_scene.webp

Нажмите кнопку Other Node и выберите тип узла CharacterBody3D для создания CharacterBody3D как корневого узла.

../../_images/add_character_body3D.webp

Переименуйте CharacterBody3D в Player. Тела персонажей дополняют тела области и твёрдые тела, используемые в руководстве по 2D-игре. Как и твёрдые тела, они могут двигаться и сталкиваться с окружающей средой, но вместо того, чтобы управляться физическим движком, вы управляете их движением. Вы увидите, как мы используем уникальные возможности узла, когда будем кодировать механику прыжка и сжатия.

См. также

Этот документ предполагает, что вы знакомы с различными физическими телами Godot. В противном случае сначала прочитайте Введение в физику.

Для начала мы собираемся создать базовый каркас для 3D-модели нашего персонажа. Позже это позволит нам вращать модель через код, пока он проигрывает анимацию.

Добавьте узел Node3D в качестве дочернего узла для Player. Выберите узел Player в дереве Scene и нажмите кнопку «+», чтобы добавить дочерний узел. Переименуйте его в Pivot.

../../_images/adding_node3D.webp

Затем в панели Файловая система разверните папку art/, дважды щелкнув по ней, и перетащите player.glb на Pivot.

../../_images/instantiating_the_model.webp

Это должно инстанцировать модель в качестве дочерней модели Pivot. Вам нужно переименовать его в Character.

../../_images/scene_structure.webp

Примечание

Файлы .glb содержат данные 3D-сцены на основе открытой спецификации glTF 2.0. Они являются современной и мощной альтернативой проприетарному формату, как FBX, который Godot также поддерживает. Для создания этих файлов спроектируйте модель в Blender 3D и экспортируйте ее в glTF.

Как и для всех физических узлов, нам нужна форма столкновения, чтобы наш персонаж сталкивался с окружающей средой. Снова выберите узел Player и добавьте дочерний узел CollisionShape3D. В Inspector, в свойстве Shape, добавьте новый узел SphereShape3D.

../../_images/add_capsuleshape3d.webp

Каркас сферы отображается под персонажем.

../../_images/sphere_shape.png

Это будет форма, которую использует физический движок, для расчета столкновений с окружением, поэтому мы хотим, чтобы она лучше походила именно для 3D-модели. Увеличьте её, перетащив оранжевую кнопку в окне просмотра. Моя сфера имеет радиус около 0.8 метра.

После этого передвиньте форму столкновений вверх так, чтобы её низ приблизительно совпадал с плоскостью сетки.

../../_images/moving_the_sphere_up.png

Чтобы упростить перемещение фигуры, можно включить или отключить видимость модели, нажав на значок глаза рядом с узлами Character или Pivot.

../../_images/toggling_visibility.webp

Сохраните сцену как player.tscn.

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

Создание действий ввода

Чтобы персонаж начал двигаться, мы обратим внимание на пользовательский ввод, например, на нажатие стрелок на клавиатуре. В Godot, хоть мы и можем писать все привязки к клавишам в коде, но зачем если существует мощная система, которая позволяет вам маркировать набор клавиш и кнопок. Это облегчает наши скрипты и делает их более читаемыми.

Эта система называется Input Map (Карта входных данных). Чтобы открыть её редактор, перейдите в меню Project и выберите Project Settings....

../../_images/project_settings.webp

В верхней части есть несколько вкладок. Нажмите Input Map. Это окно позволяет добавлять новые действия вверху — ваши метки. В нижней части можно привязать клавиши к этим действиям.

../../_images/input_map_tab.webp

Проекты Godot содержат несколько предустановленных действий, разработанных для дизайна пользовательского интерфейса (см. скриншот выше). Они станут видимыми, если включить переключатель Show Built-in Actions. Мы могли бы использовать их здесь, но вместо этого определяем свои собственные для поддержки геймпадов. Оставьте Show Built-in Actions отключенным.

Мы назовем наши действия move_left, move_right, move_forward, move_back, и jump.

Чтобы добавить действие, напишите его название в строке вверху и нажмите Enter или кнопку Add.

../../_images/adding_action.webp

Создайте следующие 5 действий:

../../_images/actions_list_empty.webp

Чтобы назначить клавишу или кнопку действию, нажмите кнопку "+" справа от неё. Сделайте то же самое для move_left. Нажмите клавишу со стрелкой влево и нажмите OK.

../../_images/left_inputmap.webp

Привяжите также клавишу A , на действие move_left.

../../_images/keyboard_keys.webp

Теперь добавим поддержку левого джойстика геймпада. Нажмите кнопку "+" ещё раз, но на этот раз выберите вход самостоятельно в дереве входов. Выберите отрицательную ось X левого джойстика в разделе Joypad Axes.

../../_images/joystick_axis_input.webp

Остальные значения оставьте как есть и нажмите OK.

Примечание

Если вы хотите, чтобы контроллеры имели разные действия ввода, вам следует использовать параметр Устройства в разделе Дополнительные параметры. Устройство 0 соответствует первому подключенному геймпаду, Устройство 1 соответствует второму подключенному геймпаду и так далее.

Сделайте то же самое и для других действий ввода. К примеру, привяжите клавишу вправо, D, и правую ось левого джойстика к move_right. После того как вы привяжите все клавиши, ваш интерфейс должен выглядеть следующим образом.

../../_images/move_inputs_mapped.webp

Последнее действие, которое нужно настроить — jump. Назначьте клавишу «Пробел» и кнопку A геймпада, расположенную в разделе Joypad Buttons.

../../_images/joy_button_option.webp

Действие ввода прыжка должно выглядеть следующим образом.

../../_images/jump_input_action.webp

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

В следующей части мы будем программировать и тестировать движения персонажа.