Добавление видеорекламы с бонусами в приложение Unity

Audience Network позволяет монетизировать приложения для Android и iOS за счет рекламы Facebook. Видеореклама с бонусами — это полноэкранная видеореклама, за просмотр которой пользователи получают вознаграждение: виртуальную валюту, игровые предметы, эксклюзивный контент и другие преимущества. Сама реклама представляет собой короткое видео и содержит конечную карточку с призывом к действию. Пропустить такую рекламу нельзя. После воспроизведения видео до конца вы получаете обратный вызов, позволяющий отправить бонус пользователю.

Прежде чем продолжить, обязательно ознакомьтесь с руководствами по началу работы с Audience Network и Unity.

Создание видеорекламы с бонусами

Шаг 1. Инициализация видеорекламы с бонусами.

Шаг 2. Добавление событий обратного вызова.

Шаг 3. Загрузка объявления.

Шаг 4. Показ объявления.

Шаг 1. Инициализация видеорекламы с бонусами.

Первый шаг для показа видеорекламы с бонусами — создание объекта 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 для данного блока видеорекламы с бонусами.

Шаг 2. Добавление событий обратного вызова.

После этого можно добавить несколько обратных вызовов, чтобы подписаться на события жизненного цикла рекламы. Для отслеживания этих событий нужно зарегистрировать делегат для события, как показано в следующем примере:

...
// 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();
    }
});
...

Обратный вызов для уничтоженного действия рекламы в Unity для Android

Эта информация относится только к 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 

Шаг 3. Загрузка объявления.

После создания экземпляра RewardedVideoAd необходимо загрузить объявление. Для этого вызывается метод loadAd.

Инициализация загрузки объявления в примере выше:

...
this.rewardedVideoAd.LoadAd();
...

Шаг 4. Показ объявления.

Наконец, после загрузки объявления можно вызвать метод 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, обеспечивающее безопасность этого процесса. Наш сервер будет подтверждать каждый показ рекламы и каждый бонус, обращаясь к специальной конечной точке.

  1. SDK Audience Network запрашивает видеорекламу с бонусами, используя следующие параметры:
    • placementId — ID места размещения Audience Network;
    • RewardData — объект RewardData состоит из элемента UserId, который представляет ID пользователя, и элемента Currency, который представляет фактическую награду в игре.
  2. По завершении просмотра видео сервер Facebook передает эти значения в указанную вами конечную точку вместе с секретом приложения и уникальным ID транзакции.
  3. Получив эти данные, сервер подтверждает запрос и отправляет следующий ответ:
    • 200 response — запрос действителен, пользователь должен получить бонус;
    • Non 200 response — запрос недействителен, бонус не полагается.
  4. По окончании видео пользователь видит конечную карточку и срабатывает одно из следующих событий:
    • 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.