Audience Network позволяет монетизировать приложения для Android и iOS за счет рекламы Facebook. Видеореклама с бонусами — это полноэкранная видеореклама, за просмотр которой пользователи получают вознаграждение: виртуальную валюту, игровые предметы, эксклюзивный контент и другие преимущества. Сама реклама представляет собой короткое видео и содержит конечную карточку с призывом к действию. Пропустить такую рекламу нельзя. После воспроизведения видео до конца вы получаете обратный вызов, позволяющий отправить бонус пользователю.
Прежде чем продолжить, обязательно ознакомьтесь с руководствами по началу работы с Audience Network и Unity.
Первый шаг для показа видеорекламы с бонусами — создание объекта RewardedVideoAd
в скрипте C#, вложенном в GameObject
.
... using AudienceNetwork; ... public class RewardedVideoAdTest : MonoBehaviour { public void LoadRewardedVideo() { // Create the rewarded video unit with a placement ID (generate your own on the Facebook app settings). // Use different ID for each ad placement in your app. this.rewardedVideoAd = new RewardedVideoAd("YOUR_PLACEMENT_ID"); this.rewardedVideoAd.Register(this.gameObject); // Set delegates to get notified on changes or when the user interacts with the ad. this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() { Debug.Log("RewardedVideo ad loaded."); this.isLoaded = true; }); this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) { Debug.Log("RewardedVideo ad failed to load with error: " + error); }); this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() { Debug.Log("RewardedVideo ad logged impression."); }); this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() { Debug.Log("RewardedVideo ad clicked."); }); this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); // Initiate the request to load the ad. this.rewardedVideoAd.LoadAd(); } }
В конструкторе объекта RewardedVideoAd
используются следующие параметры:
placementId
— ID места размещения Audience Network для данного блока видеорекламы с бонусами.После этого можно добавить несколько обратных вызовов, чтобы подписаться на события жизненного цикла рекламы. Для отслеживания этих событий нужно зарегистрировать делегат для события, как показано в следующем примере:
... // Set delegates to get notified on changes or when the user interacts with the ad. this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() { Debug.Log("RewardedVideo ad loaded."); this.isLoaded = true; }); this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) { Debug.Log("RewardedVideo ad failed to load with error: " + error); }); this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() { Debug.Log("RewardedVideo ad logged impression."); }); this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() { Debug.Log("RewardedVideo ad clicked."); }); this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); ...
Эта информация относится только к Android.
В настоящее время в играх Unity для Android для основного объекта Unity Activity
поддерживается только режим запуска (launchMode
) singleTask
. См. документацию Unity по манифестам Android и документацию Android по действиям.
Поскольку мы используем Activity
для показа рекламных объявлений Interstitial
и Rewarded Video
, действие рекламы может быть уничтожено, не будучи надлежащим образом закрыто, когда пользователь переводит приложение в фоновый режим, а затем перезапускает его с помощью значка, а не средства переключения между приложениями. Проверить, было ли объявление закрыто пользователем, можно с помощью приведенных ниже обратных вызовов.
Для вставок:
this.interstitialAd.interstitialAdDidClose = (delegate() { Debug.Log("Interstitial ad did close."); this.didClose = true; if (this.interstitialAd != null) { this.interstitialAd.Dispose(); } }); #if UNITY_ANDROID /* * Только для Android. * Этот обратный вызов срабатывает только в том случае, если действие со вставкой * было уничтожено, а не закрыто надлежащим образом. Это может произойти, если * приложение с launchMode:singleTask (например, игра Unity) переходит * в фоновый режим, а затем перезапускается касанием значка. */ this.interstitialAd.interstitialAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Interstitial activity destroyed without being closed first."); Debug.Log("Game should resume."); } }); #endif
Для видео с бонусами:
this.rewardedVideoAd.rewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); this.didClose = true; if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); #if UNITY_ANDROID /* * Только для Android. * Этот обратный вызов срабатывает только в том случае, если действие с видео с бонусами * было уничтожено, а не закрыто надлежащим образом. Это может произойти, если * приложение с launchMode:singleTask (например, игра Unity) переходит * в фоновый режим, а затем перезапускается касанием значка. */ this.rewardedVideoAd.rewardedVideoAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Rewarded video activity destroyed without being closed first."); Debug.Log("Game should resume. User should not get a reward."); } }); #endif
После создания экземпляра RewardedVideoAd
необходимо загрузить объявление. Для этого вызывается метод loadAd
.
Инициализация загрузки объявления в примере выше:
... this.rewardedVideoAd.LoadAd(); ...
Наконец, после загрузки объявления можно вызвать метод Show
, чтобы отобразить видеорекламу с бонусами на экране. Например, можно создать функцию для ShowRewardedVideo
и вызвать ее, когда потребуется показать эту рекламу:
public void ShowRewardedVideo() { if (this.isLoaded) { this.rewardedVideoAd.Show(); this.isLoaded = false; } else { Debug.Log("Ad not loaded. Click load to request an ad."); } }
Это необязательно. Подтверждение бонуса на стороне сервера не является необходимым условием для показа видеорекламы с бонусами. Вы можете реализовать эту функцию в целях повышения уровня безопасности за счет дополнительной проверки на собственном сервере. Для ее использования предоставьте конечную точку своего издателя представителю Facebook.
Если вы управляете бонусами пользователей на стороне сервера, то можете использовать решение Facebook, обеспечивающее безопасность этого процесса. Наш сервер будет подтверждать каждый показ рекламы и каждый бонус, обращаясь к специальной конечной точке.
placementId
— ID места размещения Audience Network;RewardData
— объект RewardData
состоит из элемента UserId
, который представляет ID пользователя, и элемента Currency
, который представляет фактическую награду в игре.200 response
— запрос действителен, пользователь должен получить бонус;Non 200 response
— запрос недействителен, бонус не полагается.RewardedVideoAdDidSucceed
— только если на шаге 3 получен код состояния200;RewardedVideoAdDidFail
— если на шаге 3 получен другой код состояния.Пример URL, который будет отправлен в конечную точку вашего издателя сервером Facebook: https://www.vasha_konechnaya_tochka.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID
Следующая схема проиллюстрирует весь процесс:
После инициализации объекта видео с бонусами до показа рекламы вам нужно передать в нее ID пользователя и размер бонуса. Это можно сделать с помощью класса RewardData
. Оба значения являются строковыми. Пример:
public class RewardedVideoAdTest : MonoBehaviour { ... private bool isLoaded; private RewardedVideoAd rewardedVideoAd; public void LoadRewardedVideo() //Set the rewarded ad data RewardData rewardData = new RewardData(); rewardData.UserId = "USER_ID"; rewardData.Currency = "REWARD_ID"; // Instantiate RewardedVideoAd with reward data this.rewardedVideoAd = new RewardedVideoAd("YOUR_PLACEMENT_ID", rewardData); this.rewardedVideoAd.Register(this.gameObject); // Set delegates to get notified on changes or when the user interacts with the ad. this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() { Debug.Log("RewardedVideo ad loaded."); this.isLoaded = true; }); this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) { Debug.Log("RewardedVideo ad failed to load with error: " + error); }); this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() { Debug.Log("RewardedVideo ad logged impression."); }); this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() { Debug.Log("RewardedVideo ad clicked."); }); this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); // For S2S validation you need to register the following two callback this.rewardedVideoAd.RewardedVideoAdDidSucceed = (delegate() { Debug.Log("Rewarded video ad validated by server"); }); this.rewardedVideoAd.RewardedVideoAdDidFail = (delegate() { Debug.Log("Rewarded video ad not validated, or no response from server"); }); this.rewardedVideoAd.loadAd(); } ... }
Чтобы уведомить приложение о подтверждении бонуса, в дополнение к другим обратным вызовам для RewardedVideoAd
необходимо реализовать обратные вызовы RewardedVideoAdDidSucceed
и RewardedVideoAdDidFail
.
После загрузки рекламы ее можно отобразить с использованием метода Show
как обычный объект RewardedVideoAd
.
Обратите внимание: обратные вызовы, связанные с подтверждением бонуса на сервере, могут происходить после того, как пользователь закрыл конечную карточку. Не следует освобождать память, занимаемую объектом видео с бонусами, пока не будет выполнен один из таких обратных вызовов.
Следуйте инструкциям, чтобы интегрировать в свое приложение Unity разные форматы рекламы.
Когда вы будете готовы показывать рекламу в своем приложении, отправьте его на проверку. Перед этим убедитесь в том, что приложение соответствует политикам Audience Network и нормам сообщества Facebook.