gohud

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

gohud — набор HUD и UI для Godot 4.6 и новее. Плавающие окна, нижние листы, диалоги, формы, снекбары, обучающие подсказки, полосы HUD, быстрые слоты и виртуальный стик работают от одной темы и одного сменного набора иконок, а безопасную область, виртуальную клавиатуру, RTL и области нажатия берут на себя. Шесть пресетов — обычный, sci-fi и средневековый, каждый в тёмном и светлом варианте, — меняют цвета и формы одной строкой.

Godot 4.6+ v1.0.1 Чистый GDScript Автозагрузка не нужна MIT 6 пресетов 21 язык 100 иконок в комплекте

Как это выглядит в игре

Средневековый и sci-fi пресеты — лист персонажа, инвентарь и задания; формы, сетки и карточки вопросов; угловатые панели и сенсорное управление. Пресет переключается одной строкой кода.

Средневековая тема gohud — лист персонажа с полосами здоровья, маны и выносливости, сумка с быстрыми слотами и журнал заданий в кованых золотых рамках
Средневековье — персонаж, инвентарь и задания
Средневековая тема gohud — панель ввода с полем имени, переключателем, флажками и ползунком громкости, сетка плиток и карточка приглашения в группу с кнопками «Принять» и «Отклонить»
Средневековье — формы, сетки и карточки вопросов
Тема gohud в стиле sci-fi — панель сенсорного управления со срезанными углами, шестиугольный стик, переключатель «Фиксированный / Следящий / Относительный» и круглые кнопки действий
Sci-fi — угловатые панели и сенсорное управление

Все шесть пресетов и как их переключать →

Что он берёт на себя

Больше всего времени в игровом интерфейсе съедает не форма кнопки, а всё то, что расходится между устройствами. gohud держит это расхождение в одном месте.

Каждый размер — это токен

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

Видимый размер ≠ размер нажатия

Кнопка закрытия выглядит на 36dp, но её область нажатия — 48dp. Там, где тесно стоящие слоты перекрываются, нажатие получает тот, чей центр ближе.

Вырезы и клавиатуры

Элементы HUD остаются внутри безопасной области, а поле ввода поднимается над виртуальной клавиатурой, когда та появляется.

«Назад» закрывает одно

Escape и кнопка «Назад» на Android закрывают только самую верхнюю поверхность. Стопка окон не исчезает целиком.

Уведомления не перехватывают ввод

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

Иконки запрашиваются по имени

Виджеты знают только GoIconSet.CLOSE. Смените набор — и все рисунки поменяются, не тронув ни строки кода.

Шесть образов, одна строка

GoUi.use_preset() меняет тему, скин и иконки разом — скруглённые, срезанные sci-fi или кованые средневековые рамки.

Читаемость — по измерению

Каждая тема проверена по WCAG, включая состояния кнопок и полупрозрачные панели HUD поверх чисто белого и чисто чёрного.

Всё работает и без включения плагина. Включение добавляет автозагрузку GoRuntime, которая следит за размером окна, масштабом dp и высотой клавиатуры, плюс настройки проекта для ресурса конфигурации и пресета — это удобства, а не требования.

Установка gohud

Два пути. Поручите ИИ-агенту или положите папку в проект — больше настраивать нечего.

Установка

Быстрый старт

Пять строк выводят экран с темой. Полное прохождение — на странице установки.

Быстрый старт

Смена внешнего вида — цвета и форма

Theme может перерисовать только то, что рисует движок. Скруглённые углы — единственные, какие есть у StyleBoxFlat, а стик, быстрые слоты и обучающая подсказка рисуются кодом, поэтому одна лишь тема никогда не изменит их форму. Поэтому в gohud есть пресеты: тема, скин и набор иконок, выбранные как одно целое.

GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK)   # тема, скин и иконки разом
ПресетВид
default_darkИсходный gohud — скруглённые углы, мягкий синий акцент
default_lightТе же формы на светлой палитре
scifi_darkСрезанные углы, неоновые голубые грани и свечение, шестиугольный стик, прицельные скобки
scifi_lightТе же угловатые формы в яркой «чертёжной» палитре
medieval_darkТёмное железо и кожа, рамки под старое золото, заклёпки, гравированные иконки, заголовки шрифтом Cinzel
medieval_lightПергамент, чернила и бронза с теми же коваными рамками
Галерея gohud с пресетом default_dark — скруглённые углы, синий акцент
default_dark — скруглённые углы, мягкий синий акцент
Пресет default_light — те же формы на светлой палитре
default_light — те же формы, светлая палитра
Пресет scifi_dark — срезанные углы и голубой неон
scifi_dark — срезанные углы, голубой неон
Пресет scifi_light — те же угловатые формы в «чертёжной» палитре
scifi_light — те же угловатые формы, «чертёжная» палитра

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

