Agregar anuncios con video con premio a la app de Unity

Audience Network te permite monetizar tus apps para Android y iOS con anuncios de Facebook. Los anuncios con video con premio son una experiencia en pantalla completa que ofrece a los usuarios la posibilidad de ver un anuncio con video a cambio de recibir una recompensa, como divisas virtuales, artículos en la app, contenido exclusivo, etc. La experiencia de anuncios consiste en un video breve y una tarjeta final con una llamada a la acción. Una vez que finalice el video, recibirás una devolución de llamada con el fin de otorgar al usuario la recompensa sugerida.

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

Pasos de los anuncios con video con premio

Paso 1: Inicializar anuncios con video con premio

Paso 2: Agregar eventos de devolución de llamada

Paso 3: Cargar un anuncio

Paso 4: Mostrar el anuncio

Paso 1: Inicializar anuncios con video con premio

El primer paso para mostrar un anuncio con video con premio es crear un objeto RewardedVideoAd en un script 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 de un RewardedVideoAd tiene los siguientes parámetros:

  • placementId: el identificador de ubicación de Audience Network de este bloque de anuncios con video con premio.

Paso 2: Agregar eventos de devolución de llamada

Luego, puedes implementar algunas devoluciones de llamada para suscribirte a los eventos del ciclo de vida del anuncio. Para reproducir estos eventos, registra un delegado del evento, como se muestra en el siguiente 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 de actividad de anuncio destruida en Unity para Android

Esto es pertinente únicamente para Android.

Actualmente, los juegos de Unity para Android solo permiten que la principal Activity de Unity tenga launchMode de singleTask. Consulta el Documento de Unity para el manifiesto de Android y el Documento de actividad de Android.

Como usamos Activity para mostrar anuncios Interstitial y Rewarded Video, la actividad del anuncio podría destruirse sin que se cierre correctamente cuando un usuario pone en segundo plano una aplicación y la vuelve a iniciar usando el icono, en lugar del cambiador de aplicaciones. Puedes usar las siguientes devoluciones de llamadas y verificar si el usuario cerró el anuncio:

Para 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 videos 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 4: Cargar un anuncio

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

Aquí se muestra como crear una instancia de la carga del anuncio del ejemplo anterior:

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

Paso 4: Crear el anuncio

Por último, una vez cargado el anuncio, puedes llamar al método Show para mostrar el anuncio con video con premio en la pantalla. Por ejemplo, puedes crear una función para ShowRewardedVideo y llamar a esta función en el momento de 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 premios en el servidor

Esto es opcional. No es necesario que implementes validación de premios en el servidor para usar anuncios con video con premio. Esta acción solo es necesario si decides validar los premios en tu propio servidor como paso adicional para mejorar la seguridad. Proporciona tu punto de conexión de editor a a tu representante de Facebook para habilitar esta función.

Información general

Si administras los premios de tus usuarios en el servidor, Facebook ofrece una solución para hacerlo de forma segura usando una técnica de validación. Nuestro servidor se comunicará con un punto de conexión https especificado para validar cada impresión de anuncio y determinar si se debe otorgar un premio.

  1. El SDK de Audience Network solicita un anuncio de video con premio con los siguientes parámetros:
    • placementId: identificador de ubicación de Audience Network
    • RewardData: un objeto RewardData consta de un UserId, que representa el identificador de usuario, y Currency, que representa el premio real en el juego.
  2. Cuando el video finaliza, el servidor de Facebook transmite estos valores a tu punto de conexión especificado junto con el secreto de la app y un identificador de transacción único.
  3. Después de recibir la solicitud, el servidor la valida y responde de la siguiente manera:
    • 200 response: la solicitud es válida y el premio se debe entregar.
    • Non 200 response: la solicitud no es válida y el premio no se debe entregar.
  4. Una vez que el video finaliza, la tarjeta final se presenta y se activa alguno de los siguientes eventos.
    • RewardedVideoAdDidSucceed: se activa solo si se recibe una respuesta con código 200 durante el paso 3.
    • RewardedVideoAdDidFail: se activa si se recibe una respuesta sin código 200 durante el paso 3.

Un ejemplo de la URL que llegará a tu punto de conexión 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

El flujo de trabajo tendrá un aspecto como este:

Implementación

Después de inicializar el objeto de video con premio, deberás pasar una cantidad de identificadores de usuario y premios a los datos de anuncios con premio antes de cargar un anuncio. Esto se puede realizar con la clase RewardData. La cantidad de identificadores de usuario y premios 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 app reciba una notificación en la que se indica si la recompensa se validó o no, tendrás que implementar las devoluciones de llamada RewardedVideoAdDidSucceed y RewardedVideoAdDidFail, además de las otras devoluciones de llamadas para RewardedVideoAd.

Una vez cargado el anuncio, puedes presentarlo con el método Show como un RewardedVideoAd normal.

Ten en cuenta que las devoluciones de llamadas del servidor podrían realizarse después de que un usuario descarte la tarjeta final. No debes desasignar el objeto de video con premio hasta después de una de estas devoluciones de llamadas.

Próximos pasos

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

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