#3 Godot: 3D Platformer от BornCG. Объект персонажа игрока, код движения и прыжка
В предыдущей статье я анонсировал использование физического движка Godot...
Так вот, сегодня мы рассмотрим:
- создание объекта персонажа игрока;
- добавление кода для перемещения и прыжка.
Вот как выглядит наш проект на текущий момент.
Помните, как в предыдущем уроке мы создали падающий блок Block в другой сцене block, что помогло нам инстанцировать (хабр: инстанцировать - создать экземпляр чего-либо) объект на нашу сцену Level1? Точно так же мы создадим нашего игрового персонажа, который суть будет переиспользуемый объект в отдельной сцене.
Создаём новую пустую сцену с помощью кнопки + в панели вкладок вверху рабочего пространства.
Хоть мы уже и работали ранее с дополнительной сценой, не будет лишним напомнить: в новой пустой сцене мы не создаём корневых узлов, доступных по умолчанию, ведь это приведёт к созданию новой отдельной игровой сцены, то есть нового уровня.
Вместо этого в панели Сцена мы нажимаем на кнопку + и добавляем узел CharacterBody3D.
Добавляем дочерний узел MeshInstance3D и с помощью Инспектора наделяем его сущностью в виде кубика.
Кубик, кстати, весьма удобная форма для нашего персонажа - да, он не так идеален, как, скажем, шар, но зато при использовании кубика можно отследить, как персонаж поворачивает - и поворачивает ли вообще.
После добавляем ещё один дочерний узел CollisionShape3D и тоже наделяем его сущностью в виде кубика.
Как мы говорили в предыдущем уроке, использование дефолтных кубов при создании дочерних узлов MeshInstance3D и CollisionShape3D избавляет от необходимости подгонять форму объекта (shape) под его структуру (mesh).
Вот что у нас получилось, и такому очаровательному персонажу-кубику невозможно не придумать новое имя.
Переименуем корневой узел CharacterBody3D в... Steve?
Как бы то ни было, сохраняем сцену с помощью Ctrl+S и идём дальше.
Возвращаемся к сцене Level1 и добавляем Steve: выделяем узел Level1, чтобы Steve был дочерним узлом по отношению к корневому, нажимаем на кнопку Инстанцировать дочернюю сцену (Ctrl+Shift+A) и выбираем файл steve.tscn.
Видим, что Steve сразу же стал частью сцены...
Вытаскиваем Steve из пола и перемещаем его куда-нибудь в сторону, чтобы не придавило падающими блоками.
Прежде чем запустить нашу сцену, обратим внимание на беспорядок, творящийся у нас в панели Сцена.
Нас смущает наличие большого числа одинаковых узлов (производные от Block). Однако мы можем упрятать все узлы падающих блоков в отдельный каталог (folder). Дело в том, что узел Node3D (который у нас является корневым, это наш узел Level1) по существу является просто контейнером для 3D объектов в сцене. И так как узел Node3D не является новым объектом, мы можем использовать его в качестве сворачиваемого каталога для дочерних узлов, чтобы навести красоту в нашем дереве объектов.
Добавляем дочерний узел Node3D...
...переименовываем его в Blocks...
...и перетаскиваем в этот каталог все объекты Block1-Block4.
Теперь мы можем просто свернуть каталог Blocks, и в панели Сцена будет красота. Такой небольшой трюк поможет нам привести наше дерево узлов в порядок.
Наконец запустим сцену (про сохранение я уже не говорю, думайте сами).
Падающие блоки падают, а вот Steve не реагирует на нажатие клавиш и не трогается с места. Значит, настало время добавить в наш проект капельку интерактивности.
Ткнём на нашего Steve в панели Сцена, чтобы выделить его, и обратим внимание на кнопку Прикрепить новый или существующий скрипт к выбранному узлу. В принципе эта кнопка позволяет добавить файл кода на языке GDScript к любому выбранному объекту сцены.
Однако не совсем правильно будет добавлять код к Steve прямо сейчас, в сцене Level1 - ведь мы же создали экземпляр нашего Steve, который в целом находится во вкладке steve. Хорошим тоном будет добавить файл кода именно к оригинальному Steve, а не к инстанцированному.
Нажимаем на хитрую кнопку возле узла Steve в панели Сцена...
...переходим во вкладку steve и вот теперь нажимаем на кнопку добавления файла кода.
Оставляем все настройки по умолчанию, чтобы наследовать готовые скрипты для узла CharacterBody3D, и нажимаем Создать.
Движок создал файл кода и привязал его к корневому узлу Steve (который является узлом CharacterBody3D, как мы помним). Перейти на вкладку с кодом мы можем с помощью соответствующей кнопки возле узла Steve в панели Сцена.
Ещё перейти на вкладку с кодом можно вручную с помощью второй соответствующей кнопки, но уже в верхней части рабочего пространства.
Посмотрим, что изменилось после добавления кода. Сохраняем изменения (чёрт, я же обещал не предупреждать о сохранениях -_-), переходим на вкладку level_1 и запускаем сцену Level1.
Замечаем позитивные изменения:
- Steve после запуска сцены упал на пол, то есть стал подчиняться физике;
- Steve управляется клавишами со стрелками;
- Steve упирается в падающие блоки, то есть взаимодействует с другими объектами;
- Steve подпрыгивает при нажатии на пробел;
- Steve может упрыгать вниз.
Сегодняшняя статья получилась небольшой, но оно и к лучшему. У меня в запасе есть несколько часов до рассвета, и я планирую поспать (да и вам пора).