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







