Разработка игр на Godot: от кода до арт-дизайна и музыки

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

1. Основы Godot Engine: интерфейс, система узлов, сцены и введение в GDScript

Основы Godot Engine: интерфейс, система узлов, сцены и введение в GDScript

Добро пожаловать в курс «Разработка игр на Godot: от кода до арт-дизайна и музыки». Это первая статья, и мы начнем с самого фундамента. Godot Engine — это мощный, бесплатный и открытый игровой движок, который стремительно набирает популярность благодаря своей легковесности и уникальной архитектуре. В отличие от других гигантов индустрии, Godot предлагает подход, который интуитивно понятен как программистам, так и дизайнерам.

В этой статье мы разберем философию движка, изучим его интерфейс, поймем, что такое узлы (Nodes) и сцены, и напишем свой первый скрипт на языке GDScript.

Первый запуск и интерфейс редактора

После скачивания и запуска Godot (мы будем использовать актуальную 4-ю версию) вас встретит Менеджер проектов. Здесь вы создаете новые проекты или импортируете существующие. Создав новый проект, вы попадете в основной редактор.

Интерфейс Godot может показаться перегруженным кнопками, но он логично разделен на четыре основные зоны (дока).

!Схема интерфейса Godot с выделенными ключевыми зонами: Сцена, Файловая система, Инспектор и Вьюпорт.

1. Док Сцены (Scene Dock)

Расположен обычно слева сверху. Здесь отображается иерархия всего, что находится в текущей активной сцене. Это ваше «дерево» объектов.

2. Файловая система (FileSystem)

Расположена слева снизу. Это проводник по файлам вашего проекта. Здесь хранятся все ресурсы: скрипты, текстуры, звуки и сохраненные сцены.

3. Инспектор (Inspector)

Находится справа. Это контекстное меню свойств. Если вы выберете любой объект в доке Сцены, в Инспекторе появятся все его настройки: позиция, цвет, текстура, прикрепленные скрипты и многое другое.

4. Вьюпорт (Viewport)

Центральная и самая большая часть экрана. Это ваше «окно» в игровой мир. Здесь вы визуально расставляете объекты, настраиваете уровни и видите результат своей работы. Сверху над вьюпортом есть переключатели режимов: 2D, 3D, Script (редактор кода) и AssetLib.

Архитектура Godot: Узлы и Сцены

Главная особенность Godot, отличающая его от Unity или Unreal Engine — это система узлов и сцен. Понимание этой концепции — ключ к успешной разработке.

Что такое Узел (Node)?

Узел (Node) — это базовый строительный блок игры. Представьте, что это кирпичик LEGO. Сам по себе один кирпичик может немногое, но у него есть конкретная функция. В Godot есть сотни типов узлов, каждый из которых делает что-то свое:

* Node2D: Базовый узел для 2D-объектов (имеет позицию и поворот). * Sprite2D: Узел, который умеет отображать картинку (текстуру). * Label: Узел для отображения текста. * AudioStreamPlayer: Узел для проигрывания звука.

Все узлы имеют общие свойства (например, имя), но специализированные узлы расширяют этот функционал.

Дерево сцены

Узлы организуются в иерархическую структуру — дерево. У каждого узла может быть только один Родитель (Parent) и сколько угодно Детей (Children).

> Важное правило Godot: Дети наследуют трансформации родителей. Если вы двигаете родительский узел, все его дети двигаются вместе с ним.

!Иерархическая структура персонажа: корневой узел управляет спрайтом, коллизией и камерой.

Что такое Сцена?

Сцена в Godot — это просто сохраненная ветка узлов. Но магия в том, что сцены могут быть вложены друг в друга.

Представьте, что вы создали сцену «Игрок». Она состоит из узла-персонажа, узла-спрайта и узла-звука шагов. Вы сохранили это как player.tscn. Теперь вы создаете сцену «Уровень 1». Вы можете просто перетащить файл player.tscn в сцену уровня, и Godot воспримет всего игрока как единый объект (экземпляр сцены).