Средневековая коллекция

medieval_dark соединяет железо и кожу со старым золотом; medieval_light берёт пергамент и чернила. На рамках меню есть заклёпка и небольшой угловой орнамент, а всегда видимый HUD остаётся сдержанным; 16 гравированных иконок перерисовывают названия предметов, и только заголовки и подзаголовки используют встроенный шрифт Cinzel.

medieval_dark — лист персонажа, сумка с быстрыми слотами и журнал заданий
medieval_dark — железо и кожа
medieval_light — те же экраны персонажа, сумки и заданий на пергаменте
medieval_light — пергамент и чернила

Оба снимка — это examples/medieval/medieval.tscn, собранный из стандартных виджетов. Руководство по средневековью и как сделать своё королевство →

Один и тот же экран на телефоне и на настольном компьютере

Снимки галереи сделаны на телефоне в книжной ориентации. Ниже — тот же код при 1280×800: содержимое останавливается на читаемой ширине (480dp) и центрируется, а HUD остаётся по углам. Форма обходит плавающие элементы HUD, но не двигается, если и так их не задевает: сдвиг ради сдвига увёл бы содержимое с центра широкого экрана.

default_dark при 1280x800 — содержимое по центру, HUD по углам
default_dark · 1280×800
scifi_dark при 1280x800 — та же раскладка со срезанными панелями и неоном
scifi_dark · 1280×800

Тот же лист, другой вид

Нижний лист в default_dark
Обычный — скруглённая карточка, закреплённый ряд поиска и подвал
Нижний лист в scifi_dark — неоновая акцентная грань по верху
Sci-fi — акцентная грань сверху, срезанные углы, свечение

Выберите пресет в Project Settings → gohud → Theme → Preset или задайте GoConfig.preset. Явно заполненные theme, skin или icons берут верх над пресетом, так что можно взять пресет и переопределить лишь одно из трёх.

Новая тема — это один файл JSON. new_theme.py kingdom --from medieval_dark пишет палитру, в которой расписано каждое унаследованное значение; make_theme.py kingdom собирает тему, графику элементов управления и регуляторы скина, после чего пресет появляется в списке выбора. Все настройки и регуляторы →

Скины — там, куда Theme не дотягивается

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

class_name MySkin extends GoSkin

func slot_box(accent: Color, lit: bool) -> StyleBox:
    var box := GoStyleBoxCut.new()
    box.bg_color = accent
    box.cut = 6.0
    box.edge_color = accent
    return box
КлассКакие формы умеет
GoStyleBoxCutДиагонально срезанные углы (фаска), одна утолщённая акцентная грань, внешнее свечение
GoStyleBoxBracketТолько угловые метки, без замыкания содержимого в рамку
GoStyleBoxMedievalКованая рамка с заклёпками, угловой гравировкой, фасочным бликом и фактурой материала

Все три сериализуются в ресурс Theme — именно это и позволяет теме менять форму, а не только цвет. GoSkinSciFi и GoSkinMedieval — подклассы, идущие в комплекте.

GoStyle.box() всегда возвращает StyleBoxFlat, потому что вызывающий код получает его и правит bg_color или corner_radius. Если нестандартная форма должна уцелеть, используйте GoStyle.surface().

Виджеты

Все части в одной таблице. Каждая подробно →

КлассБазовыйЧто делает
GoSurfaceControlОболочка плавающей карточки — размещение по центру, снизу или у элемента, закреплённые шапка и подвал, прокручиваемое тело, изменение размера перетаскиванием
GoSheetCanvasLayerСтраницы, поднимающиеся снизу, на собственном слое, поэтому они лежат поверх HUD
GoDialogsNodeПодтверждения и оповещения, которые можно await; destructive — для необратимых действий
GoFormMarginContainerФормы с ограниченной шириной, обходящие виртуальную клавиатуру и, с avoid_hud, сам HUD
GoScrollScrollContainerСенсорная прокрутка; полоса прокрутки прячется во внутренние отступы карточки
GoNoticePanelContainerСнекбар, который не берёт ни ввод, ни фокус
GoPromptCardPanelContainerВопрос, который не блокирует игру
GoCoachMarkControlОбучающий тур, указывающий на настоящие элементы управления; нажатие на цель двигает тур дальше
GoHudAnchorControlПрикрепляет элементы HUD к одной из девяти точек безопасной области
GoBarControlПолосы здоровья, маны и опыта с плавным изменением
GoSlotButtonБыстрый слот — иконка, количество, перезарядка и горячая клавиша на одной лицевой панели
GoJoystickControlВиртуальный стик в фиксированном, следящем или относительном режиме
GoIconButtonButtonВыглядит маленькой, нажимается большой
GoStyleстатическийКнопки, строки списка, поля ввода, чипы, таблицы, вкладки и прочее, сделанные единым образом

