Після запуску мобільної гри через місяць активність падає — відсутність здорової конкуренції вбиває 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 днів безкоштовної підтримки після запуску.







