Данный учебный материал знакомит с базовыми принципами разработки в игровом движке Godot Engine. Обучение начинается с разбора архитектуры проекта, основанной на взаимодействии узлов, сцен и сигналов, а также включает в себя практические рекомендации по организации файловой системы и настройке рендеринга для сохранения четкости пиксельной графики. Основная часть материала посвящена освоению инструмента TileMapLayer, с помощью которого осуществляется проектирование игровых уровней из наборов тайлов, а завершается занятие самостоятельным творческим заданием по созданию стартовой локации будущей игры.
Вступление. Что же такое Godot?
Godot Engine (читается «Годо́», от фр. Godot) — это открытый кроссплатформенный двухмерный и трехмерный игровой движок, распространяемый под лицензией MIT и разрабатываемый глобальным сообществом Godot Engine Community. Официальный ресурс проекта — godotengine.org, где можно абсолютно бесплатно загрузить актуальную версию программы, изучить подробную техническую документацию и найти дополнительные материалы.
Движок выделяется своей легковесностью и гибкостью. Он предлагает мощный инструментарий для создания как стильных 2D-игр, так и комплексных 3D-проектов. В Godot используется уникальная архитектура, основанная на иерархии сцен и узлов (нод), что делает структуру проекта логичной и легко масштабируемой.
Для написания игровой логики предусмотрен встроенный язык GDScript — он синтаксически очень близок к Python, интуитивно понятен и идеально подходит для быстрого прототипирования. При этом движок полноценно поддерживает работу с C# и C++. Среди дополнительных преимуществ стоит отметить продвинутую систему анимации, встроенный физический движок и удобный редактор пользовательского интерфейса (UI).
Сегодня мы сосредоточимся на базовом знакомстве с Godot. Предстоит разобрать основные элементы интерфейса, узнать, как взаимодействуют между собой сцены и ноды, а также создать первый проект, который станет техническим фундаментом для будущего подземелья. Выполнение этих шагов позволит закрепить понимание базовых принципов работы движка и подготовит базу для дальнейшей разработки полноценной игры.
Историческая справка
Roguelike или rogue-like (читается как /roʊɡlaɪk/, буквально — «Rogue-подобные» игры; в русскоязычном сообществе укрепился термин «роуглайк» или сленговое «рогалик») — это поджанр компьютерных ролевых игр. Как и в случае с Tower Defense, целое направление индустрии зародилось благодаря одной-единственной игре.
Rogue - 1980 год
Истоки жанра восходят к проекту 1980 года под названием Rogue. Хотя проекты со схожими концепциями выходили и до её релиза, именно Rogue сформировала канон и стала образцом для бесчисленного множества подражаний.
Её отличительными чертами, которые впоследствии стали «золотым стандартом» жанра, являлись процедурная генерация уровней (каждое подземелье создается случайным образом), пошаговая система ходов и перманентная смерть (permadeath) — если персонаж погибает, прохождение требуется начинать с самого начала.
Шаг №1. Создание проекта
Как и во многих крупных игровых движках, для удобства управления проектами разработано стартовое окно «Менеджер проектов» (рис. 3).
Рисунок 3. Менеджер проектов Godot
В разделе Проекты предоставляется возможность создать новую игру, а также отображается список ранее открытых файлов. Раздел Библиотека ассетов содержит различные готовые проекты, шаблоны и демонстрационные варианты.
Для создания проекта требуется нажать левую кнопку мыши (ЛКМ) по кнопке Новый проект. Откроется окно настройки параметров, показанное на рисунке 4.
Рисунок 4. Окно создания нового проекта
В поле Имя проекта требуется указать название, например, «Подземелье приключений». В поле Путь к проекту с помощью кнопки Обзор необходимо выбрать директорию на ПК для хранения системных файлов.
Далее предстоит выбрать параметр Отрисовщик (Renderer), который определяет целевые платформы и графические технологии:
Forward+ — предназначен для современных ПК и консолей.
Mobile (Мобильные устройства) — ориентирован на мобильные платформы, но также отлично работает на ПК.
Compatibility (Совместимость) — используется для адаптации к старым или маломощным устройствам.
После задания всех параметров требуется нажать ЛКМ по кнопке Создать и редактировать.
Важно
Необходимо запомнить путь сохранения проекта, так как в дальнейшем это потребуется для загрузки новых объектов, текстур и получения доступа к скриптам.
После непродолжительной загрузки запустится основное окно игрового движка — визуальная среда разработки (рис. 5).
Рисунок 5. Визуальная среда разработки Godot
Поскольку целью текущей работы является разработка 2D-игры, в панели Сцена (в левой части экрана) требуется выбрать пункт 2D-сцена (рис. 5). После этого рабочая область переключится в режим двумерного пространства (рис. 6).
Рисунок 6. Рабочая область в режиме 2D
Перед началом практической работы следует подробнее ознакомиться со структурой объектов. В Godot игра представляет собой дерево узлов (нод), сгруппированных в сцены (корневые узлы), которые могут обмениваться информацией между собой посредством встроенных сигналов.
Сцена
Архитектура Godot базируется на принципе разделения проекта на независимые, многократно используемые элементы — сцены.
В контексте данного движка сцена — это не только игровой уровень (как принято считать в некоторых других средах разработки). Сценой может выступать абсолютно любой логический объект игры: главный персонаж, интерактивное оружие, меню пользовательского интерфейса (UI), отдельное здание или глобальная карта. По сути, сцена — это любой фрагмент проекта, который можно сохранить как отдельный файл и использовать повторно.
Рисунок 7. Примеры независимых сцен в Godot
Одной из ключевых и самых мощных особенностей Godot является возможность вкладывать сцены друг в друга (создавать экземпляры). Вы можете создать сложный уровень (базовую сцену), поместить на него сцену персонажа, а внутрь сцены персонажа перетащить сцену оружия в качестве её дочернего элемента.
Такая иерархическая структура позволяет собирать масштабные миры из небольших, независимых и легко настраиваемых блоков, подобно конструктору.
Рисунок 8. Дерево сцен с вложенными дочерними элементами
Узлы
Любая сцена состоит из одного или нескольких базовых элементов — узлов (в сообществе разработчиков их чаще называют нодами, от англ. node). Узел представляет собой наименьший функциональный строительный блок игры. Соединяясь друг с другом, ноды образуют строгую иерархическую структуру — дерево узлов (Scene Tree).
В качестве примера на рисунке 9 показана структура узлов, из которых собран игровой персонаж.
Рисунок 9. Дерево узлов персонажа
В данном примере корневым узлом выступает CharacterBody2D(отвечающий за физику тела) с заданным именем Player. Внутри него, в качестве дочерних элементов, располагаются: узел камеры (Camera2D), визуальное отображение персонажа (Sprite2D) и форма его физического столкновения (CollisionShape2D).
Справка по наименованию
Обратите внимание, что имена узлов в данном примере заканчиваются на постфикс "2D", так как разработка ведется в двумерном пространстве. Имена их функциональных аналогов для трехмерных сцен будут заканчиваться на "3D" (например, CharacterBody3D, Camera3D).
Godot предоставляет обширную встроенную библиотеку базовых типов узлов (рис. 10). Комбинируя и расширяя их свойства, можно создавать комплексные игровые механики любой сложности.
Механизм взаимодействия узлов отчасти может напомнить логику работы с объектами в другом популярном 2D-движке - Construct 3, однако в Godot эта система обладает гораздо большей гибкостью за счет строгой иерархии и наследования.
Рисунок 10. Встроенная библиотека узлов Godot
Дерево сцены
Все созданные сцены разрабатываемого проекта в конечном итоге объединяются в глобальную структуру — дерево сцен. Поскольку каждая отдельная сцена изначально представляет собой иерархию узлов (нод), то и всё дерево сцен функционирует как одно масштабное, единое дерево узлов (рис. 11). Такая архитектура обеспечивает целостность проекта и позволяет управлять логикой всей игры, отслеживая связи между объектами в реальном времени.
Рисунок 11. Глобальное дерево сцен проекта
Сигналы
Узлы обладают способностью транслировать (испускать) сигналы при наступлении определенных внутриигровых событий. Этот механизм позволяет настроить взаимодействие между узлами без жесткой привязки их друг к другу в программном коде. Использование сигналов обеспечивает высокую гибкость и независимость элементов при структурировании сцен (рис. 12).
Рисунок 12. Панель узла со списком доступных и подключенных сигналов
Классический пример применения данной механики — элемент пользовательского интерфейса «Кнопка» (Button), которая передает сигнал pressed (нажата) при взаимодействии с игроком. Разработчик может подключить фрагмент скрипта к этому сигналу для автоматического выполнения требуемых действий в ответ на событие — например, для загрузки нового уровня или открытия меню паузы.
Другие встроенные сигналы движка могут уведомлять систему о физическом столкновении двух объектов, входе персонажа в заданную триггерную зону (Area2D), получении урона или завершении воспроизведения анимации. Помимо использования обширной библиотеки базовых событий, в Godot предусмотрена возможность программирования собственных (кастомных) сигналов, полностью адаптированных под уникальную логику вашей игры.
Ключевые понятия
Узлы, сцены, дерево сцен и сигналы — это четыре фундаментальных понятия архитектуры Godot, с которыми предстоит непрерывно работать в процессе создания игр.
Теперь давайте детально разберем главный экран визуальной среды разработки (рис. 13) и назначение его основных элементов:
Рисунок 13. Основные рабочие области интерфейса Godot
Дерево сцен и узлов (Scene Tree): Панель, где иерархически отображаются все объекты (узлы), добавленные на текущую активную сцену.
Файловая система (FileSystem): Окно управления ресурсами. Здесь отображаются все файлы (картинки, звуки, модели), которые физически хранятся в папке вашего проекта на ПК. Именно отсюда ассеты перетаскиваются в рабочую область.
Рабочая область / Сцена (Viewport): Главное центральное окно, где происходит визуальное редактирование. Здесь осуществляется сборка уровней, настройка интерфейса и расстановка игровых объектов.
Инспектор (Inspector): Окно свойств. При выделении любого узла в Дереве сцен, в Инспекторе появляются все его настраиваемые параметры (координаты, цвет, физические свойства), доступные для редактирования.
Шаг №2. Структурирование файлов проекта
Отдельное внимание стоит уделить панели Файловая система. Корневой каталог в Godot обозначается как res:// (от слова resources). Эта виртуальная директория полностью синхронизирована с реальной папкой проекта, которую вы создали на своем компьютере (рис. 14).
Рисунок 14. Корневая директория проекта в панели Файловая система
Для удобной навигации и предотвращения путаницы в будущем, профессиональная разработка требует строгой организации файлов. В корневом каталоге необходимо создать несколько базовых подпапок:
Assets — для хранения всех графических и звуковых материалов (спрайтов персонажей, тайлов окружения, музыки).
Scripts — для файлов с программным кодом (GDScript), отвечающим за игровую логику.
Scenes — для сохранения всех созданных сцен (уровней, меню, префабов врагов).
Как создать папку: Кликните правой кнопкой мыши (ПКМ) по корневой папке res://, в появившемся контекстном меню выберите пункт Создать (Create), а затем — Папка (Folder). Введите название и нажмите Enter.
После выполнения этой задачи структура вашей файловой системы должна выглядеть следующим образом (рис. 15):
Рисунок 15. Организованная структура папок проекта
Следующим шагом необходимо загрузить в созданную папку Assets графические материалы, которые понадобятся для дальнейшей работы. Вы можете найти их в архиве дополнительных материалов, прикрепленном к данному уроку.
Распакованные файлы из архива удобнее всего скопировать в папку Assets напрямую через стандартный Проводник вашего ПК. Откройте папку проекта в Windows, зайдите в Assets и вставьте туда картинки. Как только вы вернетесь в окно движка Godot, он автоматически обнаружит новые файлы и импортирует их в проект.
Шаг №3. Настройка области просмотра и рендеринга
На данном этапе необходимо определить размер области просмотра в проекте.
Область просмотра (Viewport) — это видимая часть сцены, в границах которой происходят основные игровые события и которую непосредственно видит игрок на своем экране. Всё, что находится за пределами этой области, остается скрытым.
Для настройки параметров отображения перейдите в верхнее меню: вкладка Проект —> пункт Настройки проекта (рис. 16).
Рисунок 16. Переход к настройкам проекта
В открывшемся окне, в колонке слева, найдите раздел Display (Дисплей) и выберите подраздел Window (Окно) (рис. 17).
Рисунок 17. Настройка разрешения окна
В правой части окна установите значения ширины и высоты окна просмотра.
Рекомендуемые значения:
Viewport Width (Ширина): 1280 пикселей.
Viewport Height (Высота): 720 пикселей.
Настройка четкости изображения (Pixel Art)
Так как мы создаем игру в стиле Roguelike с использованием пиксельной графики, по умолчанию движок может пытаться «сглаживать» (размывать) картинку. Чтобы пиксельные ассеты оставались четкими и не «мылились», необходимо изменить алгоритм фильтрации.
В этом же окне Настроек проекта найдите в левом списке раздел Rendering (Рендеринг).
Выберите подраздел Textures (Текстуры).
Найдите параметр Canvas Textures — Default Texture Filter и переключите его со значения Linear на Nearest (Ближайший).
Рисунок 18. Настройка рендера
Важно
Режим Nearest отключает интерполяцию пикселей. Это критически важно для сохранения визуального стиля игры: каждый пиксель будет отображаться жестко и четко, без размытия при увеличении.
После установки всех параметров окно настроек можно закрыть.
Карта тайлов (TileMap)
Карта тайлов (TileMap) — это система организации игрового пространства, основанная на сетке, где каждая ячейка заполняется определенным фрагментом из набора (тайсета). Если один тайл — это «деталь конструктора», то карта тайлов — это сама «платформа», на которой собирается уровень.
Шаг №4. Работа с TileMapLayer
Приступим к созданию карты проекта! Она будет строиться из тайлов с помощью современного узла TileMapLayer.
Что такое Тайл?
Это небольшой фрагмент изображения, который можно многократно повторять для построения уровней. Например: отдельный кусочек стены, пола или декора. Такие элементы позволяют легко собирать огромные локации, комбинируя набор маленьких картинок.
Знакомство с узлами Godot мы начнем именно с TileMapLayer. Этот узел позволяет заполнять пространство сцены тайлами из заранее подготовленного набора.
Чтобы добавить узел, нажмите правой кнопкой мыши (ПКМ) по корневому узлу вашей сцены (обычно это Node2D) и выберите пункт Добавить дочерний узел (рис. 19).
Рисунок 19. Добавление нового узла в сцену
В открывшемся окне поиска введите TileMapLayer, выберите его левой кнопкой мыши (ЛКМ) и нажмите Создать (рис. 20).
Рисунок 20. Выбор узла TileMapLayer
При выборе созданного узла в нижней части экрана появится новая панель управления (рис. 21).
Рисунок 21. Панель управления картой тайлов
Данное окно необходимо для управления картой тайлов.
Прежде чем рисовать, узлу нужно указать источник графики. Для этого необходимо создать ресурс TileSet через окно Инспектора. Выделите ваш TileMapLayer и посмотрите в правую часть экрана (рис. 22).
Рисунок 22. Параметр Tile Set в Инспекторе
Нажмите ЛКМ по полю [пусто] (или стрелке рядом) и выберите пункт Создать TileSet (рис. 23).
Рисунок 23. Создание нового набора тайлов
Теперь в нижней панели появится вкладка Набор тайлов (TileSet). Здесь мы свяжем узел с файлом изображения. Нажмите знак + в левом нижнем углу панели и выберите пункт Атлас (рис. 24).
Рисунок 24. Добавление Атласа в набор тайлов
В открывшемся окне выберите файл tilemap_town.png из папки вашего проекта. Godot может предложить автоматически разлиновать карту на клетки — соглашайтесь. Аналогично добавьте второй Атлас с текстурами подземелья.
Далее перейдите во вкладку Карта тайлов (TileMap) (рис. 25). Выберите инструмент «Карандаш» и подходящий тайл в правой части панели. Теперь вы можете разместить первый элемент на сцене (рис. 26)!
Рисунок 25. Инструменты рисования на карте
Инструменты панели:
Выделение (курсор): выбор уже размещенных тайлов.
Линия: создание прямой линии из тайлов.
Прямоугольник: рисование контуров или заполненных областей.
Заливка: заполнение замкнутого пространства.
Ластик: удаление тайлов.
Поворот/Отражение: изменение ориентации выбранного тайла.
Рисунок 26. Процесс создания карты
Важный совет по слоям
Рекомендуется разделять карту на логические слои. Создайте один узел TileMapLayer специально для базовых блоков (пол, земля, стены), а второй — для объектов декора (мебель, деревья, факелы). Это позволит объектам находиться "поверх" пола, не стирая его.
Структура TileMapLayer
Обратите внимание
Один узел TileMapLayer представляет собой один слой. Если вы попытаетесь поставить дерево поверх травы в одном узле, дерево «вырежет» траву под собой. Чтобы этого избежать, добавьте еще один узел TileMapLayer (например, назовите его Objects) и настройте его отдельно. Тогда первый слой будет основой, а второй — слоем для декора.
Практическое творческое задание
Настало время применить полученные знания на практике! Ваша задача — с помощью инструмента TileMapLayer спроектировать и построить стартовую локацию (деревню или небольшой город) для вашей будущей игры.
На рисунке 27 представлен пример того, как может выглядеть готовая работа. Вы можете ориентироваться на него или придумать собственный уникальный ландшафт.
Рисунок 27. Пример готовой карты деревни в Godot
Важно
На данном этапе мы создаем только окружение. Добавлять игровых персонажей или NPC (неигровых героев) на карту сейчас не нужно — позже они будут добавлены как отдельные независимые узлы. Сосредоточьтесь на архитектуре: дорожках, домиках, растительности и водоемах.
Как сохранить результат
После того как ваша сцена будет готова, её необходимо обязательно сохранить. В Godot это можно сделать двумя способами:
Через меню: В верхнем левом углу перейдите в раздел Сцена —> выберите пункт Сохранить сцену.
Горячие клавиши: Нажмите комбинацию Ctrl + S (самый быстрый и удобный способ).
Сохранение
Обязательно сохраняйте файл в созданную нами ранее папку Scenes, чтобы поддерживать порядок в структуре проекта. Дайте сцене понятное имя, например Level_Village.