Найти в Дзене
Игровой движок Godot engine

№220. 3D. Управление персонажем от первого лица.

Хоть годо и представляет нам некое подобие базового скрипта для этих целей, я всё же предлагаю собрать его с нуля. Вариантов реализации управления само собой есть огромное количество. В этой статье рассмотрим самый простой и базовый пример. В сцену добавляем в качестве пола CSGbox : В качестве «персонажа» добавляем CharacterBody.
Внутри добавляем CollisionShape и выбираем форму CapsuleShape.
Незнаю, случайно или нет, но по умолчанию у «капсулы» высота равна двум метрам. Для того чтобы мы могли визуально видеть где наша капсула, мы можем добавить в сцену соответствующий CSG меш. Камеру для вида «из глаз» мы добавим чуть позже А сейчас накидываем скрипт, и прежде чем писать код, добавим в раскладку наши кнопки управления : У меня это классический AWSD. Первое что надо сделать - завести наши кнопки и подать их в вектор для движения. (статья для 2Д мира)
Для этого берем вектор из get_vector(), но так как это 2Д вектор, то сформируем из него 3Д вектор путем добавления третьей оси. У годо ос

Хоть годо и представляет нам некое подобие базового скрипта для этих целей, я всё же предлагаю собрать его с нуля.

Вариантов реализации управления само собой есть огромное количество. В этой статье рассмотрим самый простой и базовый пример.

Погнали.

В сцену добавляем в качестве пола CSGbox :

-2

В качестве «персонажа» добавляем CharacterBody.
Внутри добавляем CollisionShape и выбираем форму CapsuleShape.
Незнаю, случайно или нет, но по умолчанию у «капсулы» высота равна двум метрам.

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

Камеру для вида «из глаз» мы добавим чуть позже

-3
-4

А сейчас накидываем скрипт, и прежде чем писать код, добавим в раскладку наши кнопки управления :

-5

У меня это классический AWSD.

Первое что надо сделать - завести наши кнопки и подать их в вектор для движения. (статья для 2Д мира)
Для этого берем вектор из get_vector(), но так как это 2Д вектор, то сформируем из него 3Д вектор путем добавления третьей оси.

У годо ось направленная вверх это Y , в векторе укажем его равным нулю. А для X и Z укажем из вектора кнопок.

-6

Проверяем с вида из камеры.

-7

Теперь переместим камеру в район головы, и займемся поворотами.

-8

Так как нам надо получать свойство события (event) мышки, будем работать в функции _unhandled_input().

-9

Добавляем функцию.
В поворот в градусах указываем event.relative().
Это свойство получает разницу между текущей позицией курсора и позицией курсора в предыдущем кадре.

-10

Поворот по горизонтали привязан к самому персонажу.
А вот наклон по вертикали перенесём на камеру.
Чтобы движения были не такие резкие чуть чуть приберем значения

-11

Запускаем :

-12

Мы можем вертеть головой в разные стороны.

По сути, всё что нам осталось сделать чтобы хождение было полноценным - подправить направление движения в зависимости от того куда мы смотрим.

Для этого возьмем «локальные» координаты (cтатья из 2Д мира), и будем перемножать их на вектор направления.

velocity = transform.basis * dir3d

( я накинул текстуру на пол, чтобы было лучше видно движение )

-13

Осталось добавить гравитацию, и соотвественно возможность делать прыжки.

Включаем коллизию у пола :

-14

И в коде персонажа прописываем «давление» по вертикали :

-15

После запуска наш персонаж упадет с платформы , если мы уйдем за её пределы.

Переходим к прыжку. Для этого добавим новую кнопку, в моем случае это пробел.

-16

Так как нам в velocity не нужно перемножать ось Y , мы пересоберем чистовой velocity из переменной finalDir.

Попутно добавим умножение на дельту. Это нужно для выравнивания расчетов, так как FPS (рисование кадров в секунду) может быть разным, на разных системах.
И сразу напишем код для обработки прыжка, который будет просто устанавливать значение по высоте.

-17

Запускаем, и наблюдаем как мы уже можем прыгать.

-18

Для того чтобы не было возможности прыгать в прыжке, можем добавить метод is_on_floor() который проверяет находится ли персонаж на полу или нет.

-19

Ну и напоследок, чтобы ваша игра не теряла связь с окном, когда курсор покидает пределы окна, допишем вот такой код.
(Курсор пропадет, но при этом сколько бы вы не крутились вы всегда будете в окне. )

-20

Для выхода из приложения можно прописать код в котором прописать либо появления курсора через MOUSE_MODE_VISIBLE, либо выход из приложения.
Ну или если вы такой же ленивый как я - нажать классику Alt+F4. =)

На этом всё.
Подписывайтесь на канал, при желании
вступайте в группу в ВК.
Удачи в изучении годо