Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

Как создать игру с нуля на Godot Engine

Отредактировано

Unity и Unreal Engine захватили большую часть рынка геймдева, но другие движки могут быть не хуже. В этом видео расскажем, как создать игру на Godot Engine.

21К открытий22К показов
Превью видео RJqpQEmfymc
Превью видео RJqpQEmfymc

Введение в разработку

00:00 Краткий анонс того, что будет происходить в видео. Нарезка моментов.

00:20 Введение и выбор темы для проекта. Для выбора темы используется генератор случайных фраз, который выдал тему про шампунь. Сеттинг определяется следующим образом: главный герой находится в некоем альтернативном мире (предположительно, это его сон), в котором ему предстоит отстреливаться от монстров с грязными волосами шампунем (ох уж этот генератор случайностей).

02:40 Моделирование объектов окружения, оружия и врагов. Для моделирования используется программа Blender 3D версии 2.8, используются простые модели без текстур, оформленные материалами с плотной заливкой.

Создание игрового уровня

6:20 Перемещаемся в игровой движок Godot Engine, создаём новый проект. Для проекта определяем рендер OpenGL ES 2.0 для большей совместимости. Также такой проект удобно портировать для WEB.

6:46 Поскольку игра подразумевает переход между уровнями, рассмотрим шаблон проектирования, при котором данную возможность довольно просто реализовать. Данный подход не требует навыков проектирования и моделирования ситуаций. Попутно создаём структуру папок и необходимый набор базовых сцен. Определяем синглтон (глобальный объект), подключаем его к проекту, а также конфигурируем его.

8:30 Программируем загрузку уровня.

9:00 Переносим объекты, смоделированные в Blender, в игровой проект. Для экспорта используется формат glTF 2.0, который поддерживается как движком, так и пакетом моделирования.

9:25 На основе моделей создаём игровые объекты, настраиваем материалы, пока без поведения. Также масштабируем все объекты так, чтобы они имели нормальный размер относительно игрока и друг друга, пропорции сохраняем. Расставляем объекты, получая приблизительный вид будущего уровня для игры.

11:24 Добавляем объект Environment, отвечающий за окружение. Настраиваем боковое освещение и убираем скайбоксы. Настраиваем Glow эффект для игрового мира. Создаём объекты, отвечающие за освещение, настраиваем тени.

Создание персонажа

13:50 Теперь необходимо создать объект игрока, отвечающий за взаимодействие с игровым миром. Этим объектом будет управлять человек за компьютером или телефоном (планшетом). Объект состоит из капсюля и камеры — идеальное сочетание объектов для игр от первого лица. Для камеры используем стандартную «интерполированную камеру», которая будет вращаться плавно, создавая приятный эффект.

16:35 Модифицируем комнату, в которой происходит действие.

17:30 Программируем поведение игрока. Управление осуществляется мышью и клавиатурой. Соответственно, необходимо обработать поступающие команды. Godot позволяет сделать это очень просто.

21:00 Настраиваем перемещение по миру при помощи клавиш, задействуя стандартный механизм действий движка. Клавиши настраиваются через настройки проекта. В коде проверяем только срабатывание действий.

25:37 Обрабатываем клавишу паузы и условия выходы из игры. Также обрабатываем мышь и скрываем её в игровом процессе, отображаем только в меню паузы или при выходе в меню.

26:40 Включаем тени от источников света и настраиваем их отображение.

Создание вражеских персонажей

27:43 Переходим ко вражескому объекту. Говорим о локальных осях, настраиваем материалы объекта. Добавляем поведение объекту: враги будут двигаться к игроку, пока не приблизятся на удобное расстояние, постоянно выстреливая изо рта светящимися шарами, убивающими игрока. При приближении игрока они должны отъезжать от него, чтобы сохранять нужное расстояние.

