Реализация Interstitial Ads для мобильной игры
Interstitial в играх — форматс наибольшим риском негативного UX. Показать его в неподходящий момент значит получить 1-звёздочный отзыв «реклама прямо во время игры». Показывать редко и в правильных точках — значит иметь стабильный источник дохода без ущерба для retention.
Правильные точки показа в игре
Только в переходных состояниях. Между уровнями, на экране результата, при возврате в главное меню — да. Во время геймплея, при нажатии паузы, при старте уровня — никогда. Google Play и App Store отклоняют игры с interstitial, показывающимся «неожиданно» — это буквально пункт в правилах.
В Unity удобно управлять показом через конечный автомат состояний игры:
public enum GameState { MainMenu, LoadingLevel, Playing, LevelComplete, GameOver }
private void OnStateChanged(GameState newState) {
switch (newState) {
case GameState.LevelComplete:
case GameState.GameOver:
TryShowInterstitial();
break;
}
}
Cooldown и частота
Минимальный cooldown между показами — 30–60 секунд. На практике для казуальных игр хорошо работает «раз в 2–3 уровня» или «раз в 3 минуты игрового времени», что наступит раньше:
private float lastInterstitialTime = -999f;
private int levelsSinceLastAd = 0;
private const float COOLDOWN = 120f;
private const int LEVELS_BETWEEN_ADS = 3;
public bool CanShowInterstitial() {
return Time.time - lastInterstitialTime > COOLDOWN
&& levelsSinceLastAd >= LEVELS_BETWEEN_ADS;
}
public void OnLevelCompleted() {
levelsSinceLastAd++;
if (CanShowInterstitial()) {
ShowInterstitial();
lastInterstitialTime = Time.time;
levelsSinceLastAd = 0;
}
}
Cooldown храним в PlayerPrefs — при убийстве приложения и перезапуске не должно быть «накопленного» показа сразу при старте.
Предзагрузка и обработка состояний
Interstitial загружается заранее — при инициализации или сразу после предыдущего показа. Задержка при запросе в момент показа разрушает UX. Схема: OnSceneLoaded → LoadInterstitial().
Если реклама не загрузилась (нет сети, нет fill) — игра продолжается без рекламы, пользователь не видит никаких ошибок. Не блокируем прогресс отсутствием рекламы.
Не показываем платящим игрокам. Если у пользователя есть активная подписка или he купил «отключение рекламы» — interstitial не должен появляться. Проверка через флаг в профиле пользователя, сохранённый локально и синхронизированный с сервером.
A/B-тестирование параметров
AdMob поддерживает встроенное A/B-тестирование для параметров медиации. Но для игровой логики (cooldown, количество уровней между показами) удобнее Firebase Remote Config:
var cooldown = RemoteConfig.GetValue("interstitial_cooldown_seconds").DoubleValue;
var levelsBetween = RemoteConfig.GetValue("levels_between_interstitials").LongValue;
Типичный эксперимент: группа A показывает каждые 2 уровня, группа B — каждые 4. Метрика успеха — не только eCPM, но и D1/D7 retention. Агрессивная частота легко поднимает краткосрочный доход и убивает retention.
Сроки реализации — 1–2 дня с cooldown-логикой, правильными placements и интеграцией Remote Config.







