Лидерборд без сервера: как добавить таблицу рекордов в игру
Лидерборд без своего сервера: личность игрока, запись очков и ранги уже держат Steam, Google Play, Game Center, Nakama или встроенные таблицы движка.
Таблица рекордов — это три задачи: отличать игроков друг от друга, записывать результат так, чтобы он пережил закрытие вкладки, и показывать рейтинг. Ни одна из трёх не начинается со слов «поднять свой сервер». Если игра выходит в Steam, Google Play или App Store, всю работу уже ведёт платформа — вам остаётся вызывать её API. Если игра живёт в браузере, потребность закроют собственные сервисы движка или управляемый игровой бэкенд. Собственный бэкенд — четвёртый маршрут, и для большинства инди-игр он худший из четырёх.
Картина знакома каждому инди-форуму — и она же всплыла в нашей последней читке сообщества: разработчик доделывает веб-демо, хочет табличку лучших результатов и со вздохом садится «учить бэкенд» ради фичи, которая должна стоить один вечер. Ниже — четыре маршрута, существующие прямо сейчас: что каждый даёт, во что обходится, где ломается и сколько волноваться о читерах. (Честная оговорка сразу: этот блог принадлежит Egmatic, no-code 2D-редактору в статусе pre-alpha; где лидерборды стоят в наших собственных планах — в конце статьи.)
Короткий ответ
| Где живёт игра | Что брать | Почему |
|---|---|---|
| Публикуетесь в Steam | Лидерборды Steam | Бесплатно, входят в Steamworks, у каждого игрока уже есть аккаунт |
| Google Play или App Store | Play Games Services или Game Center | Таблицу держит платформа, а интерфейс игрокам знаком по другим играм |
| Веб-билд на itch.io или своём сайте | Встроенные лидерборды GDevelop либо бэкенд с REST- или JS-API | Браузерной игре не у кого спросить рейтинг — очкам нужен HTTP-адрес |
| Одна игра, несколько площадок | Игровой бэкенд: Nakama, LootLocker, PlayFab | Общая учётная запись и одна таблица на всех сторах |
| Хочется разобраться в серверах | Самопис | Как учебный проект — отлично, как продуктовое решение — дорого |
Всю таблицу решает один вопрос: где ваши игроки уже вошли в аккаунт? Счёт имеет смысл ровно настолько, насколько можно доверять личности, которая за ним стоит. Игрок в Steam уже авторизован; у игрока на Android аккаунт Google в одном нажатии; аноним в браузере — никто, пока вы не дадите ему ник или вход. Выбирайте маршрут, которому уже принадлежат личности ваших игроков, — и львиная доля работы исчезает сама.
Что таблице рекордов действительно нужно
Полезно разложить фичу на четыре работы: каждый маршрут ниже — просто свой ответ на вопрос, кто их делает.
- Личность игрока. У каждого счёта есть владелец. Сторы закрывают вопрос готовым аккаунтом; веб-игре нужны ники, идентификаторы устройства или вход — и от этого выбора зависит, насколько серьёзно можно воспринимать рейтинг.
- Запись, которая переживает сессию. Когда забег окончен, число уходит с машины игрока туда, что живёт дольше вкладки. Это единственная часть, похожая на «бэкенд», — и на любом маршруте это один вызов API.
- Чтение с рангом. Экран меню запрашивает топ-50 и место самого игрока. Быстро сортировать миллионы строк — давно решённая задача, и решать её самому в пятницу вечером не нужно.
- Целостность. Очки, ушедшие с устройства игрока, можно подделать. Сторы дают защиту от подмены или запись только с сервера; бэкенды — серверные обработчики. Сколько этого нужно вашей игре — вопрос дизайна, он разобран ниже.
Заодно развеем миф: «без бэкенда» не значит «без серверов». Серверы есть во всех четырёх маршрутах. Вопрос в другом — чьи они и кого разбудят, когда они упадут.
Маршрут 1: стор уже всё сделал
Steam
Лидерборды Steam входят в Steamworks и бесплатны вместе с аккаунтом разработчика. Создаются в App Admin — либо игра заводит их на лету через FindOrCreateLeaderboard, так дешевле всего делать таблицу на каждый уровень. У каждой таблицы есть порядок сортировки (по возрастанию — забеги на время, по убыванию — хайскор), тип отображения (число, секунды, миллисекунды) и правило загрузки: keep-best, когда Steam сам хранит лучший результат игрока, или force-update.
Две детали стоят отдельного внимания. Первая: таблице можно присвоить флаг Trusted — тогда клиенты писать в неё не могут вовсе, и очки принимаются только через Web API SetLeaderboardScore с вашего сервера; если результат считается на серверной стороне, это самый чистый путь античита. Вторая: к записям крепится пользовательский контент — так в играх делают призраков повторов: побил рекорд — гоняйся с повтором, который его поставил. Для инди это механика удержания, притворившаяся технической мелочью.
Google Play Games Services
На Android лидерборды Play Games Services настраиваются в Play Console (Grow users → Play Games Services → Setup and management → Leaderboards), живут в статусе черновика, пока вы тестируете, и публикуются вместе с игрой. Два эксплуатационных факта важнее любых деталей API. Первый: сбросить прогресс из консоли можно, только пока таблица — черновик; после публикации за очистку берётся Management API — политику сбросов решайте до релиза, а не после первого балансного патча. Второй: в сервис встроена tamper protection, автоматически скрывающая подозрительные очки. Для новых лидербордов она включена по умолчанию, работает только на Android, вступает в силу до суток и задним числом не применяется. Документированный случай, когда её выключают, — игра выходит ещё и в вебе и делит таблицы между платформами.
Apple Game Center
На iOS и macOS таблицы хранит сам Game Center: GKLeaderboard — тип GameKit, с которым разговаривает ваш код, а настраиваются борды в App Store Connect. Игрок уже вошёл в Apple ID, таблицы друзей достаются бесплатно, и обслуживать нечего. Для первой игры на iOS это и есть весь ответ.
Общее ограничение всех трёх: это замкнутые миры. Очко из Steam не встретится с очком из Google Play в одной таблице. Если игра выходит на нескольких сторах и игроки должны соревноваться между всеми — нужен следующий маршрут.
Маршрут 2: игровой бэкенд-сервис
Управляемый игровой бэкенд — сервис, чей продукт и есть те четыре работы: личность, записи, чтение и целостность, с SDK, заточенными под игры. Для веб-билдов это ответ по умолчанию: itch.io раздаёт вашу HTML5-игру как набор статических файлов и серверной части не предлагает вовсе.
| Сервис | Что это | Про лидерборды | Из чего складывается цена |
|---|---|---|---|
| Nakama | Открытый игровой сервер под Apache-2.0; свой хостинг или облако | Операторы на таблицу: set, best, increment, decrement; сбросы по cron; одна запись на владельца; SDK для Unity, Unreal, Godot 3 и 4, JavaScript, Defold и других, плюс чистый REST | Самохостинг бесплатен, эксплуатация на вас |
| LootLocker | Облачный бэкенд для инди | Лидерборды плюс аккаунты; вход через Steam, Google, Apple, Epic, Xbox, PlayStation, Nintendo | Триал 30 дней с потолком 1 000 MAU; бесплатная некоммерческая лицензия; дальше $0,015 за дополнительного MAU |
| PlayFab | Игровая платформа Microsoft | Версионированные лидерборды: сброс подъёмом версии, события на конец версии | По метрикам использования |
Nakama заслуживает отдельного слова для двух аудиторий. Если для вас важна независимость от поставщика — это действительно открытый код: весь сервер под Apache-2.0, а операторы лидербордов (set, best, increment, decrement) и сбросы по cron — возможности первого класса, а не пристройка сбоку. Если важна честность очков — валидация живёт в серверном рантайме: счёт проверяется вашим кодом прежде, чем попасть в таблицу. LootLocker — противоположность по духу: он сделан для тех, кому аккаунты, лидерборды и внутриигровые покупки нужны сегодня, входы через консоли уже подключены, а некоммерческая лицензия делает его фактически бесплатным, пока игра не доросла до продаж.
Маршрут для no-code: движок уже умеет
Если вы собираете игру в GDevelop, ответ уже встроен в редактор. Лидерборды в GDevelop есть из коробки и управляются из дашборда игр: таблица создаётся там же, очки отправляются действием «Save connected player score» — или «Save player score» для анонимов с ником, — а показывается таблица готовым действием. Документация советует подключённых игроков: их аккаунты потом понесут будущие возможности вроде ачивок, и сервис рассчитан расти от маленьких игр вверх. Для no-code-разработчика вопрос закрыт целиком: ни сервера, ни REST-обвязки — одно действие.
У остальных no-code-движков встроенных таблиц нет, и тут честность важнее утешения. У Construct нет собственного лидерборда, но его события пишутся на JavaScript и умеют дергать любой REST API, так что маршрут 2 подходит напрямую. У Godot — фирменные клиенты Nakama под версии 3 и 4 или тот же REST. Везде работа выглядит одинаково: отправить число, забрать список, показать его игроку.
Сколько на самом деле стоит самопис
Лёгкий путь обманчив: одна таблица, один эндпоинт, insert и select, сорок строк на бесплатном тарифе Postgres. А потом выходит игра — и вместе с ней приезжает настоящий продукт:
- аутентификация: у очков должны быть владельцы, и один игрок не должен занимать весь топ-100;
- атомарные записи: двое, отправившие счёт в одну и ту же секунду, должны получить разные места;
- лимиты запросов — до того, как кто-нибудь обнаружит, что незащищённый эндпоинт принимает десять тысяч очков в минуту;
- модерация: в публичной таблице ники рано или поздно будут содержать слова, которые вы не выбирали;
- сбросы и сезоны: им нужен дизайн, а не просто
DELETE; - мониторинг, бэкапы и вопрос, что случится с очками, когда кончится бесплатный тариф или на минуту мигнёт регион базы.
Ничто из этого не сложно по отдельности; всё вместе — это внимание. Разумное правило такое: пишите сервер сами, когда сервер — часть игры, которую вы делаете; во всех остальных случаях берите маршрут 1 или 2. Экономия счёта за MAU, которого у вас ещё нет, — не причина становиться инженером эксплуатации.
Практикум: таблица рекордов за неделю
- Решите, где живут игроки. Сторовые сборки — маршрут 1; веб — маршрут 2 или встроенные возможности движка; одна игра на нескольких сторах — маршрут 2.
- Создавайте таблицу обдуманно. Название, порядок сортировки, правило загрузки, политика сбросов. В Google Play сброс после публикации перестаёт быть галочкой в консоли; в Nakama оператор (best или increment) после создания не меняется. Некоторые из этих решений — двери, открывающиеся только в одну сторону: перечитайте их дважды.
- Подключите ровно два вызова. Отправка — по концу забега; чтение — при открытии меню, топ и место игрока. Не синхронизируйте очки посреди забега: режимов отказа станет вдвое больше, а игрок не увидит ни одного нового.
- Погоняйте черновик на «грязном» устройстве. Отправьте счёт с чистой установки, от вернувшегося игрока и один заведомо абсурдный. Третий тест — единственный, который покажет, настоящая ли у вас защита.
- Проверьте, сработало ли. Лидерборд — фича удержания: если D1 и D7 не сдвинулись, таблица — украшение меню. Какие числа смотреть, разобрано в руководстве по аналитике для инди, а недельный цикл чтения отчётов — в материале о стратегии после запуска.
Читы: сколько внимания им платить
Каждое очко, ушедшее с устройства игрока, подделываемо: редакторы памяти и подменяющие прокси существуют столько же, сколько сами таблицы рекордов. Платформы об этом знают: tamper protection в Play Games прячет подозрительные результаты автоматически, Trusted в Steam переносит запись целиком на сервер, Nakama проверяет отправку в серверных обработчиках, которые вы контролируете. Дизайнерский вопрос — на какой ступени защиты живёт ваша игра:
- Первая ступень — друзья и джемы. Очки с клиента, без защиты. На кону ностальгия.
- Вторая — публичная таблица, которая вам дорога. Защиты платформы включены, запись через сервер там, где стор её даёт, плюс здравый потолок: максимальное очко, которое правила игры в принципе способны породить. Ловит ленивых читеров — а это большинство.
- Третья — на кону призы. Результат авторитетен только с сервера: очко считается на сервере из входных данных забега, или повтор проверяется до того, как попадёт в рейтинг. Настоящая работа; окупается, только когда есть что терять.
Большинство инди-игр принадлежит второй ступени и остаётся в ней навсегда. Гнаться за третьей без призового фонда — строить охрану для таблицы, в которую заглядывают четыре человека.
Частые ошибки
- Релиз до решения о сбросах. В Google Play сброс — роскошь черновика; после публикации галочка превращается в проект с Management API.
- Одна глобальная таблица в игре с прогрессией. Если верхнюю тысячу занимают игроки эндгейма, новичок узнаёт, что проиграл, раньше, чем начал. Таблицы по уровням (дёшево в Steam и Nakama) держат борьбу победимой.
- Порядок сортировки выбрали поздно. Смена направления пересобирает весь рейтинг вокруг другого смысла слова «лучше»; решайте до первого настоящего счёта — сами записи под новую сортировку не переедут.
- Доверять клиенту и тревожиться об этом постоянно. Выберите ступень защиты из раздела выше и перестаньте думать о ней. Промежуточное состояние — нервное и беззащитное — хуже обоих крайних.
- Сбросить молча. Сезон, который начинается с того, что игроки обнаруживают пропавшие очки, — рана на удержании. Сбросы объявляйте заранее; ещё лучше — сделайте их событием, которого ждут.
- Строить бэкенд раньше, чем у игры появились игроки. Таблица, в которой никто не соревнуется, — самая дешёвая инфраструктура, о которой вы будете жалеть. Сначала игра: на этом этапе количество игроков двигают руководство по первой мобильной игре и плейбук сообщества до релиза.
- Забыть про сохранения по соседству. Таблица рекордов без системы сохранений, которым игроки верят, зовёт соревноваться в игре, которая сама забывает игрока. В ожиданиях игроков обе фичи приезжают вместе.
Где здесь Egmatic
О стадии скажем прямо: Egmatic — no-code 2D-редактор и движок, построенный на ИИ, сейчас в pre-alpha. Статья про лидерборды вообще появилась на нашем блоге не случайно: в читках сообщества, которые мы проводим, лидерборды и сохранение прогресса для веб-демо — один из самых повторяющихся запросов, и звучит он обычно как смирение с неизбежной серверной работой. Этот спрос стоит в нашем роадмапе внутри слоя публикации — стороны редактора, отвечающей за выпуск игры, — потому что сервисы, живущие рядом с публикацией, — ровно то, что no-code-разработчик не должен собирать руками. Дату мы здесь не анонсируем: честность pre-alpha означает, что даты появляются, когда мы можем их сдержать.
Рамка, к которой мы строим, — та же, что и во всей статье: вы направляете игру, инструментарий исполняет обвязку, результат принадлежит вам. Если вы ждёте 2D-редактор, чей слой публикации включает лидерборды и облачные сохранения, — смотрите, как он обретает форму, в листе ожидания на egmatic.com.
Источники
- Документация Steamworks — Leaderboards: создание в App Admin или через
FindOrCreateLeaderboard, типы сортировки и отображения, keep-best и force-update, флаг Trusted и Web APISetLeaderboardScore, крепление пользовательского контента к записям - Android Developers — Play Games Services leaderboards: настройка в Play Console, сброс только для черновиков, методы Management API, поведение tamper protection (обновление июнь 2026)
- Apple Developer — GKLeaderboard: «A leaderboard for a game that Game Center stores»
- Heroic Labs — Nakama leaderboards: операторы set, best, increment, decrement, сбросы по cron, одна запись на владельца, список клиентских SDK; GitHub — heroiclabs/nakama, лицензия Apache-2.0
- LootLocker — Pricing: триал 30 дней с потолком 1 000 MAU, бесплатная некоммерческая лицензия, $0,015 за дополнительного MAU; документация — SDK для Unity, Unreal и Godot, входы через платформы
- GDevelop Wiki — Leaderboards: создание и управление из дашборда игр, очки подключённых и анонимных игроков
- Microsoft Learn — PlayFab leaderboards API: версионированные определения лидербордов и операции подъёма версии
Похожие статьи
MonoGame для инди: актуален ли фреймворк в 2026?
Да, MonoGame актуален в 2026 для инди, кому нужен бесплатный C#-фреймворк с чистыми портами. Stardew Valley и Celeste на семействе XNA.
Быстрое прототипирование: соберите игру за несколько часов
Прототип 2D-игры собирают за пару часов, а не за месяцы. Сузьте до одной механики и берите редактор с живым предпросмотром — без шага сборки.
GDevelop против Construct 3: какой редактор выбрать в 2026
GDevelop бесплатен и открыт (MIT); Construct 3 — подписка ($129,99/год Individual, $468,99/место Business). Цены, события, экспорт — сравнение за минуты.