31:50 Программируем объект, генерирующий вражеские объекты. Этот объект будет порождать их на уровне, пока не будет уничтожен сам. Таким образом, чтобы пройти уровень, в первую очередь требуется уничтожить объекты, генерирующие врагов. Полное их уничтожение гарантирует переход на следующий уровень. Враги генерируются по таймеру.

Программирование боя

35:37 Добавляем игроку оружие. Это бутылка шампуня. Позиционируем его правильно в камере. Так же добавляем прицел, чтобы игрок мог целиться.

37:39 Теперь надо разработать то, чем бутылка шампунем будет стрелять. Это будет поток из капель, который при движении очень походит на струю. Для организованного движения шариков необходимо задать их поведение. Это делается для каждого шарика. Поток будет имитировать гравитацию и инерцию. Выстрелы происходят по левой кнопке мыши, так что механизм обработки делаем такой же, как и раньше. При прикосновении пуль к чему-либо, целесообразно их уничтожать. Обработаем и это.

46:12 Переходим к обработке пуль и реакции объектов на них. Помимо того, что пули уничтожаются, они должны как-то влиять на то, во что они попадают. Соответственно всё, что нужно, — настроить обработчики у нужных объектов.

47:41 Добавляем возможность стрельбы вражеским объектам. За основу берём настроенный ранее механизм стрельбы для шампуня. Меняем лишь цвет и немного поведения. После этого немного меняем направление стрельбы, чтобы вражеские пули всегда летели в камеру, усиливая эффект устрашения.

50:54 Конфигурируем глобальный объект и некоторые параметры реакции игрока и врагов. Такая калибровка происходит на протяжении первых этапов разработки практически всегда.

52:12 Теперь на 2D слое делаем визуализацию попадания пули в игрока. Делаем это при помощи заполнения экрана красным и плавным исчезанием заливки. Данный эффект помогает идентифицировать попадание, даже когда оно происходит со спины.

Программирование технической части

54:05 Переходим к настройке достижения цели уровня. Для этого определяем механизм достижения какого-то числового счёта. При создании врагов мы будем запоминать их количество на уровне, при уничтожении проверять, сколько было убито. Как только убиваем последнего, активируется механизм отпирания двери на следующий уровень. Визуально на двери это отобразится путем смены красного цвета лампы на зелёный.

58:18 Добавляем сцену с паузой. Она реализуется созданием отдельной сцены, которая будет рисоваться поверх игры при нажатии клавиши Escape. При этом вся игра будет становиться на паузу и «замирать». Курсор при постановке на паузу отображается. Также паузу стоит отменять по Escape.

1:00:15 Далее разрабатываем механизм перехода между уровнями. И тут мы возвращаемся к понятию паттерна, про который я говорил в самом начале. Механизм довольно простой: у нас есть одна сцена, которая перезагружает уровни в зависимости от текущего индекса. Для демонстрации моделируется ещё один уровень.

1:03:38 Теперь нужно разграничить слои объектов, чтобы определить, что с чем сталкивается, и что на что реагирует. Это нужно в первую очередь для того, чтобы исключить попадание пуль в самого себя, и чтобы пули не сталкивались с объектами дверей, потому что это просто не нужно. Для настройки слоев в Godot Engine есть специальные маски, расставляя галочки в которых можно добиться нужного эффекта.

1:08:34 Создание уровня с Боссом игры. Моделируем объект, экспортируем и настраиваем его материалы и поведение. Тут всё очень похоже на работу с другими объектами, поэтому многие части дублируют и код, и поведение в целом.

Заключение

1:15:26 Бонус — создание механизма, позволяющего оставлять следы от капель шампуня на стенах и полу, и завершение урока.
Итог — создание игры в Godot Engine — процесс намного более увлекательный, чем может показаться на первый взгляд, а кажущиеся сложными вещи выполняются довольно просто и удобно.

Следите за новыми постами
Следите за новыми постами по любимым темам
21К открытий22К показов