UI, звук, сохранения, оптимизация и экспорт проекта
Зачем эта тема нужна после 2D и 3D
В предыдущих статьях вы собрали фундамент Godot: ноды, сцены, ресурсы, скрипты на GDScript, событийность через сигналы, а также базовый 2D- и 3D-геймплей. Следующий шаг, чтобы прототип стал игрой, обычно включает пять практических блоков:
UI: меню, HUD, настройки, экран паузы
Звук: эффекты, музыка, микс через аудио-шины
Сохранения: прогресс игрока и настройки
Оптимизация: профилирование и устранение узких мест
Экспорт: сборка билда под нужную платформуЭта статья показывает типовые решения в Godot 4, которые хорошо масштабируются: UI собирается как переиспользуемые сцены, звук управляется через шины и менеджер, сохранения изолируются в отдельном слое, а оптимизация и экспорт опираются на инструменты движка.
UI в Godot: Control-ноды, контейнеры, сигналы и темы
Базовая модель UI: Control и дерево интерфейса
UI в Godot обычно строится на нодах, наследниках Control. Такие ноды рисуются в 2D-интерфейсе и имеют систему якорей, размеров и контейнеров.
Control задаёт основу UI-элемента и его размещение
Label, Button, TextureRect, ProgressBar и другие дают готовые элементы
Container-ноды автоматически раскладывают дочерние элементыДокументация:
Control
ContainerПрактическое правило: делайте UI отдельными сценами, чтобы их можно было инстансировать и переиспользовать (например, HUD.tscn, PauseMenu.tscn, SettingsMenu.tscn).
CanvasLayer: как отделить UI от мира
Если у вас камера двигается по уровню, UI обычно должен оставаться на месте. Для этого удобно держать интерфейс в CanvasLayer.
мир (2D/3D) живёт в обычных нодах сцены
UI размещается внутри CanvasLayer и не «ездит» вместе с камеройДокументация: CanvasLayer
Якоря и контейнеры: что выбирать
В Godot есть два основных подхода к адаптивной раскладке UI:
Anchors (якоря) полезны для простых элементов: например, закрепить счёт в правом верхнем углу
Containers полезны для меню и списков: они автоматически управляют размером и позициями дочерних элементовТиповые контейнеры:
VBoxContainer для вертикального меню
HBoxContainer для горизонтальных панелей
GridContainer для сеток (инвентарь)
MarginContainer для внутренних отступовСигналы в UI: кнопки и события без жёстких связей
UI идеально сочетается с сигналами, потому что кнопка должна сообщать о событии, а логика игры решает, что делать.
Пример подключения pressed у кнопки:
Документация по смене сцен: SceneTree
!Как UI через сигналы связывается с игровой логикой
Темы и единый стиль
Чтобы интерфейс выглядел цельно, используйте Theme.
тема хранит шрифты, размеры, цвета, стили кнопок и полей
тему можно применить ко всему UI или к отдельной ветке интерфейсаДокументация: Theme
Практическое правило: если вы меняете шрифт и цвета «вручную» в каждом элементе, проект быстро станет трудно поддерживать. Лучше иметь одну тему и изменять стиль в одном месте.
Пауза и меню паузы: важная деталь про Process Mode
Пауза часто делается через остановку дерева сцены:
Но тогда многие ноды перестанут обрабатываться. Для меню паузы обычно нужно, чтобы UI продолжал работать.
Практический подход:
мир ставится на паузу через get_tree().paused = true
нода меню паузы получает Process Mode = When Paused (в инспекторе), чтобы кнопки реагировалиДокументация: Node
Звук: AudioStreamPlayer, шины, микс и менеджер
Какие ноды отвечают за звук
В Godot есть несколько типовых вариантов проигрывания:
AudioStreamPlayer для обычного (непозиционного) звука, например музыки и UI-кликов
AudioStreamPlayer2D для позиционного 2D-звука
AudioStreamPlayer3D для позиционного 3D-звукаДокументация:
AudioStreamPlayer
AudioStreamPlayer2D
AudioStreamPlayer3DПрактическое правило: музыку и UI лучше вести как непозиционные звуки, а эффекты шагов/выстрелов делать позиционными, если это улучшает восприятие.
Аудио-шины: как управлять громкостью групп
Аудио в Godot идёт через Audio Buses (шины). Это микшер, где вы:
объединяете звуки по категориям
ставите эффекты (компрессор, реверберация)
делаете настройки громкости для игрокаТиповая структура шин:
Master
Music
SFX
UIДокументация: Audio buses
!Как звук маршрутизируется через шины и где настраивается громкость
Как назначить шину конкретному плееру
У AudioStreamPlayer есть поле bus. Если вы установите bus = "SFX", звук будет идти через эту шину.
Пример: UI-клик на шину UI.
Практическое правило: не создавайте десятки постоянных плееров на каждый чих. Для коротких звуков удобно создавать временный AudioStreamPlayer и удалять его после finished.
Менеджер звука и настройки громкости
Чтобы не размазывать звук по проекту, часто делают AudioManager.
он знает названия шин
он умеет проигрывать музыку и эффекты
он применяет настройки громкости из сохраненияДля управления громкостью шин используйте AudioServer.
Документация: AudioServer
Идея настройки:
в меню настроек HSlider меняет значения music_volume, sfx_volume
эти значения сохраняются
при запуске игры применяются к шинамСохранения: прогресс, настройки и версия данных
Где хранить файлы сохранения
Для данных пользователя используйте путь user://. Это специальная папка, которую Godot выбирает корректно для каждой платформы.
Документация: Data paths
Практическое правило: не пишите сохранения в res://, потому что ресурсы проекта могут быть упакованы и недоступны для записи.
Что именно сохранять
Разделяйте данные на две группы:
настройки: громкость, язык, чувствительность, раскладка
прогресс: пройденный уровень, инвентарь, очки, открытые способностиЭто помогает:
не ломать прогресс при сбросе настроек
проще мигрировать формат (например, прогресс меняется чаще)Простой формат: JSON
JSON удобен на старте, потому что:
он читаемый
легко дебажить
хорошо подходит для словарей и простых структурМинусы:
надо аккуратно проверять типы при загрузке
нельзя напрямую хранить сложные типы без дополнительной сериализацииНиже пример минимального слоя сохранения настроек.
Документация:
FileAccess
JSONНастройки через ConfigFile
Если вы сохраняете в основном настройки (параметры и секции), полезен ConfigFile.
формат похож на ini
удобно хранить по секциям: audio, graphics, controlsДокументация: ConfigFile
Версия сохранения и совместимость
Как только вы меняете структуру данных, старые сохранения могут перестать читаться. Минимальная защита:
храните version в словаре сохранения
при загрузке делайте ветку миграцииПрактический пример подхода:
version = 1 в первой версии
добавили новое поле, сделали version = 2
при загрузке version = 1 дополняете словарь значениями по умолчаниюОптимизация: что замерять и что чинить в первую очередь
Оптимизация начинается с измерений
Прежде чем что-то «ускорять», нужно понять, что именно тормозит:
CPU (скрипты, физика, логика)
GPU (отрисовка, тени, постэффекты, количество объектов)
память (текстуры, аудио, большие сцены)Точка входа в документацию по производительности: Performance
Практическое правило: оптимизируйте только то, что реально является узким местом, иначе вы усложните проект без выигрыша.
Типовые причины просадок и быстрые меры
Ниже список самых частых проблем в учебных и инди-проектах.
#### Скрипты и логика
не делайте тяжёлые циклы в _process без необходимости
не ищите ноды через get_node() каждый кадр, используйте @onready кеширование
используйте сигналы вместо постоянного опроса состояния, когда это уместно#### Физика и коллизии
используйте простые CollisionShape2D/3D
настройте слои и маски, чтобы лишние объекты не проверялись друг с другом
не плодите большое число активных Area и тел без необходимости#### 2D-отрисовка
следите за количеством уникальных текстур на экране
по возможности используйте атласы или единый спрайт-лист для множества мелких объектов#### 3D-отрисовка
тени очень дорогие, особенно от нескольких источников
материалы и большое количество уникальных мешей увеличивают нагрузку
избегайте лишней детализации там, где она не виднаПрактический мини-чеклист перед релизом
отключить или скрыть отладочные визуализации
проверить, что в релизе нет лишних логов и тестовых сцен
проверить, что ассеты не имеют неоправданно большого размера (текстуры 4K там, где нужно 512)
проверить, что нет утечек нод (например, временные AudioStreamPlayer удаляются)Экспорт проекта: от пресета до готового билда
Главная идея экспорта
Godot экспортирует ваш проект через Export Presets. Для каждой платформы вы настраиваете:
целевой формат (Windows, Linux, macOS, Android, Web)
параметры сборки
какие файлы включатьДокументация: Exporting projects
Экспортные шаблоны
Чтобы экспортировать, обычно нужны export templates (шаблоны экспорта).
Godot предложит скачать их при первом экспорте
шаблоны соответствуют версии движка, поэтому важно, чтобы версии совпадалиПошаговый процесс экспорта
Откройте Project → Export....
Добавьте пресет нужной платформы.
Укажите путь и имя итогового файла.
Настройте опции (иконки, подписи, разрешения, ориентация и другое).
Экспортируйте Debug и Release и сравните поведение.Частые ошибки при экспорте
разные версии движка и шаблонов экспорта
забыли добавить нужные файлы (например, JSON-конфиги, шрифты)
сохранения пишутся не в user://, и в релизе перестают работать
не проверили экспорт на чистой машине (без ресурсов редактора)Минимальная проверка качества билда
запуск с нуля и создание сохранения
проверка настроек громкости через шины
проверка разрешения, масштабирования UI и читаемости
проверка производительности на целевом устройствеИтог
Теперь у вас есть «производственный» слой поверх геймплея:
UI на Control с контейнерами, темами и сигналами, часто внутри CanvasLayer
звук через AudioStreamPlayer и Audio Buses, с централизованным управлением
сохранения в user:// через FileAccess, JSON или ConfigFile, с версией данных
оптимизация через измерения и устранение конкретных узких мест
экспорт через пресеты и шаблоны, с обязательной проверкой Release-сборкиЭти навыки обычно отделяют прототип от игры, которую можно показать, протестировать и собрать в билд для игроков.