Añadir anuncios que incluyen vídeos con premio en una aplicación de Unity

Audience Network te permite monetizar tus aplicaciones para Android e iOS con anuncios de Facebook. Los anuncios que incluyen vídeos con premio son una experiencia a pantalla completa en la que los usuarios tienen la opción de ver un anuncio con vídeo a cambio de recibir una recompensa, como divisa virtual, artículos en la aplicación, contenido exclusivo, etc. La experiencia publicitaria es un vídeo corto y una imagen final con una llamada a la acción. Una vez visualizado el vídeo completo, recibirás una devolución de llamada que te concederá el premio sugerido.

Asegúrate de haber completado las guías Primeros pasos de Audience Network y Primeros pasos de Unity antes de continuar.

Pasos para los anuncios que incluyen vídeos con premio

Paso 1: inicializar los anuncios que incluyen vídeos con premio

Paso 2: añadir eventos de devolución de llamada

Paso 3: cargar un anuncio

Paso 4: mostrar el anuncio

Paso 1: inicializar los anuncios que incluyen vídeos con premio

El primer paso para mostrar un anuncio que incluya un vídeo con premio consiste en crear un objeto RewardedVideoAd en un script de C# adjunto a un 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();
    }
}

El constructor para un RewardedVideoAd tiene los parámetros siguientes:

  • placementId: el identificador de ubicación de Audience Network para este anuncio que incluye vídeo con premio.

Paso 2: añadir eventos de devolución de llamada

A continuación, puedes implementar algunas devoluciones de llamada para suscribirse en los eventos del ciclo de vida del anuncio. Para escuchar estos eventos, registra un delegado para el evento, tal y como se muestra a continuación en el ejemplo:

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

Devolución de llamada para la actividad de anuncios destruida en Android de Unity

Este contenido solo es pertinente para Android.

Actualmente, los juegos de Unity para Android solo admiten que el elemento Activity principal de Unity tenga launchMode de singleTask. Consulta el documento de Unity sobre el manifiesto de Android y el documento de Android sobre activity.

Dado que usamos Activity para mostrar anuncios Interstitial y Rewarded Video, la actividad de anuncios se podría destruir sin cerrarse correctamente cuando un usuario deja una aplicación en segundo plano y, luego, la vuelve a iniciar mediante el icono, en lugar de usar el conmutador de aplicaciones. Puedes usar las devoluciones de llamada siguientes para comprobar si el usuario cerró el anuncio:

Para los anuncios intersticiales:

this.interstitialAd.interstitialAdDidClose = (delegate() { Debug.Log("Interstitial ad did close."); this.didClose = true; if (this.interstitialAd != null) { this.interstitialAd.Dispose(); } }); #if UNITY_ANDROID /* * Only relevant to Android. * This callback will only be triggered if the Interstitial activity has * been destroyed without being properly closed. This can happen if an * app with launchMode:singleTask (such as a Unity game) goes to * background and is then relaunched by tapping the icon. */ this.interstitialAd.interstitialAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Interstitial activity destroyed without being closed first."); Debug.Log("Game should resume."); } }); #endif 

Para los vídeos con premio:

this.rewardedVideoAd.rewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); this.didClose = true; if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); #if UNITY_ANDROID /* * Only relevant to Android. * This callback will only be triggered if the Rewarded Video activity * has been destroyed without being properly closed. This can happen if * an app with launchMode:singleTask (such as a Unity game) goes to * background and is then relaunched by tapping the icon. */ 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 

Paso 3: cargar un anuncio

Una vez que se haya creado una instancia de RewardedVideoAd, el siguiente paso es cargar un anuncio. Para ello, debe llamarse al método loadAd.

En el ejemplo anterior, la carga del anuncio se inicia de la siguiente manera:

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

Paso 4: mostrar el anuncio

Finalmente, una vez que se carga el anuncio, puedes llamar al método Show para representar el anuncio que incluye vídeo con premio en la pantalla. Por ejemplo, puedes crear una función para ShowRewardedVideo y llamarla cuando se deba mostrar el anuncio:

public void ShowRewardedVideo()
{
    if (this.isLoaded) {
        this.rewardedVideoAd.Show();
        this.isLoaded = false;
    } else {
        Debug.Log("Ad not loaded. Click load to request an ad.");
    }
}

Validación de los premios en el lado del servidor

Es opcional. No es necesario que implementes la validación de las recompensas en el lado del servidor para poder usar los anuncios que incluyen vídeos con premio. Esta acción solo es obligatoria si decides validar las recompensas en tu propio servidor a fin de mejorar la seguridad. Proporciona a tu representante de Facebook el extremo de editor para activar esta función.

Información general

En el caso de aquellos que gestionan las recompensas a los usuarios en el lado del servidor, Facebook ofrece una solución para llevar dicho proceso a cabo de forma segura mediante una técnica de validación. Nuestro servidor se comunicará con el extremo HTTPS especificado con el objetivo de validar cada impresión de anuncio y el hecho de si una recompensa debe concederse o no.

  1. El SDK de Audience Network solicita un anuncio que incluye vídeo con premio con los parámetros siguientes:
    • placementId: identificador de ubicación de Audience Network
    • RewardData: un objeto RewardData tiene UserId, que representa el identificador de usuario, y Currency, que representa el premio real en el juego.
  2. Una vez finalizado el vídeo, el servidor de Facebook transmite estos valores al extremo que has especificado junto con la clave secreta de la aplicación y un identificador de transacción único.
  3. Cuando se reciben, el servidor valida la solicitud y responde de la siguiente manera:
    • 200 response: la solicitud es válida y se debe entregar el premio.
    • Non 200 response: la solicitud no es válida y no se debe entregar el premio.
  4. Al finalizar el vídeo, se muestra la imagen final y se activa uno de los siguientes eventos.
    • RewardedVideoAdDidSucceed: se activa únicamente si se recibe un código de respuesta 200 en el paso 3.
    • RewardedVideoAdDidFail: se activa si se recibe un código de respuesta distinto a 200 en el paso 3.

Este es un ejemplo de la URL que se recibirá en tu extremo de editor desde el servidor de Facebook: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Este es el aspecto que tendrá el proceso:

Implementación

Tras inicializar el objeto de vídeo con premio, deberás pasar un identificador de usuario y un importe para el premio en los datos del anuncio con premio antes de cargarlo. Para ello, se puede usar la clase RewardData. Tanto el identificador de usuario como el importe para el premio son cadenas. Por ejemplo:

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

Para que tu aplicación reciba una notificación sobre si el premio se ha validado o no, tendrás que implementar las devoluciones de llamada RewardedVideoAdDidSucceed y RewardedVideoAdDidFail, además de las demás devoluciones de llamada para RewardedVideoAd.

Una vez que se carga el anuncio, puedes representar el anuncio con el método Show como un RewardedVideoAd normal.

Ten en cuenta que las devoluciones de llamada de validación del servidor pueden producirse después de que el usuario haya descartado la imagen final. No es recomendable anular el objeto de vídeo con premio antes de que se produzca alguna de estas devoluciones de llamada.

Siguientes pasos

Sigue nuestras guías para integrar distintos formatos de anuncio en tu aplicación de Unity:

Cuando estés listo para publicar tu aplicación y monetizarla, envíala a revisión tras asegurarte de que cumpla las Políticas de Audience Network y las Normas comunitarias de Facebook.