Введение в Google Mobile Ads Unity SDK
Что такое Google Mobile Ads Unity SDK и зачем он нужен?
Google Mobile Ads Unity SDK — это специализированный инструментарий, позволяющий разработчикам мобильных игр в среде Unity интегрировать рекламные решения от Google, прежде всего из сети AdMob. Основная его задача — предоставить функциональность для показа различных форматов рекламы, таких как баннеры, межстраничная реклама (интерстициалы) и реклама с вознаграждением, напрямую в игровом приложении.
Использование SDK необходимо для монетизации мобильных игр через рекламную модель. Оно обеспечивает взаимодействие игры с рекламными серверами Google для запроса, загрузки и показа рекламы, а также для отслеживания событий взаимодействия пользователя с рекламным контентом (клики, просмотры).
Преимущества использования Google Mobile Ads в Unity
Интеграция Google Mobile Ads через Unity SDK предлагает несколько ключевых преимуществ:
Глобальный охват: Доступ к обширной рекламной сети Google AdMob, обеспечивающей высокие показатели заполняемости (fill rate) и конкуренцию среди рекламодателей по всему миру.
Разнообразие форматов: Поддержка наиболее востребованных рекламных форматов, позволяющая гибко выбирать оптимальные места и моменты показа рекламы в игре.
Простота интеграции: SDK разработан специально для Unity, что значительно упрощает процесс добавления рекламных функций по сравнению с нативной разработкой под каждую платформу.
Поддержка медиации: Возможность интеграции других рекламных сетей через медиацию AdMob для максимизации дохода.
Регулярные обновления: Поддержка актуальных требований платформ (Android/iOS) и рекламных политик Google.
Скачивание и импорт Google Mobile Ads Unity SDK
Поиск и загрузка последней версии SDK
Самый надежный способ получить последнюю версию Google Mobile Ads Unity SDK — это обратиться к официальной документации Google Developers. SDK распространяется в виде файла пакета Unity (.unitypackage). Вы можете найти ссылку для скачивания на странице документации AdMob для Unity.
Как правило, рекомендуется использовать последнюю стабильную версию SDK для получения доступа к новейшим функциям и исправлениям ошибок.
Импорт SDK в проект Unity
После загрузки файла .unitypackage импорт в проект Unity выполняется стандартным способом:
Откройте ваш проект в Unity.
В меню Unity выберите Assets -> Import Package -> Custom Package....
Выберите скачанный файл .unitypackage Google Mobile Ads SDK.
В открывшемся окне Import Unity Package убедитесь, что выбраны все необходимые компоненты. Обычно требуется импортировать все.
Нажмите Import.
После импорта Unity может запросить перезагрузку проекта. Подтвердите перезагрузку.
Решение проблем с импортом SDK (если возникнут)
Наиболее частые проблемы при импорте связаны с конфликтами зависимостей, особенно если в проекте уже используются другие сторонние SDK. Google Mobile Ads Unity SDK использует External Dependency Manager for Unity (EDM4U, ранее известный как Play Services Resolver) для управления зависимостями Android и iOS.
Если возникают ошибки после импорта, проверьте меню Assets -> External Dependency Manager. Убедитесь, что все резолверы отработали корректно (Android Resolver, iOS Resolver). Возможно, потребуется выполнить принудительное разрешение зависимостей (Resolve). EDM4U помогает автоматически разрешать версии библиотек, используемых различными SDK в проекте, минимизируя конфликты.
Настройка Google Mobile Ads в Unity
Инициализация Mobile Ads SDK
Перед загрузкой или показом рекламы необходимо инициализировать Mobile Ads SDK. Это делается один раз, желательно при запуске приложения. Рекомендуется использовать метод MobileAds.Initialize() с колбэком для проверки статуса инициализации.
using GoogleMobileAds.Api;
using UnityEngine;
public class AdManager : MonoBehaviour
{
public static AdManager Instance; // Singleton pattern for easy access
private void Awake()
{
// Ensure only one instance exists
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
} else if (Instance != this)
{
Destroy(gameObject);
}
}
void Start()
{
Debug.Log("Initializing Google Mobile Ads SDK...");
// Initialize the Google Mobile Ads SDK.
// This should be called once, preferably on app launch.
MobileAds.Initialize(initStatus =>
{
// Log initialization status for debugging
var statusMap = initStatus.getAdapterStatusMap();
foreach (var adapterStatus in statusMap)
{
Debug.LogFormat("Adapter name: {0}, Description: {1}, Latency: {2}, State: {3}",
adapterStatus.Key,
adapterStatus.Value.Description,
adapterStatus.Value.Latency,
adapterStatus.Value.InitializationState);
}
// Check if the SDK initialized successfully
if (MobileAds.Initialized) // This property is available in newer SDK versions
{
Debug.Log("Google Mobile Ads SDK initialized successfully.");
// Now you can safely load ads
// LoadBannerAd(); // Example: call your ad loading functions here
} else
{
Debug.LogError("Google Mobile Ads SDK failed to initialize.");
}
});
}
// Other ad loading/showing methods will go here
// ...
}Создайте пустой GameObject в сцене, назовите его, например, AdManager и прикрепите к нему этот скрипт. Убедитесь, что этот GameObject присутствует в первой сцене вашего приложения или существует в течение всего его жизненного цикла.
Настройка ID рекламных блоков (Ad Unit IDs)
Для загрузки рекламы из вашей учетной записи AdMob необходимо использовать уникальные идентификаторы рекламных блоков (Ad Unit IDs). Эти ID создаются в интерфейсе AdMob для каждого типа рекламы (баннер, интерстициал, вознаграждение) и каждой платформы (Android, iOS).
Важно: Во время разработки и тестирования всегда используйте специальные тестовые ID, предоставляемые Google. Использование реальных ID в тестовом режиме может привести к блокировке аккаунта AdMob.
Тестовые ID:
Android:
App ID: ca-app-pub-3940256099942544~3347511713
Banner: ca-app-pub-3940256099942544/6300978111
Interstitial: ca-app-pub-3940256099942544/1033173712
Rewarded: ca-app-pub-3940256099942544/5224354917
iOS:
App ID: ca-app-pub-3940256099942544~1458002511
Banner: ca-app-pub-3940256099942544/2934735716
Interstitial: ca-app-pub-3940256099942544/4411468910
Rewarded: ca-app-pub-3940256099942544/1712485313
В вашем коде вы будете использовать эти строки ID для запроса рекламы.
Добавление метаданных в манифест Android (если требуется)
Для корректной работы SDK, начиная с определенной версии, необходимо добавить метаданные с вашим AdMob App ID в файл AndroidManifest.xml. External Dependency Manager for Unity (EDM4U) автоматически добавляет необходимый тег <meta-data> в сгенерированный AndroidManifest при сборке проекта, если вы указали App ID в настройках GoogleMobileAds в Unity (Assets -> Google Mobile Ads -> Settings). Проверьте эти настройки.
Если вы не используете EDM4U или возникли проблемы, вам может потребоваться вручную модифицировать сгенерированный файл AndroidManifest.xml или настроить его в Unity.
Настройка plist для iOS (если требуется)
Аналогично Android, для iOS требуется добавить ключ GADApplicationIdentifier с вашим AdMob App ID в файл Info.plist. EDM4U также автоматически обрабатывает эту настройку при сборке iOS проекта, если App ID указан в настройках GoogleMobileAds в Unity. Убедитесь, что эта настройка выполнена правильно.
В редких случаях, если EDM4U не используется или не работает должным образом, может потребоваться ручная модификация файла Info.plist.
Реализация рекламы в Unity
Каждый тип рекламы имеет свой собственный класс и набор методов для загрузки и показа. Важно правильно обрабатывать жизненный цикл рекламного объекта (загрузка, показ, закрытие) и подписываться на соответствующие события.
Реализация баннерной рекламы
Баннерная реклама отображается в определенной части экрана (обычно в верхней или нижней). Объект BannerView создается с указанием рекламного блока, размера и позиции.
using GoogleMobileAds.Api;
using UnityEngine;
public class BannerAdExample : MonoBehaviour
{
private BannerView bannerView;
private string bannerAdUnitId = "ca-app-pub-3940256099942544/6300978111"; // Test Ad Unit ID
public void LoadBannerAd()
{
// Clean up banner before loading a new one
if (bannerView != null)
{
bannerView.Destroy();
}
// Create a 320x50 banner at the top of the screen.
bannerView = new BannerView(bannerAdUnitId, AdSize.Banner, AdPosition.Top);
// Register for events
ListenForBannerEvents();
// Load the banner.
bannerView.LoadAd(CreateAdRequest());
Debug.Log("Banner ad requested...");
}
// Example method to create a simple ad request
private AdRequest CreateAdRequest()
{
return new AdRequest.Builder().Build();
}
// Method to destroy the banner when not needed (e.g., scene change)
public void DestroyBannerAd()
{
if (bannerView != null)
{
bannerView.Destroy();
bannerView = null;
Debug.Log("Banner ad destroyed.");
}
}
// Subscribe to BannerView events
private void ListenForBannerEvents()
{
// Called when an ad request has successfully loaded.
bannerView.OnBannerAdLoaded += () =>
{
Debug.Log("Banner ad loaded.");
};
// Called when an ad request failed to load.
bannerView.OnBannerAdFailedToLoad += (LoadAdError error) =>
{
Debug.LogErrorFormat("Banner ad failed to load with error : {0}", error.GetMessage());
};
// Called when an ad is clicked.
bannerView.OnAdClicked += () =>
{
Debug.Log("Banner ad clicked.");
};
// Called when the user leaves the app (e.g., to go to the browser).
bannerView.OnAdImpressionRecorded += () =>
{
Debug.Log("Banner ad recorded an impression.");
};
// Called when the ad is closed.
bannerView.OnAdClosed += () =>
{
Debug.Log("Banner ad closed.");
};
}
// Remember to destroy the banner when the object is destroyed
private void OnDestroy()
{
DestroyBannerAd();
}
}После загрузки баннер автоматически отображается на экране в указанной позиции.
Реализация межстраничной рекламы (Interstitial)
Межстраничная реклама — это полноэкранная реклама, которая обычно показывается между уровнями игры, при паузе или в других естественных точках перехода. Объект InterstitialAd должен быть загружен заранее и показан, когда это необходимо.
using GoogleMobileAds.Api;
using UnityEngine;
public class InterstitialAdExample : MonoBehaviour
{
private InterstitialAd interstitialAd;
private string interstitialAdUnitId = "ca-app-pub-3940256099942544/1033173712"; // Test Ad Unit ID
public void LoadInterstitialAd()
{
// Clean up previous ad instance
if (interstitialAd != null)
{
interstitialAd.Destroy();
interstitialAd = null; // Set to null after destroying
}
// Create a new interstitial ad instance
interstitialAd = new InterstitialAd(interstitialAdUnitId);
// Register for events
ListenForInterstitialEvents();
// Load the interstitial ad.
interstitialAd.LoadAd(CreateAdRequest());
Debug.Log("Interstitial ad requested...");
}
// Example method to create a simple ad request
private AdRequest CreateAdRequest()
{
return new AdRequest.Builder().Build();
}
public void ShowInterstitialAd()
{
if (interstitialAd != null && interstitialAd.IsLoaded())
{
interstitialAd.Show();
Debug.Log("Interstitial ad shown.");
} else
{
Debug.LogWarning("Interstitial ad is not ready yet.");
// Optionally try loading again or handle the situation
LoadInterstitialAd(); // Example: try reloading if not ready
}
}
// Subscribe to InterstitialAd events
private void ListenForInterstitialEvents()
{
// Called when an ad request has successfully loaded.
interstitialAd.OnAdLoaded += () =>
{
Debug.Log("Interstitial ad loaded.");
};
// Called when an ad request failed to load.
interstitialAd.OnAdFailedToLoad += (LoadAdError error) =>
{
Debug.LogErrorFormat("Interstitial ad failed to load with error : {0}", error.GetMessage());
};
// Called when the ad is shown.
interstitialAd.OnAdOpening += () =>
{
Debug.Log("Interstitial ad opened.");
};
// Called when the ad is closed.
interstitialAd.OnAdClosed += () =>
{
Debug.Log("Interstitial ad closed.");
// Load the next interstitial ad as soon as the current one is closed
LoadInterstitialAd();
};
// Called when the ad is clicked.
interstitialAd.OnAdClicked += () =>
{
Debug.Log("Interstitial ad clicked.");
};
// Called when the user leaves the app (e.g., to go to the browser).
interstitialAd.OnAdImpressionRecorded += () =>
{
Debug.Log("Interstitial ad recorded an impression.");
};
}
// Remember to destroy the ad object when the MonoBehaviour is destroyed
private void OnDestroy()
{
if (interstitialAd != null)
{
interstitialAd.Destroy();
}
}
}После показа межстраничного объявления рекомендуется сразу же запросить следующее, чтобы оно было готово к моменту, когда потребуется снова его показать.
Реализация рекламы с вознаграждением (Rewarded Ads)
Реклама с вознаграждением позволяет пользователю просмотреть видео или взаимодействовать с объявлением в обмен на игровую награду (виртуальная валюта, жизни и т.д.). Объект RewardedAd также должен быть загружен заранее.
using GoogleMobileAds.Api;
using UnityEngine;
public class RewardedAdExample : MonoBehaviour
{
private RewardedAd rewardedAd;
private string rewardedAdUnitId = "ca-app-pub-3940256099942544/5224354917"; // Test Ad Unit ID
public void LoadRewardedAd()
{
// Clean up previous ad instance
if (rewardedAd != null)
{
rewardedAd.Destroy();
rewardedAd = null; // Set to null after destroying
}
// Create a new rewarded ad instance
rewardedAd = new RewardedAd(rewardedAdUnitId);
// Register for events
ListenForRewardedEvents();
// Load the rewarded ad.
rewardedAd.LoadAd(CreateAdRequest());
Debug.Log("Rewarded ad requested...");
}
// Example method to create a simple ad request
private AdRequest CreateAdRequest()
{
return new AdRequest.Builder().Build();
}
public void ShowRewardedAd()
{
if (rewardedAd != null && rewardedAd.IsLoaded())
{
rewardedAd.Show();
Debug.Log("Rewarded ad shown.");
} else
{
Debug.LogWarning("Rewarded ad is not ready yet.");
// Optionally try loading again or handle the situation
LoadRewardedAd(); // Example: try reloading if not ready
}
}
// Subscribe to RewardedAd events
private void ListenForRewardedEvents()
{
// Called when an ad request has successfully loaded.
rewardedAd.OnAdLoaded += () =>
{
Debug.Log("Rewarded ad loaded.");
};
// Called when an ad request failed to load.
rewardedAd.OnAdFailedToLoad += (LoadAdError error) =>
{
Debug.LogErrorFormat("Rewarded ad failed to load with error : {0}", error.GetMessage());
};
// Called when the ad is shown.
rewardedAd.OnAdOpening += () =>
{
Debug.Log("Rewarded ad opened.");
};
// Called when the user should be rewarded for watching the ad.
// THIS is where you grant the reward to the user.
rewardedAd.OnUserEarnedReward += (Reward reward) =>
{
Debug.LogFormat("User earned reward: type {0}, amount {1}", reward.Type, reward.Amount);
// Implement your game logic to grant the reward here
GrantPlayerReward((int)reward.Amount, reward.Type); // Example function call
};
// Called when the ad is closed.
rewardedAd.OnAdClosed += () =>
{
Debug.Log("Rewarded ad closed.");
// Load the next rewarded ad as soon as the current one is closed
LoadRewardedAd();
};
// Called when the ad is clicked.
rewardedAd.OnAdClicked += () =>
{
Debug.Log("Rewarded ad clicked.");
};
// Called when the user leaves the app (e.g., to go to the browser).
rewardedAd.OnAdImpressionRecorded += () =>
{
Debug.Log("Rewarded ad recorded an impression.");
};
}
// Example function to grant a reward in your game
private void GrantPlayerReward(int amount, string type)
{
Debug.Log($"Granting {amount} of type {type} to player.");
// Add coins, items, etc. to the player's inventory/state
// For example: GameManager.Instance.AddCoins(amount);
}
// Remember to destroy the ad object when the MonoBehaviour is destroyed
private void OnDestroy()
{
if (rewardedAd != null)
{
rewardedAd.Destroy();
}
}
}Ключевой момент для рекламы с вознаграждением — это событие OnUserEarnedReward, которое вызывается только после того, как пользователь полностью просмотрел объявление и заслужил награду. Ваша игровая логика выдачи награды должна находиться именно в обработчике этого события.
Обработка событий рекламы (загрузка, показ, клик, закрытие)
Корректная обработка событий, предоставляемых SDK, критически важна для стабильной работы рекламы и правильного пользовательского опыта. Подписывайтесь на события, чтобы:
Узнать, когда реклама успешно загружена (OnAdLoaded). Это позволяет определить, готова ли реклама к показу.
Обработать ошибки загрузки (OnAdFailedToLoad). Это полезно для отладки и реализации логики повторных попыток загрузки.
Реагировать на открытие/показ рекламы (OnAdOpening). Например, можно поставить игру на паузу.
Реагировать на закрытие рекламы (OnAdClosed). После закрытия интерстициальной или вознаграждаемой рекламы, как правило, следует сразу же запросить загрузку следующего объявления.
Обрабатывать клики (OnAdClicked) или показы (OnAdImpressionRecorded) для аналитики, если требуется дополнительное отслеживание на стороне игры.
Выдавать награду (OnUserEarnedReward) для соответствующего формата рекламы.
Как показано в примерах кода выше, подписка на события выполняется с использованием оператора +=.
Тестирование и публикация
Использование тестовых рекламных блоков
Как было упомянуто ранее, обязательно используйте тестовые рекламные блоки на этапах разработки и тестирования. Это предотвратит недействительные запросы и показы с вашего аккаунта AdMob, что может привести к его блокировке.
Тестовые ID гарантируют, что реклама будет загружаться, но без совершения реальных показов и начислений.
Тестирование рекламы на реальных устройствах
Хотя тестирование в редакторе Unity полезно, финальное тестирование интеграции рекламы обязательно должно проводиться на реальных физических устройствах (телефонах и планшетах) под управлением целевых операционных систем (Android и iOS). Только так вы можете убедиться, что:
Реклама корректно загружается и отображается.
События рекламы срабатывают правильно (например, выдача награды).
Размеры и положение баннеров адекватны для разных экранов.
Полноэкранная реклама не вызывает проблем с производительностью или пользовательским интерфейсом.
На разных версиях ОС и моделях устройств нет специфических багов.
Вы можете добавить свои тестовые устройства в AdMob, чтобы получать реальную (но помеченную как тестовая) рекламу. Это делается через настройки тестовых устройств в AdMob и передачу хэша устройства в запросе рекламы через AdRequest.Builder().AddTestDevice(). EDM4U может автоматически добавлять тестовые устройства, если вы настроили это в параметрах SDK в Unity.
Подготовка к публикации приложения с рекламой
Перед сборкой финальной версии приложения для публикации в магазинах (Google Play Store, Apple App Store) необходимо:
Заменить тестовые ID на реальные: Убедитесь, что во всем коде и настройках GoogleMobileAds в Unity вместо тестовых Ad Unit ID используются ваши реальные ID из учетной записи AdMob.
Настроить EDM4U: Проверьте, что EDM4U настроен для автоматического добавления App ID в манифесты Android и plist iOS при сборке.
Проверить политики: Ознакомьтесь с политиками программы AdMob и Google Play/App Store, касающимися размещения рекламы. Убедитесь, что ваша реализация соответствует этим требованиям (например, реклама не перекрывает важные элементы интерфейса, не появляется неожиданно, ясно помечена).
Тестирование финальной сборки: Выполните последнее тестирование на устройствах с реальными рекламными блоками (убедившись, что тестовые устройства правильно настроены в AdMob, чтобы не нарушать политики).
Рекомендации по оптимизации рекламы
После публикации и начала получения трафика рассмотрите следующие моменты для оптимизации дохода:
Медиация: Настройте медиацию в AdMob, чтобы добавить другие рекламные сети. Это увеличит конкуренцию за показы и повысит eCPM.
Размещение и частота: Анализируйте, какие рекламные места и какая частота показа приносят наибольший доход без ущерба для пользовательского опыта. Слишком агрессивная реклама может отпугнуть пользователей.
Форматы рекламы: Экспериментируйте с разными форматами. Реклама с вознаграждением часто приносит более высокий доход и лояльность пользователей.
Аналитика: Регулярно анализируйте отчеты в AdMob для отслеживания ключевых метрик (показы, клики, eCPM, доход).
Тестирование (A/B): Если возможно, проводите A/B тестирование различных стратегий показа рекламы (например, другое местоположение баннера, другая частота интерстициалов) на разных сегментах пользователей.
Тщательная интеграция и последующая оптимизация рекламной стратегии являются ключевыми факторами для успешной монетизации мобильной игры через Google Mobile Ads.