Реалізація Rewarded Ads для мобільної гри
Rewarded реклама в ігровому контексті роботає по-іншому, ніж у звичайному застосунку. Тут есть ігрова економіка, ігрові стани, сесійний контекст. Неправильно вбудована rewarded — це не просто втрата доходу, це зіпсутий ігровой досвід.
Де конкретно вбудовувати в гру
Placement вибирається не довільно — потрібна точка, де у гравця есть реальна потреба, яку він готов «оплатити» переглядом:
Continue after fail — найбільш конвертуючий placement. Гравець щойно програв, витратив час, втратив прогрес. Пропозиція «Посмотрів рекламу — продовжиш з того ж місця» конвертується в 30–50% випадків у добре налагоджених грах. Технічно: показуємо після onGameOver, перед екраном результатів. Обмеження: 1–2 використання за спробу максимум, інакше trivializes складність.
Daily bonus multiplier — «Посмотрів рекламу — отримай x3 до щоденної награди». Висока конверсія, не порушує ігровой баланс, гравець не чує тиску.
Extra currency / chest unlock — пропозиція в головному меню або після рівня. Роботає, коли пропозиція конкретна: «+50 gems» краще, ніж «бонус».
Технічна реалізація на Unity
// Ініціалізація у GameManager
private RewardedAd rewardedAd;
public void LoadRewardedAd() {
var adUnitId = Application.platform == RuntimePlatform.Android
? "ca-app-pub-xxx/yyy" : "ca-app-pub-xxx/zzz";
RewardedAd.Load(adUnitId, new AdRequest(), (ad, error) => {
if (error != null) { Debug.LogWarning($"Rewarded load failed: {error}"); return; }
rewardedAd = ad;
RegisterRewardedAdEvents(rewardedAd);
});
}
private void RegisterRewardedAdEvents(RewardedAd ad) {
ad.OnAdFullScreenContentClosed += () => {
LoadRewardedAd(); // одразу починаємо завантажувати наступну
};
}
public void ShowRewardedAd(System.Action<int> onRewarded) {
if (rewardedAd == null || !rewardedAd.CanShowAd()) {
Debug.Log("Rewarded not ready");
return;
}
rewardedAd.Show(reward => {
onRewarded?.Invoke(reward.Amount);
});
}
IronSource (LevelPlay) на Unity має інший модель: IronSource.Agent.loadRewardedVideo() потрібно викликати заранее, а стан доступності — через IronSourceRewardedVideoEvents.onAdAvailableEvent. Кнопка «Посмотрить рекламу» повинна бути видима тільки коли IronSource.Agent.isRewardedVideoAvailable() повернув true.
Серверна верифікація (SSV) для ігрової валюти
Якщо rewarded дає твердую валюту (gems, crystals) — SSV обов'язковий. Без верифікації награди можна накрутити інструментами типу Frida за кілька хвилин: перехопити виклик та повторити скільки завгодно разів.
Схема: передаємо userId та унікальний nonce у customData при створенні запиту. AdMob/IronSource включають їх у SSV-callback на ваш backend з ECDSA-підписом. Сервер перевіряє підпис, перевіряє унікальність nonce (щоб один callback не пройшов двічі), видає валюту.
Реалізація на клієнті займає пів-дня, серверна частина — 1 день з тестуванням.
Обмеження показів
Кількість rewarded у добу потрібно обмежити на рівні сервера, а не тільки на клієнті. Клієнтські обмеження обходяться скиданням PlayerPrefs. Сервер повинен знати, скільки разів користувач вже отримав награду за сьогодні, та відхиляти перевищення.
Типові ліміти: 5–10 rewarded/день для currency, 1–2/день для continue. Занадто жорсткий ліміт убиває доход, занадто м'який — руйнує економіку.
Терміни: базова інтеграція з 2–3 placements та обмеженнями — 2 дні. З SSV та серверною логікою наград — 3 дні.







