Реализация 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 дня.