В Godot всё является сценой: персонаж — это сцена, оружие в его руках — это сцена, уровень — это сцена, и даже главное меню — это сцена.

Введение в GDScript

Чтобы оживить наши узлы, нам нужен код. Godot использует собственный язык — GDScript. Он специально создан для этого движка и синтаксически очень похож на Python. Он динамически типизирован (хотя поддерживает и статическую типизацию) и глубоко интегрирован в редактор.

Создание скрипта

Чтобы добавить логику к узлу, нужно выбрать узел в доке Сцены и нажать иконку свитка с зеленым плюсом («Прикрепить скрипт»). Обычно имя скрипта совпадает с именем узла, а расширение файла — .gd.

Структура скрипта

Давайте рассмотрим базовый шаблон скрипта, который создает Godot:

Разберем ключевые элементы:

  • extends Node2D: Эта строка говорит движку, что наш скрипт наследует все свойства и методы узла Node2D. Это значит, что мы можем управлять позицией (position), поворотом (rotation) и масштабом (scale) прямо из кода.
  • func _ready(): Это встроенная функция. Код внутри неё выполнится ровно один раз — в момент старта игры (или появления объекта).
  • func _process(delta): Это сердце игрового цикла. Код внутри этой функции выполняется каждый кадр. Если ваша игра работает с частотой 60 кадров в секунду, эта функция будет вызвана 60 раз за одну секунду.
  • Переменные и функции

    Объявление переменных происходит с помощью ключевого слова var.

    Понимание Delta (Дельта)

    В функции _process(delta) есть аргумент delta. Это критически важная концепция для создания плавного движения.

    Компьютеры работают с разной скоростью. На мощном ПК игра может выдавать 120 кадров в секунду, а на слабом ноутбуке — 30. Если мы будем просто прибавлять к позиции игрока 5 пикселей каждый кадр, то на мощном ПК игрок будет двигаться в 4 раза быстрее, чем на слабом. Это недопустимо.

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

    Где: * — новая позиция объекта. * — текущая позиция объекта. * — скорость (в пикселях в секунду). * — время, прошедшее с отрисовки предыдущего кадра (в секундах). В коде это переменная delta.

    Благодаря умножению на delta, если кадров мало (компьютер тормозит), delta становится больше, и персонаж «прыгает» дальше за один кадр. Если кадров много, delta очень маленькая, и персонаж двигается микрошагами. В итоге за одну секунду он пройдет одинаковое расстояние.

    Практика: Движение объекта

    Давайте напишем скрипт, который заставляет объект двигаться вправо.

  • Создайте сцену с корневым узлом Sprite2D.
  • Перетащите любую картинку (например, иконку Godot) в свойство Texture в Инспекторе.
  • Прикрепите скрипт к узлу Sprite2D.
  • Напишите следующий код:
  • Запустите сцену (кнопка Play или F6). Вы увидите, как иконка плавно уплывает вправо.

    Координатная система Godot

    Важно помнить, как устроены координаты в 2D пространстве Godot, так как они отличаются от школьной геометрии.

    * Ось X: Направлена вправо (положительные значения). * Ось Y: Направлена вниз (положительные значения). * Точка (0, 0): Находится в левом верхнем углу экрана.

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

    Заключение

    Мы рассмотрели интерфейс, разобрались с фундаментальной концепцией узлов и сцен, а также написали первый скрипт, использующий delta для независимого от частоты кадров движения. Это база, на которой строится любая игра в Godot.

    В следующей статье мы углубимся в работу с вводом (Input), чтобы научиться управлять персонажем с клавиатуры, и разберем физический движок для создания столкновений.

    2. Визуальный стиль: основы пиксель-арта, создание спрайтов, анимаций и тайлсетов

    Визуальный стиль: основы пиксель-арта, создание спрайтов, анимаций и тайлсетов

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

    Сегодня мы погрузимся в мир 2D-графики. Мы узнаем, почему пиксель-арт так популярен среди инди-разработчиков, как правильно импортировать графику в Godot, чтобы она не была размытой, как создавать анимации и строить уровни из «плиток» (тайлов).

    Почему Пиксель-арт?

    Пиксель-арт (Pixel Art) — это форма цифрового искусства, созданная на растровом уровне, где каждый пиксель имеет значение. Для разработки на Godot это отличный выбор по нескольким причинам:

  • Доступность: Вам не нужен графический планшет или навыки академического рисунка, чтобы нарисовать узнаваемого персонажа 16x16 пикселей.
  • Производительность: Пиксельные спрайты занимают мало памяти.
  • Эстетика: Четкие линии и ограниченная палитра создают уникальный ретро-стиль.
  • Для рисования можно использовать специализированные программы: Aseprite (платный, но стандарт индустрии), LibreSprite (бесплатный форк Aseprite) или Piskel (браузерный редактор).

    Импорт графики в Godot: Проблема размытия

    Самая частая ошибка новичков в Godot при работе с пиксель-артом — это «мыльная» картинка. По умолчанию движок пытается сгладить изображения, используя линейную фильтрацию. Для фотографий это хорошо, но для пиксель-арта — губительно.

    Чтобы ваши пиксели оставались четкими (crisp), нужно изменить настройки фильтрации текстур.

    Глобальная настройка (рекомендуется)

    Если вся ваша игра выполнена в пиксель-арте, лучше изменить настройки проекта:

  • Зайдите в Проект -> Настройки проекта (Project Settings).
  • Включите Расширенные настройки (Advanced Settings).
  • Перейдите в Rendering -> Textures.
  • Найдите параметр Canvas Textures -> Default Texture Filter.
  • Измените значение с Linear на Nearest (Ближайший сосед).
  • Теперь любой импортированный спрайт будет сохранять свои жесткие границы пикселей.

    Спрайты и Спрайт-листы

    Спрайт (Sprite) — это 2D-изображение, которое является частью сцены. В Godot за отображение статических картинок отвечает узел Sprite2D.

    Однако в играх персонажи редко состоят из одной картинки. Чтобы персонаж бежал, прыгал или атаковал, нам нужна анимация. Здесь на сцену выходят Спрайт-листы (Sprite Sheets).

    !Иллюстрация принципа работы спрайт-листа: одно изображение делится на кадры для создания анимации.

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

    Создание анимации с AnimatedSprite2D

    В Godot есть два основных способа создавать 2D-анимацию: AnimationPlayer (для сложных анимаций свойств и костей) и AnimatedSprite2D (для покадровой анимации). Для пиксель-арта чаще всего используется второй вариант.

    Пошаговая настройка AnimatedSprite2D

  • Добавьте в сцену узел AnimatedSprite2D.
  • В Инспекторе найдите свойство Sprite Frames.
  • Нажмите <пусто> -> Новый SpriteFrames.
  • Нажмите на созданный ресурс SpriteFrames, чтобы открыть панель анимации внизу экрана.
  • В нижней панели вы увидите менеджер анимаций. По умолчанию там есть анимация default.

  • Нажмите иконку «Добавить кадры из спрайт-листа» (иконка сетки).
  • Выберите ваш файл спрайт-листа.
  • В открывшемся окне укажите количество кадров по горизонтали и вертикали, чтобы сетка совпала с вашими рисунками.
  • Выберите нужные кадры и нажмите Add.
  • Теперь, если вы нажмете кнопку Play в панели анимации, ваш персонаж оживет.

    Управление анимацией из кода

    Чтобы переключать анимации (например, с бега на прыжок), мы используем GDScript. Предположим, у вас есть анимации с именами idle (покой) и run (бег).

    ``gdscript extends CharacterBody2D

    @onready var anim = P_{world}C_{grid}S_{tile}$ — размер одного тайла в пикселях (например, 16).

    В Godot 4 работа с тайлами была значительно переработана и улучшена.

    Создание TileSet

  • Создайте узел TileMapLayer (или TileMap для более старых версий 4.x).
  • В Инспекторе найдите свойство Tile Set и создайте Новый TileSet.
  • В настройках TileSet укажите Tile Size (размер тайла), соответствующий вашим спрайтам (например, 16x16px).
  • Перейдите в панель TileSet (внизу) и перетащите туда изображение с вашими тайлами (атлас).
  • Godot предложит автоматически нарезать атлас. Обычно можно согласиться.
  • Добавление коллизии (Физики)

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

  • Выберите ресурс TileSet в Инспекторе.
  • Найдите раздел Physics Layers и нажмите Add Element.
  • Теперь в нижней панели редактирования тайлов (вкладка TileSet) выберите нужные тайлы (например, землю).
  • В свойствах тайла (Paint properties) выберите Physics Layer 0 и нажмите клавишу F, чтобы залить тайл коллизией (или нарисуйте полигон вручную).
  • Теперь этот тайл стал твердым объектом.

    Рисование уровня

    Перейдите на вкладку TileMap (рядом с TileSet внизу). Выберите тайл и начните рисовать в окне Вьюпорта левой кнопкой мыши. Правая кнопка стирает тайлы.

    > Совет: Используйте инструмент «Ведро» (Bucket Fill) для быстрой заливки больших областей и инструмент «Линия» для создания длинных платформ.

    Террейн (Autotiling)

    Одной из самых мощных функций Godot является система Terrains (ранее известная как Autotile). Она позволяет вам рисовать землю, а движок сам подставит нужные кусочки (углы, переходы, центры) в зависимости от соседей.

    Для настройки:

  • В ресурсе TileSet добавьте Terrain Sets.
  • Внутри сета добавьте Terrain (например, "Ground").
  • В редакторе тайлов назначьте каждому тайлу его роль (bitmask): где у тайла центр, где край, а где угол.
  • При рисовании переключитесь на вкладку Terrains и просто ведите мышкой — уровень будет строиться сам.
  • Заключение

    Визуальный стиль — это лицо вашей игры. Мы научились настраивать Godot для работы с пиксель-артом, разобрались с анимацией через AnimatedSprite2D и основами построения уровней через TileMap`.

    Теперь у нас есть персонаж, который умеет бегать (визуально), и уровень, по которому можно ходить. В следующей статье мы объединим это с продвинутой физикой и вводом, чтобы создать полноценный игровой контроллер персонажа с прыжками и гравитацией.

    3. Программирование игровой логики: физика тел, коллизии, управление персонажем и скрипты взаимодействия

    Программирование игровой логики: физика тел, коллизии, управление персонажем и скрипты взаимодействия

    Мы уже научились создавать сцены, разобрались с узлами и нарисовали красивые пиксельные спрайты. Но пока наш игровой мир статичен, как картина в музее. Чтобы превратить его в игру, нам нужно добавить законы физики, научить персонажа реагировать на нажатия клавиш и взаимодействовать с окружением.

    В этой статье мы превратим «картинку» в живой механизм. Мы разберем три типа физических тел в Godot, настроим коллизии (столкновения), напишем полноценный контроллер персонажа с гравитацией и прыжками, а также научимся собирать предметы.

    Физика в Godot: Три кита 2D-мира

    Физический движок Godot берет на себя сложные математические расчеты столкновений и движения. Вам не нужно вручную проверять, пересеклись ли пиксели двух картинок. Вместо этого мы используем специальные узлы — Физические тела (Physics Bodies).

    В 2D-пространстве Godot существует три основных типа тел, каждый из которых служит своей цели:

    1. StaticBody2D (Статичное тело)

    Это неподвижные объекты. Стены, пол, платформы, камни. Они никуда не двигаются под действием физики, но другие объекты могут об них ударяться. Если вы попытаетесь сдвинуть StaticBody2D скриптом, он сдвинется, но физический движок не будет рассчитывать инерцию или отскок для него самого.

    2. RigidBody2D (Жесткое тело)

    Это объекты, полностью управляемые физическим движком. Мячи, ящики, падающие камни. На них действует гравитация, трение и импульсы. Вы не управляете их позицией напрямую (не меняете position.x), вместо этого вы прикладываете к ним силы (толкаете).

    3. CharacterBody2D (Тело персонажа)

    Ранее известный как KinematicBody2D. Это гибрид. Он предназначен для персонажей, которыми управляет игрок или искусственный интеллект. На него не действует физика сама по себе (он не упадет, если вы не напишете код гравитации), но он умеет отлично обрабатывать столкновения со стенами и полом. Это именно то, что нам нужно для главного героя.

    Коллизии: Форма имеет значение

    Добавление узла CharacterBody2D или StaticBody2D недостаточно. Телу нужно знать его физическую форму. Спрайт — это просто картинка, для физического движка она прозрачна.

    К любому физическому телу обязательно нужно добавить дочерний узел CollisionShape2D (Форма коллизии). В его свойствах вы выбираете форму: прямоугольник, круг, капсула или полигон.

    > Важно: Никогда не масштабируйте (scale) физические тела или формы коллизий. Это может привести к ошибкам в расчетах физики. Меняйте размер формы через её внутренние параметры (Size/Radius).

    !Иерархия узлов физического объекта: тело, визуальная часть и форма столкновения.

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

    Давайте создадим нашего героя. Создайте новую сцену, выберите корневым узлом CharacterBody2D. Добавьте к нему Sprite2D (с вашей текстурой) и CollisionShape2D (подгоните форму под спрайт).

    Теперь самое интересное — код. Прикрепите скрипт к CharacterBody2D. Godot 4 предлагает отличный шаблон по умолчанию, но мы разберем его с нуля, чтобы понимать каждую строчку.

    Настройка ввода (Input Map)

    Перед написанием кода зайдите в Проект -> Настройки проекта -> Список действий. Добавьте новые действия: * move_left (клавиша A или Стрелка влево) * move_right (клавиша D или Стрелка вправо) * jump (Пробел)

    Скрипт движения

    Вот полный код базового платформера с объяснениями:

    Разбор ключевых моментов

  • _physics_process(delta): Для физики мы используем именно этот метод, а не _process. Он вызывается со стабильной частотой (обычно 60 раз в секунду), что критично для точных расчетов.
  • velocity: Это встроенное свойство CharacterBody2D. Это вектор, указывающий, куда и как быстро хочет двигаться тело.
  • is_on_floor(): Метод возвращает true, если персонаж стоит на твердой поверхности. Он работает только если вы вызываете move_and_slide().
  • move_and_slide(): Главная функция. Она берет текущую velocity, двигает персонажа, обрабатывает столкновения (чтобы он не проходил сквозь стены) и позволяет скользить вдоль препятствий.
  • Математика гравитации

    В коде мы видим строку: velocity.y += gravity * delta. Это реализация равноускоренного движения.

    Где: * — новая вертикальная скорость. * — текущая вертикальная скорость. * — ускорение свободного падения (гравитация). * — время, прошедшее с последнего кадра (delta).

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

    Слои и Маски коллизий (Layers and Masks)

    В играх часто бывает так: игрок должен собирать монетки, но враги должны проходить сквозь монетки. Или пули игрока должны попадать во врагов, но не в других игроков. Для этого существует система слоев.

    Найти её можно в Инспекторе в разделе Collision -> Layer и Mask.

    * Layer (Слой): Отвечает на вопрос «КТО Я?». (Например, я — Игрок, слой 1). * Mask (Маска): Отвечает на вопрос «С КЕМ Я ВЗАИМОДЕЙСТВУЮ?». (Например, я хочу сталкиваться со Стенами, слой 2).

    Если у объекта А в Маске нет Слоя объекта Б, они пройдут сквозь друг друга, как призраки.

    Взаимодействие: Area2D и Сигналы

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

    Для этого используется узел Area2D.

    Создание монетки

  • Создайте сцену с корнем Area2D.
  • Добавьте Sprite2D (изображение монеты) и CollisionShape2D.
  • Прикрепите скрипт к Area2D.
  • Теперь нам нужно узнать, когда игрок войдет в эту зону. Godot использует систему Сигналов (событий).

  • Выберите узел Area2D.
  • Перейдите на вкладку Узел (Node) (справа, рядом с Инспектором).
  • Найдите сигнал body_entered(body: Node2D).
  • Дважды кликните по нему и подключите к скрипту монетки.
  • В скрипте появится новая функция:

    Функция queue_free() очень важна. Она ставит объект в очередь на удаление. В конце кадра Godot безопасно удалит монетку из памяти.

    Заключение

    Сегодня мы вдохнули жизнь в игру. У нас есть:

  • Мир, построенный из StaticBody2D.
  • Герой на основе CharacterBody2D, который бегает, прыгает и подчиняется гравитации.
  • Предметы, созданные через Area2D, которые исчезают при сборе.
  • Это фундамент геймплея. В следующей статье мы займемся тем, что делает игру понятной и атмосферной: создадим пользовательский интерфейс (UI) для отображения счета и здоровья, а также добавим звуковые эффекты и музыку.

    4. Аудиодизайн: создание звуковых эффектов и музыки, импорт и настройка звука в движке

    Аудиодизайн: создание звуковых эффектов и музыки, импорт и настройка звука в движке

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

    Звук — это 50% атмосферы игры. Он дает игроку обратную связь (удар, прыжок, получение урона) и задает настроение (тревожная музыка в подземелье или веселая на лужайке). В этой статье мы научимся работать со звуковой подсистемой Godot, разберемся в форматах файлов и создадим аудио-менеджмент, достойный профессиональной игры.

    Основы цифрового звука для игр

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

    1. Звуковые эффекты (SFX)

    Это короткие звуки: выстрелы, шаги, прыжки, интерфейсные клики.

    * Формат: WAV. * Почему: Это несжатый формат. Он занимает больше места на диске, но процессору не нужно тратить время на его распаковку. Это критично для звуков, которые должны воспроизводиться мгновенно и часто.

    2. Музыка и фоновые звуки (Ambience)

    Это длинные треки, звучащие несколько минут.

    * Формат: Ogg Vorbis (.ogg) или MP3. * Почему: Это сжатые форматы. Трек в WAV может весить 50 МБ, а в OGG — всего 3 МБ. Для длинных файлов экономия места важнее, чем микросекунды задержки при распаковке.

    > Совет: Старайтесь использовать формат Ogg Vorbis в Godot. Он открытый, бесплатный и обеспечивает лучшее качество при том же размере файла, что и MP3.

    Инструменты для создания звука

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

    * Bfxr / Jfxr: Генераторы 8-битных звуков. Идеально подходят для пиксель-арта. Вы просто нажимаете кнопки «Jump», «Explosion» или «Coin», и программа генерирует случайный ретро-звук. * Audacity: Бесплатный и мощный аудиоредактор. В нем можно обрезать тишину, изменить громкость или наложить эхо.

    Аудио-система Godot

    В Godot нет понятия «просто проиграть файл». Звук всегда исходит из какого-то источника (узла). Существует три основных типа узлов для воспроизведения звука:

  • AudioStreamPlayer: Проигрывает звук «в голове» игрока. У него нет позиции в пространстве. Идеально подходит для музыки, звуков интерфейса (UI) и внутренних монологов.
  • AudioStreamPlayer2D: Позиционный звук в 2D. Если источник слева от камеры, звук будет слышен слева. Если источник далеко, звук будет тише.
  • AudioStreamPlayer3D: Аналог для 3D-игр.
  • !Сравнение позиционного 2D звука с затуханием и глобального звука без позиции.

    Импорт и настройка цикличности (Loop)

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

  • Перетащите аудиофайл (например, music.ogg) в папку проекта.
  • Выберите этот файл в панели Файловая система.
  • Перейдите на вкладку Импорт (Import) (обычно там же, где и сцена, слева сверху).
  • Найдите параметр Loop (Цикл).
  • * Для музыки поставьте галочку (Enable). * Для звуков прыжка или удара уберите галочку.
  • Нажмите кнопку Reimport внизу панели.
  • Практика: Добавляем звук прыжка

    Вернемся к нашему проекту платформера. У нас есть персонаж, который прыгает, но делает это молча. Давайте это исправим.

    Шаг 1: Подготовка сцены

  • Откройте сцену игрока (Player.tscn).
  • Добавьте дочерний узел AudioStreamPlayer2D к корневому узлу персонажа.
  • Переименуйте его в JumpSound.
  • В Инспекторе перетащите ваш файл звука прыжка (WAV) в поле Stream.
  • Шаг 2: Код воспроизведения

    Теперь нужно сказать движку, когда именно играть этот звук. Откройте скрипт персонажа.

    Нам нужно получить ссылку на узел звука и вызвать метод .play() в момент прыжка.

    ``gdscript extends CharacterBody2D

    ... (предыдущие переменные)

    Получаем ссылку на узел звука при старте

    @onready var jump_sfx = 1.01.01.01.0$ — линейное затухание.

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

    Заключение

    Звук — это мощный инструмент погружения. Мы разобрали:

  • Разницу между форматами WAV и OGG.
  • Использование AudioStreamPlayer для музыки и AudioStreamPlayer2D для объектов мира.
  • Важность рандомизации высоты тона (pitch_scale`) для реализма.
  • Работу с аудио-шинами для раздельного управления громкостью музыки и эффектов.
  • Теперь ваш платформер не только выглядит как игра, но и звучит как игра. В следующей статье мы займемся созданием пользовательского интерфейса (UI): сделаем главное меню, счетчик монет и полоску здоровья, чтобы игрок мог отслеживать свой прогресс.

    5. Сборка проекта: создание пользовательского интерфейса (UI), полировка геймплея и экспорт игры

    Сборка проекта: создание пользовательского интерфейса (UI), полировка геймплея и экспорт игры

    Поздравляем! Если вы следовали предыдущим статьям нашего курса, у вас уже есть работающий прототип игры. У вас есть персонаж, который прыгает по платформам, собирает монетки и издает звуки. Но чего-то не хватает. Игрок не знает, сколько у него жизней, сколько монет он собрал, и игра начинается сразу, без главного меню.

    В этой финальной статье мы превратим наш прототип в полноценный продукт. Мы разберем мощную систему интерфейсов Godot (UI), добавим визуального лоска с помощью частиц и твинов, а затем экспортируем игру в исполняемый файл, который можно отправить друзьям.

    Система интерфейса (UI) в Godot

    В отличие от многих других движков, где UI — это отдельная надстройка, в Godot интерфейс строится из тех же узлов, что и сама игра. Однако для UI существует специальный тип узлов — Control (зеленые иконки).

    Главное отличие узлов Control от Node2D заключается в том, что они используют не просто позицию , а систему Якорей (Anchors) и Контейнеров.

    CanvasLayer: Слой интерфейса

    Если вы просто добавите текст (Label) в сцену с игроком, то при движении камеры текст уедет за край экрана. Интерфейс должен быть «приклеен» к экрану, независимо от движения камеры.

    Для этого используется узел CanvasLayer. Всё, что находится внутри него, отрисовывается поверх игрового мира и привязано к координатам экрана, а не игрового мира.

    Якоря и Адаптивность

    Игроки могут запускать вашу игру на разных мониторах: от квадратных офисных дисплеев до ультрашироких экранов. Если вы просто поставите кнопку в пикселях , на большом разрешении она может оказаться слишком мелкой или не на своем месте.

    !Схематичное изображение привязки элементов интерфейса к краям экрана с помощью якорей.

    Якоря (Anchors) определяют положение элемента относительно родительского прямоугольника в процентах. Например, если вы хотите, чтобы полоска здоровья всегда была в левом верхнем углу, вы привязываете её якоря к Top-Left.

    Создание HUD (Heads-Up Display)

    Давайте создадим интерфейс, который игрок видит во время игры.

  • Создайте новую сцену и выберите корневым узлом CanvasLayer. Назовите его HUD.
  • Добавьте дочерний узел Control и растяните его на весь экран (в панели инструментов сверху выберите Layout -> Full Rect).
  • Добавьте Label для отображения счета.
  • Добавьте TextureProgressBar для отображения здоровья.
  • Настройка полоски здоровья

    Узел TextureProgressBar позволяет создать красивую шкалу жизни, используя ваши спрайты.

    * Under: Текстура фона (пустая полоска). * Progress: Текстура заполнения (полная полоска). * Value: Текущее значение (например, 50 из 100).

    Чтобы отобразить здоровье корректно, нам часто нужно перевести текущие очки здоровья (HP) в проценты для шкалы. Формула расчета процента заполнения выглядит так:

    Где: * — итоговый процент заполнения шкалы (значение от 0 до 100). * — текущее здоровье персонажа (Current Health). * — максимальное здоровье персонажа (Max Health).

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

    Связь интерфейса и игрока через Сигналы

    Интерфейс не должен знать о физике игрока, а игрок не должен напрямую управлять текстом на экране. Лучший способ связи — Сигналы.

    В скрипте игрока (Player.gd):

    В основной сцене уровня вы соединяете сигнал игрока с методом обновления в скрипте HUD.

    Главное меню

    Игра начинается с меню. Это отдельная сцена.

  • Создайте сцену с корнем Control.
  • Добавьте VBoxContainer (вертикальный контейнер). Он автоматически выстроит все дочерние элементы в столбик.
  • Внутри контейнера добавьте два узла Button: «Играть» и «Выход».
  • Скрипт меню

    Прикрепите скрипт к корню меню. Подключите сигналы pressed() от кнопок к скрипту.

    Полировка геймплея (Juice)

    «Juice» (сок) — это термин геймдизайнеров, означающий визуальную и аудиальную отдачу игры. Это то, что делает нажатие кнопки приятным.

    1. Частицы (GPUParticles2D)

    Когда игрок собирает монетку, она не должна просто исчезать. Она должна рассыпаться на искорки. Для этого используется узел GPUParticles2D.

    * Создайте материал частиц (Process Material). Настройте Emission Shape (форма появления) на Sphere*. * Настройте Gravity (гравитацию), чтобы частицы падали или разлетались.

    Добавьте этот узел в сцену монетки, но сделайте его неактивным (emitting = false). В момент сбора монеты включите излучение частиц перед удалением объекта.

    2. Твины (Tweens)

    Анимация не всегда требует создания сложных AnimationPlayer. Для простых движений (увеличение кнопки при наведении, плавное исчезновение текста) идеально подходят Твины (от англ. in-between — промежуточный).

    Пример: кнопка в меню плавно увеличивается при наведении мыши.

    Это делает интерфейс «живым» и отзывчивым.

    Экспорт проекта

    Когда игра готова, пора выпустить её в свет. Godot позволяет экспортировать игру на Windows, macOS, Linux, Android, iOS и HTML5 (Web) без изменения кода.

    Шаг 1: Загрузка шаблонов экспорта

    Перейдите в меню Редактор -> Управление шаблонами экспорта. Вам нужно скачать шаблоны для вашей версии Godot. Это специальные версии движка без редактора, которые будут «склеены» с вашей игрой.

    Шаг 2: Настройка пресета

  • Перейдите в Проект -> Экспорт.
  • Нажмите Добавить... и выберите платформу (например, Windows Desktop).
  • В настройках вы можете изменить иконку игры, права доступа и другие параметры.
  • !Интерфейс меню экспорта проекта, где выбирается целевая платформа и настраиваются параметры сборки.

    Шаг 3: Файл PCK и исполняемый файл

    При экспорте Godot создает два основных файла (для Windows):

  • Game.exe — сам движок (проигрыватель).
  • Game.pck — пакет со всеми вашими ресурсами (спрайты, скрипты, звуки).
  • Оба этих файла должны находиться в одной папке, чтобы игра запустилась.

    > Совет: Для публикации в вебе (HTML5) обязательно включите поддержку SharedArrayBuffer на хостинге, если используете многопоточность, или используйте настройки совместимости.

    Заключение курса

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

    Разработка игр — это бесконечный процесс обучения. Godot предоставляет вам инструменты, но магия происходит в вашей голове. Экспериментируйте, ломайте правила и создавайте миры, в которые хочется возвращаться. Удачи в ваших проектах!