Godot Open Dungeon

Заготовка для минималистичной игры на движке Godot. Открытые исходники в комплекте.

Godot Open Dungeon

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

Так это всё выглядит в процессе:

Запустить билд в браузере или скачать исходники можно на этой страничке (там же есть ссылки на пошаговые материалы по сборке первых двух итераций прототипа с нуля):

Ниже я разберу структуру проекта, как что устроено внутри, не погружаясь детально в сами строки кода:

Общее

До всех сцен загружается скрипт G, который пригодится для общения между главной сценой и прочими сущностями.

Главная сцена Main содержит в себе звуки, персонажа (внутри которого также находятся камера, источник света, коллайдер, скины, коллайдер и рейкаст), интерфейс (окно старта, окно настроек, шкала хитпоинтов) и префаб первого уровня.

Внутри сцены уровня (Level_A1) находится участок пола и расставлены префабы колонн, сундуков, колец и двух типов врагов (красный и зелёный).

При загрузке главная сцена отправляет в G ссылку на себя, после чего прочие объекты могут обращаться к методам скрипта главной сцены, её параметрам или имеющимся у неё ссылкам на объекты.

узлы главной сцены в полусвёрнутом виде<br />
узлы главной сцены в полусвёрнутом виде

У главной сцены есть метод HealthDamage(amount), который повреждает или лечит персонажа на какое-то количество здоровья (в зависимости от того, положительное или отрицательное число указано в качестве amount). При здоровье выше 0 случается перерисовка шкалы и индикатора здоровья (предварительно значение выше максимума сбрасывается к максимуму). При здоровье меньше 0 - "сброс" игры, "выключенное" состояние мира и показ начального экрана.

Кнопка старта игры привязана сигналом к главной сцене. Убирает начальный экран, включает "игровое" состояние мира и восстанавливает некоторые дефолтные настройки (положение персонажа, количество здоровья).

Персонаж

Движением героя управляет главная сцена, отслеживая события нажатия стрелочек и WASD вне цикла. У персонажа есть только анимация бега, стоя на месте он тоже визуально бежит.

Во время выполнения основного цикла главная сцена проверяет - не касается ли рейкаст, расположенный впереди персонажа, определённого препятствия и если нет, то двигает персонажа в том направлении, которое поступает от события вне цикла (пока зажаты кнопки). Также тут проверяется - не нажата ли кнопка выстрела или кнопка окна настроек.

Стреляет персонаж примитивами-призмами, которые настроены на попадания в колонны, сундуки и врагов. При этом выстрел уничтожается, а внутри повреждённого объекта запускается метод ext_AfterTouch(), еслион есть. У колонн нет подобного метода, поэтому они просто уничтожают выстрел.Сундуки и враги отвечают звуком попадания и анимацией.

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

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

Враги

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

Если враг "уничтожен" попаданием (выстрел задел коллайдер врага), то у него некоторое время играется анимация бездействия, и, когда она заканчивается, аниматор посылает сигнал в скрипт врага, чтобы тот снова "ожил".

Также в своих циклах враги следят за положением персонажа (получая ссылку на него через скрипт G, который доступен всем) и если тот оказался в нулевых координатах главной сцены - сами телепортируются в свои стартовые позиции. Это сделано для простейшей имитации сброса игры в дефолтное состояние, а лучший способ - перезагрузить сам уровень.

Godot Open Dungeon

Настройки

По кнопке Esc игра показывает небольшой экран с настройками. Здесь можно включить/выключить источник света и создаваемые им тени.

Опция Autorun включает постоянное перемещение персонажа в одну из 4-х сторон. Если удерживать кнопки, то персонаж всё также может двигаться в 8 направлениях, но без нажатий бежит именно в одну из основных 4-х.

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

Ещё одна опция - Primitive hero - включает изначальный вид игрока (из прошлой версии прототипа), и вместо Годо теперь по уровню бегает пара цилиндров.

Отмечаемые галочкой чекеры в меню настроек сделаны префабами со своим отдельным общим скриптом. В этом скрипте имеется параметр ID, поле которого выводится в редактор и можно присваивать свой номер ID каждому отдельному элементу. При нажатии на элемент скрипт выясняет по этому идентификатору, как должен отреагировать именно этот конкретный чекер.

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

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

4040 показов
1.1K1.1K открытий
5 комментариев

Чем годот лучше юньки и уе?

Ответить

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

Ответить

Не проблема найти, конечно, но удобней.
Выглядит симпатично и любопытно, удачи в твоих начинаниях. https://dtf.ru/gamedev/45294-kompoziciya-v-leveldizayne https://amongus2.io

Ответить