Разработка мобильных игр и приложений для платформ iOS и Android часто предполагает интеграцию рекламных решений для монетизации. Google Mobile Ads SDK является одним из наиболее популярных инструментов для показа различных форматов рекламы, таких как баннеры, межстраничные объявления и реклама с вознаграждением.
Данное руководство предназначено для разработчиков, уже имеющих опыт работы с Unity и базовое понимание принципов мобильной разработки. Мы сосредоточимся на создании простого демонстрационного скрипта, который покажет, как инициализировать SDK, загружать и отображать основные типы рекламных блоков Google Mobile Ads в проекте Unity.
Введение в Google Mobile Ads в Unity
Что такое Google Mobile Ads и зачем он нужен в Unity играх
Google Mobile Ads (ранее AdMob) – это платформа Google для мобильной рекламы, позволяющая издателям монетизировать свои приложения и игры. Интеграция Google Mobile Ads в Unity позволяет показывать рекламу пользователям прямо в игровом процессе или между сценами, генерируя доход.
Основные преимущества использования Google Mobile Ads в Unity включают:
Доступ к широкой сети рекламодателей через AdMob.
Поддержка разнообразных форматов рекламы, подходящих для разных сценариев использования в игре.
Возможности медиации с другими рекламными сетями для оптимизации дохода.
Инструменты аналитики для отслеживания производительности рекламных блоков.
Подготовка среды разработки: Unity и Google Mobile Ads SDK
Перед началом работы необходимо убедиться, что у вас установлена актуальная версия Unity. Рекомендуется использовать версии, официально поддерживаемые Google Mobile Ads Unity Plugin. Также потребуется доступ к аккаунту AdMob для создания рекламных блоков, хотя для демонстрации мы будем использовать тестовые идентификаторы.
Google Mobile Ads SDK для Unity предоставляется в виде плагина (.unitypackage), который необходимо импортировать в ваш проект. Он обеспечивает мост между C# кодом в Unity и нативными SDK для iOS и Android.
Импорт Google Mobile Ads Unity Plugin
Получить плагин можно из официального репозитория Google Mobile Ads Unity Plugin на GitHub или через Unity Asset Store. После скачивания плагина в формате .unitypackage, выполните следующие шаги для импорта в ваш проект Unity:
Откройте ваш проект Unity.
Перейдите в меню Assets -> Import Package -> Custom Package....
Выберите скачанный .unitypackage файл плагина.
В появившемся окне Importing Package убедитесь, что выбраны все необходимые компоненты (обычно это стандартный набор, включающий библиотеки и примеры). Нажмите Import.
После импорта Unity может запросить перезапуск или предложить настроить специфические для Google Mobile Ads параметры через меню Assets -> Google Mobile Ads. На этом этапе важно следовать инструкциям плагина.
Настройка Google Mobile Ads в Unity
Импорт Mobile Ads SDK
Этот шаг, по сути, совпадает с импортом плагина, описанным выше. Сам плагин содержит все необходимые библиотеки (SDK) для работы на целевых платформах. После успешного импорта плагина, SDK становится доступен для использования в вашем проекте.
Инициализация Mobile Ads SDK
Инициализация SDK – это первый и обязательный шаг перед загрузкой и показом любой рекламы. Инициализация должна произойти один раз, как правило, при старте приложения.
Выполняется это асинхронно. Рекомендуется дождаться завершения инициализации, прежде чем пытаться загружать рекламу.
Пример инициализации:
using UnityEngine;
using GoogleMobileAds.Api;
public class AdManager : MonoBehaviour
{
// Идентификатор вашего тестового приложения AdMob.
// Для Android: ca-app-pub-3940256099942544~3347511713
// Для iOS: ca-app-pub-3940256099942544~1458002511
private string _appUnitId = "ca-app-pub-3940256099942544~3347511713"; // Используем тестовый ID для Android
public void Start()
{
// Инициализация Google Mobile Ads SDK.
// Это асинхронная операция, которую следует выполнить один раз при запуске приложения.
MobileAds.Initialize(initStatus =>
{
// Получение информации о статусе инициализации по каждой адаптерной сети.
var map = initStatus.getAdapterStatusMap();
// Пример обработки статуса: просто выводим в лог статус для всех адаптеров.
foreach (var adapterStatusPair in map)
{
string adapterClassName = adapterStatusPair.Key;
var adapterStatus = adapterStatusPair.Value;
Debug.LogFormat("Adapter name: {0}, State: {1}, Description: {2}",
adapterClassName,
adapterStatus.InitializationState,
adapterStatus.Description);
}
// SDK успешно инициализирован.
Debug.Log("Google Mobile Ads SDK успешно инициализирован.");
// Теперь можно безопасно загружать рекламу.
// Пример: LoadBannerAd();
});
}
// Другие методы для загрузки и показа рекламы будут добавлены здесь...
}
Настройка идентификаторов приложений и рекламных блоков
В рабочем приложении вы будете использовать реальные идентификаторы приложения (App ID) и рекламных блоков (Ad Unit ID), полученные в вашем аккаунте AdMob. App ID уникален для вашего приложения, а Ad Unit ID – для конкретного рекламного блока (баннер, межстраничное, с вознаграждением) внутри этого приложения.
Для демонстрации и тестирования крайне важно использовать тестовые идентификаторы, предоставляемые Google. Использование реальных идентификаторов в процессе разработки и тестирования может привести к блокировке вашего аккаунта AdMob. Тестовые идентификаторы гарантируют, что вы не будете показывать реальную рекламу и не повлияете на статистику или доход.
Создание тестовых рекламных блоков для демонстрации
Google предоставляет стандартные тестовые Ad Unit ID для каждого формата рекламы. Эти ID всегда возвращают тестовую рекламу и не требуют настройки в AdMob. Вот некоторые из них для Android (для iOS используются другие, но по тому же принципу):
Баннер: ca-app-pub-3940256099942544/6300978111
Межстраничное: ca-app-pub-3940256099942544/1033173712
С вознаграждением: ca-app-pub-3940256099942544/5224354917
Используйте эти идентификаторы в вашем демонстрационном скрипте для тестирования различных форматов рекламы.
Создание демонстрационного скрипта Google Mobile Ads
Теперь создадим скрипт C# в Unity, который будет управлять загрузкой и показом рекламы.
Создание нового скрипта C# в Unity
В окне Project Unity щелкните правой кнопкой мыши в папке Assets (или в подпапке по вашему выбору).
Выберите Create -> C# Script.
Назовите скрипт, например, AdDisplayManager. Убедитесь, что имя файла скрипта совпадает с именем класса внутри.
Откройте созданный скрипт в вашем редакторе кода (например, Visual Studio).
Реализация показа баннерной рекламы (Banner Ads)
Баннеры – это рекламные блоки, которые занимают часть экрана приложения, обычно в верхней или нижней части. Они остаются на экране, пока пользователь взаимодействует с приложением.
Для реализации баннера необходимо:
Создать объект BannerView.
Загрузить запрос на рекламу (AdRequest).
Загрузить рекламу в BannerView.
(Опционально) Подписаться на события баннера.
using UnityEngine;
using GoogleMobileAds.Api;
// ... (остальная часть класса AdDisplayManager)
public class AdDisplayManager : MonoBehaviour
{
private BannerView _bannerView;
private string _bannerAdUnitId = "ca-app-pub-3940256099942544/6300978111"; // Тестовый ID баннера
public void LoadBannerAd()
{
// Если баннер уже создан, уничтожаем его перед созданием нового.
if (_bannerView != null)
{
_bannerView.Destroy();
}
// Создание нового экземпляра BannerView.
// Размер баннера: AdSize.Banner (320x50) - стандартный размер.
// Позиция: AdPosition.Bottom - размещение внизу экрана.
_bannerView = new BannerView(_bannerAdUnitId, AdSize.Banner, AdPosition.Bottom);
// Подписка на события баннера. Это позволяет отслеживать жизненный цикл рекламы
// и реагировать на действия пользователя (например, клики, закрытие).
// Эти события могут быть важны для аналитики, подобно отслеживанию конверсий в веб-маркетинге.
ListenToBannerEvents();
// Создание запроса на рекламу.
AdRequest request = new AdRequest.Builder().Build();
// Загрузка баннера.
Debug.Log("Loading banner ad.");
_bannerView.LoadAd(request);
}
private void ListenToBannerEvents()
{
// Вызывается при успешной загрузке баннера.
_bannerView.OnBannerAdLoaded += () =>
{
Debug.Log("Баннер успешно загружен.");
};
// Вызывается при ошибке загрузки баннера.
_bannerView.OnBannerAdLoadFailed += (LoadAdError error) =>
{
Debug.LogErrorFormat("Ошибка загрузки баннера: {0}", error.GetMessage());
};
// Вызывается при открытии полноэкранного окна после клика по баннеру.
_bannerView.OnAdFullScreenContentOpened += () =>
{
Debug.Log("Полноэкранный контент баннера открыт.");
};
// Вызывается при закрытии полноэкранного окна.
_bannerView.OnAdFullScreenContentClosed += () =>
{
Debug.Log("Полноэкранный контент баннера закрыт.");
};
// Вызывается при изменении формата или размера баннера.
_bannerView.OnAdImpressionRecorded += () =>
{
// Это событие можно использовать для регистрации показа рекламы, подобно учету показов
// в системах веб-аналитики для расчета метрик вроде CTR.
Debug.Log("Impression recorded for banner ad.");
};
}
// Метод для скрытия баннера.
public void HideBannerAd()
{
if (_bannerView != null)
{
_bannerView.Hide();
Debug.Log("Баннер скрыт.");
}
}
// Метод для показа баннера после скрытия.
public void ShowBannerAd()
{
if (_bannerView != null)
{
_bannerView.Show();
Debug.Log("Баннер показан.");
}
}
// Метод для уничтожения баннера, освобождения ресурсов.
public void DestroyBannerAd()
{
if (_bannerView != null)
{
_bannerView.Destroy();
_bannerView = null;
Debug.Log("Баннер уничтожен.");
}
}
// ... (методы для других форматов рекламы)
}
Реализация показа межстраничной рекламы (Interstitial Ads)
Межстраничные объявления – это полноэкранные рекламные блоки, которые показываются в естественных точках перехода в приложении, например, между уровнями игры. Они предназначены для демонстрации пользователю на короткое время и должны быть легко закрываемы.
Для реализации межстраничного объявления необходимо:
Загрузить объявление (InterstitialAd.Load).
Подписаться на события объявления.
Показать объявление, когда оно загружено и готово (interstitialAd.Show()).
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
// ... (остальная часть класса AdDisplayManager)
public class AdDisplayManager : MonoBehaviour
{
private InterstitialAd _interstitialAd;
private string _interstitialAdUnitId = "ca-app-pub-3940256099942544/1033173712"; // Тестовый ID межстраничного объявления
///
/// Загружает межстраничное объявление.
/// Загрузку следует выполнять заранее, до момента, когда объявление потребуется показать.
///
public void LoadInterstitialAd()
{
// Очищаем предыдущее объявление, если оно существует.
if (_interstitialAd != null)
{
_interstitialAd.Destroy();
_interstitialAd = null;
}
Debug.Log("Attempting to load interstitial ad.");
// Создание запроса на рекламу.
var adRequest = new AdRequest.Builder().Build();
// Асинхронная загрузка межстраничного объявления.
InterstitialAd.Load(_interstitialAdUnitId, adRequest,
(InterstitialAd ad, LoadAdError error) =>
{
// Если возникла ошибка при загрузке.
if (error != null || ad == null)
{
Debug.LogErrorFormat("Interstitial ad failed to load with error : {0}",
error != null ? error.GetMessage() : "Unknown Error");
return;
}
Debug.Log("Interstitial ad loaded successfully.");
_interstitialAd = ad;
// Подписка на события загруженного объявления.
// Отслеживание этих событий позволяет контролировать поток игры
// в зависимости от взаимодействия пользователя с рекламой.
ListenToInterstitialEvents(ad);
});
}
///
/// Показывает загруженное межстраничное объявление.
/// Следует вызывать только после успешной загрузки объявления.
///
public void ShowInterstitialAd()
{
if (_interstitialAd != null && _interstitialAd.CanShowAd())
{
Debug.Log("Showing interstitial ad.");
_interstitialAd.Show();
}
else
{
// Если объявление не готово, возможно, его нужно загрузить заново.
Debug.LogError("Interstitial ad is not ready yet or already shown.");
// Опционально: вызвать LoadInterstitialAd() здесь или ранее.
}
}
private void ListenToInterstitialEvents(InterstitialAd ad)
{
// Вызывается, когда объявление открывает полноэкранный контент.
ad.OnAdFullScreenContentOpened += () =>
{
// Здесь можно, например, поставить игру на паузу.
Debug.Log("Межстраничное объявление открыто.");
};
// Вызывается при сбое показа объявления.
ad.OnAdFullScreenContentFailedToShow += (AdError error) =>
{
Debug.LogErrorFormat("Ошибка показа межстраничного объявления: {0}", error.GetMessage());
// Уничтожаем объявление после сбоя, чтобы избежать повторного использования.
ad.Destroy();
_interstitialAd = null; // Сброс ссылки, чтобы можно было загрузить новое.
};
// Вызывается, когда объявление закрывает полноэкранный контент.
ad.OnAdFullScreenContentClosed += () =>
{
// Здесь можно, например, возобновить игру или загрузить новое объявление.
// После показа объявление становится недействительным и должно быть уничтожено.
Debug.Log("Межстраничное объявление закрыто.");
ad.Destroy();
_interstitialAd = null; // Сброс ссылки.
// Рекомендуется загрузить новое объявление сразу после закрытия предыдущего
// для поддержания готовности (готовности к показу при следующем вызове ShowInterstitialAd).
LoadInterstitialAd();
};
// Вызывается при записи показа объявления (аналогично Impression).
ad.OnAdImpressionRecorded += () =>
{
// Фиксация показа важна для аналитики монетизации.
Debug.Log("Impression recorded for interstitial ad.");
};
// Вызывается при клике по объявлению.
ad.OnAdClicked += () =>
{
// Клик по объявлению может быть зарегистрирован как целевое действие
// в системах аналитики, подобно отслеживанию кликов по рекламным баннерам на сайте.
Debug.Log("Межстраничное объявление было кликнуто.");
};
}
// ... (методы для других форматов рекламы)
}Реализация показа рекламы с вознаграждением (Rewarded Ads)
Реклама с вознаграждением – это полноэкранные рекламные блоки, которые пользователи могут просмотреть в обмен на вознаграждение внутри приложения (например, виртуальную валюту, дополнительную жизнь и т.д.).
Для реализации рекламы с вознаграждением необходимо:
Загрузить объявление (RewardedAd.Load).
Подписаться на события объявления, включая событие получения вознаграждения.
Показать объявление, когда оно загружено и готово (rewardedAd.Show).
Реализовать логику выдачи вознаграждения пользователю.
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
// ... (остальная часть класса AdDisplayManager)
public class AdDisplayManager : MonoBehaviour
{
private RewardedAd _rewardedAd;
private string _rewardedAdUnitId = "ca-app-pub-3940256099942544/5224354917"; // Тестовый ID рекламы с вознаграждением
///
/// Загружает рекламу с вознаграждением.
/// Как и межстраничные объявления, рекомендуется загружать заранее.
///
public void LoadRewardedAd()
{
// Очищаем предыдущее объявление, если оно существует.
if (_rewardedAd != null)
{
_rewardedAd.Destroy();
_rewardedAd = null;
}
Debug.Log("Attempting to load rewarded ad.");
// Создание запроса на рекламу.
var adRequest = new AdRequest.Builder().Build();
// Асинхронная загрузка рекламы с вознаграждением.
RewardedAd.Load(_rewardedAdUnitId, adRequest,
(RewardedAd ad, LoadAdError error) =>
{
// Если возникла ошибка при загрузке.
if (error != null || ad == null)
{
Debug.LogErrorFormat("Rewarded ad failed to load with error : {0}",
error != null ? error.GetMessage() : "Unknown Error");
return;
}
Debug.Log("Rewarded ad loaded successfully.");
_rewardedAd = ad;
// Подписка на события загруженного объявления.
ListenToRewardedEvents(ad);
});
}
///
/// Показывает загруженную рекламу с вознаграждением.
/// Следует вызывать только после успешной загрузки объявления.
///
public void ShowRewardedAd()
{
if (_rewardedAd != null && _rewardedAd.CanShowAd())
{
// Подписка на событие получения вознаграждения перед показом.
// Это событие критически важно для выдачи вознаграждения пользователю.
_rewardedAd.Show((RewardItem rewardItem) =>
{
// Пользователь успешно просмотрел рекламу и получил вознаграждение.
// Здесь должна быть ваша игровая логика выдачи вознаграждения.
// RewardItem содержит тип и количество вознаграждения, определенные в AdMob.
Debug.LogFormat("User rewarded with type {0}, amount {1}.",
rewardItem.Type, rewardItem.Amount);
// Пример: увеличение количества виртуальной валюты пользователя.
GrantRewardToUser((int)rewardItem.Amount); // Приводим к int, если количество целочисленное
});
}
else
{
Debug.LogError("Rewarded ad is not ready yet or already shown.");
// Опционально: вызвать LoadRewardedAd() здесь или ранее.
}
}
///
/// Пример функции для выдачи вознаграждения пользователю.
/// Реальная логика зависит от вашей игры (например, обновление UI, сохранение данных).
///
private void GrantRewardToUser(int amount)
{
// Здесь реализуйте логику выдачи вознаграждения.
// Например, добавьте amount к текущему счету монет игрока.
Debug.Log($"Выдано вознаграждение пользователю: {amount}");
// GameManager.Instance.AddCoins(amount);
}
private void ListenToRewardedEvents(RewardedAd ad)
{
// Вызывается, когда объявление открывает полноэкранный контент.
ad.OnAdFullScreenContentOpened += () =>
{
Debug.Log("Реклама с вознаграждением открыта.");
};
// Вызывается при сбое показа объявления.
ad.OnAdFullScreenContentFailedToShow += (AdError error) =>
{
Debug.LogErrorFormat("Ошибка показа рекламы с вознаграждением: {0}", error.GetMessage());
ad.Destroy();
_rewardedAd = null;
};
// Вызывается, когда объявление закрывает полноэкранный контент.
ad.OnAdFullScreenContentClosed += () =>
{
// Важно! Вознаграждение выдается в событии Show, а не здесь.
Debug.Log("Реклама с вознаграждением закрыта.");
ad.Destroy();
_rewardedAd = null;
// Рекомендуется загрузить новое объявление сразу после закрытия предыдущего.
LoadRewardedAd();
};
// Вызывается при записи показа объявления (аналогично Impression).
ad.OnAdImpressionRecorded += () =>
{
Debug.Log("Impression recorded for rewarded ad.");
};
// Вызывается при клике по объявлению.
ad.OnAdClicked += () =>
{
Debug.Log("Реклама с вознаграждением была кликнута.");
};
}
}
Интеграция и тестирование демонстрационного скрипта
Теперь, когда у нас есть скрипт с логикой загрузки и показа рекламы, его необходимо интегрировать в Unity-сцену и протестировать.
Создание игровых объектов и привязка скрипта
Откройте сцену Unity, в которой вы хотите тестировать рекламу.
Создайте пустой GameObject в иерархии сцены (правой кнопкой мыши -> Create Empty). Назовите его, например, AdManagerObject.
Перетащите скрипт AdDisplayManager.cs с панели Project на созданный AdManagerObject в иерархии.
Настройка кнопок и триггеров для показа рекламы
Для удобства демонстрации создадим кнопки в UI, которые будут вызывать методы показа рекламы из нашего скрипта:
Создайте UI Canvas в сцене (GameObject -> UI -> Canvas).
Внутри Canvas создайте несколько кнопок (GameObject -> UI -> Button - TextMeshPro или Button - Legacy). Назовите их Show Banner, Show Interstitial, Show Rewarded.
Для каждой кнопки в компоненте Button (Script) найдите секцию On Click().
Нажмите знак +, чтобы добавить обработчик.
Перетащите AdManagerObject из иерархии в слот объекта в обработчике.
В выпадающем списке выберите AdDisplayManager и затем соответствующий публичный метод: ShowBannerAd() для кнопки баннера, ShowInterstitialAd() для межстраничной, ShowRewardedAd() для рекламы с вознаграждением.
Убедитесь, что вы также вызываете методы загрузки (LoadBannerAd, LoadInterstitialAd, LoadRewardedAd) в подходящий момент, например, при старте сцены или после инициализации SDK, чтобы реклама была готова к показу при нажатии кнопки.
Запуск и тестирование демонстрационного скрипта на эмуляторе/устройстве
Тестирование рекламы Google Mobile Ads надежно работает только на реальных устройствах или официальных эмуляторах Android/симуляторах iOS. Тестирование в редакторе Unity не показывает реальную рекламу, хотя вы можете увидеть сообщения в консоли.
Убедитесь, что ваше устройство подключено и настроено для разработки.
В Unity перейдите в File -> Build Settings.
Выберите платформу Android или iOS и нажмите Switch Platform.
Настройте Player Settings (Player Settings...) – пакетное имя (Bundle Identifier), настройки ориентации и др.
Нажмите Build And Run.
На устройстве вы увидите ваше приложение с кнопками. Нажмите кнопки, чтобы вызвать загрузку и показ тестовой рекламы. Вы должны увидеть тестовые баннеры, полноэкранные объявления и рекламу с вознаграждением. Убедитесь, что логи в консоли (можно использовать Logcat для Android) соответствуют ожидаемому поведению (загрузка, показ, события).
Обработка ошибок и отладка
В процессе тестирования могут возникать ошибки. Важно отслеживать их:
Следите за логами: Сообщения в консоли Unity и системных логах (Logcat для Android, Console для iOS) предоставляют информацию об ошибках загрузки или показа.
Проверьте идентификаторы: Убедитесь, что используете правильные тестовые ID для соответствующей платформы и формата.
Статус инициализации: Проверьте, успешно ли инициализировался SDK перед попыткой загрузки рекламы.
Состояние сети: Нестабильное или отсутствующее интернет-соединение может быть причиной ошибок загрузки.
Версии SDK/плагина: Убедитесь, что используете совместимые версии Unity и Google Mobile Ads Unity Plugin.
Используйте отладочные сообщения (Debug.Log) в своем коде, чтобы проследить поток выполнения и убедиться, что методы вызываются в правильном порядке.
Заключение
Создание демонстрационного скрипта Google Mobile Ads в Unity является важным шагом для понимания процесса интеграции и тестирования различных форматов рекламы. Мы рассмотрели базовые шаги по подготовке, настройке SDK и реализации кода для баннеров, межстраничных объявлений и рекламы с вознаграждением с использованием тестовых идентификаторов.
Рекомендации по использованию Google Mobile Ads в Unity
Загружайте рекламу заранее: Не загружайте объявление непосредственно перед показом, так как это может вызвать задержки. Загружайте его заранее, как только предыдущее было показано или уничтожено.
Используйте события: Подписывайтесь на события жизненного цикла рекламы для более точного контроля над игровым процессом и сбора аналитики. Например, пауза/возобновление игры при показе/закрытии полноэкранного объявления.
Тщательно выбирайте моменты показа: Размещайте рекламу таким образом, чтобы она не прерывала пользовательский опыт негативно. Межстраничные объявления хороши при переходах, вознагражденная реклама должна быть опциональной и приносить ценность игроку.
Тестируйте на реальных устройствах: Всегда проверяйте поведение рекламы на целевых устройствах.
Дальнейшее развитие и оптимизация рекламной стратегии
После того как базовая интеграция выполнена, можно переходить к оптимизации. Это включает:
Медиацию: Добавление других рекламных сетей для увеличения конкуренции за рекламные места и повышения дохода (eCPM).
Сегментацию пользователей: Адаптация рекламной стратегии в зависимости от поведения пользователей (например, показ менее навязчивой рекламы платящим пользователям).
A/B тестирование: Экспериментирование с форматами, местами размещения и частотой показа рекламы для выявления наиболее эффективных комбинаций.
Аналитика: Глубокий анализ показателей доходности, просмотров и кликов в AdMob и вашей собственной системе аналитики.
Полезные ресурсы и ссылки
Для более глубокого изучения и решения специфических задач рекомендуется обращаться к официальной документации Google Mobile Ads для Unity. Она содержит актуальную информацию о всех возможностях SDK, руководства по интеграции медиации и расширенным настройкам.