Ожидание, сообщения, счётчики

КлассБазовыйЧто делает
GoSnackbarNodeсообщение, которое само встаёт на место
GoSpinnerControlожидание без видимого конца
GoBadgePanelContainerточка непрочитанного, метка НОВОЕ, 99+

Формы и списки

КлассБазовыйЧто делает
GoFieldVBoxContainerстрока, которая может быть неверной
GoInputGroupHBoxContainerполе ввода, сваренное со своей кнопкой
GoComboboxButtonвыбор с поиском
GoCodeInputVBoxContainerкупоны и подарочные коды
GoTableVBoxContainerсортируемые заголовки, выбираемые строки
GoPaginationHBoxContainerстраницы или строка «Ещё»

Формы, которые играм действительно нужны

КлассБазовыйЧто делает
GoRewardCalendarVBoxContainerежедневный вход
GoRadar · GoDonutControlхарактеристики с одного взгляда
GoCarouselVBoxContainerбаннеры и выбор персонажа
GoKbdHBoxContainerподсказки клавиш, которые не врут

Поверх экрана

КлассБазовыйЧто делает
GoDrawerCanvasLayerбоковая панель
GoPopoverRefCountedкарточка с привязкой
GoContextMenuRefCountedдолгое нажатие и правый клик
GoConsoleCanvasLayerконсоль разработчика

AI SKILL

В gohud входит ИИ-навык: весь API, готовые шаблоны и запуск предпросмотра. Вставьте один блок в своего агента — он установит gohud и будет знать, как им пользоваться.

AI SKILL

Читаемость измеряют, а не прикидывают на глаз

«Красиво» — дело вкуса; «читаемо» можно измерить. Бледно-серый текст отлично смотрится на хорошем мониторе и исчезает на телефоне при дневном свете — выбор на глаз рано или поздно приводит именно к этому.

python3 addons/gohud/tools/check_contrast.py

Каждая пара цветов и подпись каждого состояния кнопки поверх панели, на которой она лежит, измеряется по WCAG во всех шести темах. Полупрозрачные цвета сначала накладываются на настоящий фон — если измерять их напрямую, коэффициент получается лучше, чем на экране.

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

Проверки, релизы и этот сайт

Одна точка входа запускает все проверки; каждая часть видит то, чего не видят остальные.

bash addons/gohud/tools/check_all.sh
ПроверкаЧто ловит
run_tests.sh на четырёх размерах экранаПоведение и раскладку виджетов, позиции в RTL, фокус с клавиатуры, контраст скина во время работы, все пресеты
new_project_check.shСкрытые зависимости от проекта-хозяина; с --zip — релиз в том виде, в каком он поставляется, с --export — сборку для Web
check_contrast.pyКонтраст по WCAG в каждом файле темы, включая состояния кнопок и полупрозрачные панели
check_generated.py · check_scaffold.shСгенерированные темы совпадают со своими палитрами; одноразовая тема собирается и проходит проверку контраста
check_package.pyВерсия из package.json, перенос записей в журнале изменений и содержимое ZIP — во временных копиях
check_site.pyСсылки этого сайта, якоря, язык страницы, глоссарий и таблицы регуляторов
Последний записанный прогон — 2026-09-13, Godot 4.7.2, macOS, рендерер Compatibility. 438 из 438 проверок на 390×844, 844×390, 768×1024 и 1280×800 в пустом проекте; снова 438 из 438 с автозагрузкой GoRuntime; экспорт для Web; ноль провалов по контрасту в шести темах. Godot 4.6 и физические устройства на Android или iOS в этот прогон не входили.

Версии релизов

cat addons/gohud/package.json       # { "version": "1.1.0" }
bash addons/gohud/tools/package.sh  # 1.1.0 → builds/1.1.0/gohud-1.1.0.zip

Версия — та, что записана в package.json: упаковка её никогда не повышает. Чтобы выпустить новую версию, сначала измените это число. Успешный прогон выставляет это значение в plugin.cfg и GoUi.VERSION, а при первой упаковке этой версии переносит заметки из раздела Unreleased в CHANGELOG.md в датированную запись. Повторная упаковка той же версии заново собирает её ZIP и заменяет прежний. Неудачный прогон не меняет ничего. В ZIP не попадают этот сайт, тесты, инструменты и package.json.

Этот сайт

python3 addons/gohud/tools/make_site.py            # глоссарий и таблицы регуляторов скина, порождённые из исходников
python3 addons/gohud/tools/check_site.py           # ссылки, якоря, язык, глоссарий, порождённые таблицы
bash addons/gohud/tools/site_shots.sh /tmp/shots   # снимки каждой страницы для настольного экрана и телефона

Страницы — это обычный HTML в www/: английский в корне, корейский в ko/. Рабочий процесс GitHub Actions публикует эту папку как корень сайта.