После запуска мобильной игры через месяц активность падает — отсутствие здоровой конкуренции убивает retention. Простой глобальный рейтинг не мотивирует: игроки не видят друзей и не чувствуют прогресса. Мы сталкивались с этим не раз: в 20+ проектах внедрение сегментированных лидербордов подняло возвращаемость на 30–40%. Для mid-core и competitive игр это обязательный элемент: игроки хотят соревноваться с друзьями, отслеживать прогресс по неделям и получать награды за топ-10. Ниже — как спроектировать систему, которая будет работать под нагрузкой до 10 000 RPS и блокировать читеров.
Почему серверная валидация очков критична?
Клиентский score без валидации — прямой путь к читерству через Memory Editor или Cheat Engine. Блокируем до 99% таких попыток. Лучший метод — серверный расчёт: клиент отправляет события, а Cloud Script вычисляет финальные очки.
| Метод | Описание | Надёжность |
|---|---|---|
| Серверный расчёт | Клиент отправляет события, сервер считает score | Высокая |
| Плауз-чек | Проверка на аномалии (max возможный score) | Средняя |
| Реплей-чек | Повторное исполнение действий на сервере | Очень высокая |
Комбинируем серверный расчёт с плауз-чеком: Cloud Script получает события уровня и вычисляет финальный score. Если результат аномален (например, 50 000 при максимуме 10 000), отклоняем. Экономия на инфраструктуре античита — существенная.
В PlayFab создаётся Cloud Script с функцией validateScore, которая принимает массив событий и возвращает итоговый score. Важно настроить таймаут выполнения (по умолчанию 10 секунд) и ограничения по памяти. Для высоконагруженных игр используем очередь для асинхронной обработки.
Какой бэкенд выбрать для лидербордов?
| Решение | Когда подходит | Ограничения |
|---|---|---|
| Google Play Games Leaderboards | Простой глобальный рейтинг, Android | Только Android, ограниченные типы |
| Game Center Leaderboards | iOS, simple global/friends | Только iOS |
| PlayFab Leaderboards | Кросс-платформа, гибко | Платный при высокой нагрузке |
| Firebase Realtime DB / Firestore | Гибко, real-time | Нужна кастомная индексация |
| Custom backend | Полный контроль | Разработка и поддержка |
Для большинства мобильных игр PlayFab — оптимальный выбор: не нужно писать серверную логику, есть встроенный anti-cheat. PlayFab Leaderboards API (документация) разворачивается в 10 раз быстрее кастомного сервера. Поддерживает сегментированные рейтинги, автоматический сброс статистики по расписанию и интеграцию с платформенными аккаунтами. Используем его в 80% проектов — снижает затраты на серверную инфраструктуру на 50%.
Пример записи и получения очков
public void SubmitScore(int score, string leaderboardName = "global_score")
{
PlayFabClientAPI.UpdatePlayerStatistics(
new UpdatePlayerStatisticsRequest
{
Statistics = new List<StatisticUpdate>
{
new StatisticUpdate
{
StatisticName = leaderboardName,
Value = score
}
}
},
result => Debug.Log("Score submitted"),
error => Debug.LogError(error.GenerateErrorReport())
);
}
public void GetLeaderboard(string leaderboardName, Action<List<LeaderboardEntry>> callback)
{
PlayFabClientAPI.GetLeaderboard(
new GetLeaderboardRequest
{
StatisticName = leaderboardName,
StartPosition = 0,
MaxResultsCount = 100,
ProfileConstraints = new PlayerProfileViewConstraints
{
ShowDisplayName = true,
ShowAvatarUrl = true
}
},
result =>
{
var entries = result.Leaderboard.Select(entry => new LeaderboardEntry
{
PlayFabId = entry.PlayFabId,
DisplayName = entry.DisplayName,
Score = entry.StatValue,
Rank = entry.Position + 1,
AvatarUrl = entry.Profile?.AvatarUrl
}).ToList();
callback?.Invoke(entries);
},
error => Debug.LogError(error.GenerateErrorReport())
);
}
public void GetPlayerRank(string leaderboardName, Action<int> callback)
{
PlayFabClientAPI.GetLeaderboardAroundPlayer(
new GetLeaderboardAroundPlayerRequest
{
StatisticName = leaderboardName,
MaxResultsCount = 1
},
result =>
{
var playerEntry = result.Leaderboard.FirstOrDefault(e => e.PlayFabId == PlayFabSettings.staticPlayer.PlayFabId);
callback?.Invoke(playerEntry?.Position + 1 ?? 0);
},
error => { }
);
}
Как защитить лидерборд от читеров?
Помимо серверного расчёта, используем мониторинг аномальных паттернов: если игрок отправляет score в нереальное время (менее 1 секунды на уровень) или с нехарактерной частотой — блокируем аккаунт. Дополнительно анализируем историю действий через Big Data. Это снижает количество читеров до единичных случаев.
Как мы реализуем лидерборды поэтапно?
- Аналитика и проектирование — определяем типы рейтингов, правила сброса, целевую нагрузку (до 10 000 RPS).
- Настройка PlayFab — создаём статистику, конфигурируем античит и резервное копирование.
- Реализация серверной логики — Cloud Script для валидации очков (серверный расчёт или плауз-чек).
- Интеграция с платформами — Google Play Games / Game Center для cross-platform видимости.
- UI-компоненты — список с аватарами, закреплённая позиция игрока, фильтры (global/friends).
- Тестирование и нагрузка — проверка при 10 000+ одновременных запросов.
- Деплой и мониторинг — автообновление и алерты при аномалиях.
Для сегментированных лидербордов используем версионирование статистики или отдельные имена для каждого уровня. Еженедельный сброс настраивается в PlayFab Game Manager → Statistics → Reset interval. С push-уведомлениями (APNs/FCM) игроки узнают о сбросе и новых наградах — retention дополнительно растёт.
Google Play Games и Game Center
Для платформенных лидербордов, которые видны в интерфейсе магазина:
PlayGamesPlatform.Instance.ReportScore(
score,
GPGSIds.leaderboard_global_score,
success => Debug.Log($"Score reported: {success}")
);
PlayGamesPlatform.Instance.LoadScores(
GPGSIds.leaderboard_global_score,
LeaderboardStart.TopScores,
100,
LeaderboardCollection.Public,
LeaderboardTimeSpan.AllTime,
data => { /* data.Scores */ }
);
Платформенные лидерборды хороши для discovery — игрок видит рейтинг прямо в Google Play без запуска игры. Но ограниченный контроль над дизайном и нет cross-platform. Deep linking (Universal Links / App Links) позволяет отправлять прямой пригласительный клик на конкретную позицию.
UI-паттерны
Хороший лидерборд отображает:
- Позицию и очки текущего игрока всегда видимы (закреплены вверху или внизу)
- Игроки вокруг текущего (±5 позиций) — GetLeaderboardAroundPlayer
- Топ-3 выделены визуально
- Аватары (из PlayFab Profile или платформенного аккаунта)
Пагинация или бесконечный скролл с GetLeaderboard(startPosition: offset) — для доступа к нижним строкам.
Что входит в работу
- Настройка PlayFab Statistics с нужными именами и правилами сброса
- Реализация submit, get top, get around player
- Лидерборд среди друзей
- Серверная валидация очков (Cloud Script)
- Платформенная интеграция (Google Play Games / Game Center)
- UI: список, позиция игрока, аватары, фильтры (global/friends/weekly)
Сроки и стоимость
Глобальный лидерборд на PlayFab занимает 2–4 дня. Полная система с сегментацией, серверной валидацией и UI — от 1 до 2 недель. Стоимость рассчитывается индивидуально, экономия времени достигает 10 раз по сравнению с кастомным сервером. При нагрузке до 50 000 одновременных игроков время отклика остаётся менее 50 мс. Закажите консультацию инженера, и мы подберём оптимальную архитектуру под вашу нагрузку. Свяжитесь с нами для расчёта стоимости вашего проекта — мы гарантируем стабильную работу под высокой нагрузкой и даём 30 дней бесплатной поддержки после запуска.







