Cómo comenzar

En esta guía, se muestra cómo usar el complemento de anuncios nativos para implementar anuncios nativos de AdMob en una app para Unity, además de algunos aspectos importantes que debes tener en cuenta durante el proceso.

Los anuncios nativos coinciden con la forma y la función de la experiencia del usuario en la que se ubican. También coinciden con el diseño visual de la app en la que se encuentran. El formato de anuncios nativos de AdMob permite a los editores renderizar anuncios que se integran sin inconvenientes con el contenido. Puedes usar esta tecnología para implementar renderizaciones altamente personalizadas que aprovechen al máximo el código nativo en las apps de Unity.

Los anuncios nativos se muestran con los mismos tipos de GameObjects con los que ya estás compilando tus apps y se les puede dar formato para que coincida con el diseño visual de la experiencia del usuario en la que viven. Cuando se carga un anuncio nativo, tu app recibe un objeto nativo que contiene sus elementos, y la app de Unity (en lugar del SDK) los muestra.

Requisitos previos

  • La versión 7.0.0 o una posterior del complemento Google Mobile Ads para Unity
  • Completa la Guía de introducción.
  • Descarga e instala el complemento de anuncios nativos.

Carga formatos de anuncios nativos

Los anuncios nativos se cargan a través de la clase AdLoader, que tiene su propia clase AdLoader.Builder para personalizarla durante la creación. El método ForNativeAd() configura AdLoader para que administre anuncios nativos.

private void RequestNativeAd() {
    AdLoader adLoader = new AdLoader.Builder(INSERT_AD_UNIT_HERE)
        .ForNativeAd()
        .Build();
}

Cómo registrarse para usar eventos de anuncios de AdLoader

Para recibir notificaciones cuando un anuncio nativo se cargue de forma correcta o no se cargue, agrega delegados a la clase AdLoader para los eventos que se indican a continuación.

OnNativeAdLoaded

Se invoca cuando un anuncio nativo se carga correctamente. Es necesario tener un delegado para que este evento acceda al anuncio que se cargó.

OnAdFailedToLoad

Se invoca cuando un anuncio nativo no se carga.

Carga el anuncio

Una vez que termines de compilar un AdLoader, llama a su método LoadAd() para solicitar un anuncio:

adLoader.LoadAd(new AdRequest.Builder().Build());

Cómo reunir la solicitud de anuncio

En el siguiente fragmento de código, se muestra cómo compilar un AdLoader configurado para solicitar anuncios nativos, establecer delegados para cargas de anuncios exitosas y fallidas, y realizar una solicitud de anuncio.

private void RequestNativeAd() {
    AdLoader adLoader = new AdLoader.Builder(INSERT_AD_UNIT_HERE)
        .ForNativeAd()
        .Build();
    adLoader.OnNativeAdLoaded += this.HandleNativeAdLoaded;
    adLoader.OnAdFailedToLoad += this.HandleAdFailedToLoad;
    adLoader.LoadAd(new AdRequest.Builder().Build());
}

Cómo controlar las cargas de anuncios fallidas

El evento OnAdFailedToLoad es del tipo EventHandle<AdFailedToLoadEventArgs>. A continuación, se muestra el análisis del motivo de un error en la carga de anuncios a partir de este evento.

private void RequestNativeAd() {
    ...
    adLoader.OnAdFailedToLoad += this.HandleNativeAdFailedToLoad;
}

private void HandleNativeAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) {
    Debug.Log("Native ad failed to load: " + args.Message);
}

Muestra un anuncio nativo

Cuando se carga un anuncio nativo, se invoca el evento de anuncio para el formato de anuncio correspondiente. Luego, tu app se encarga de mostrar el anuncio, aunque no necesariamente tiene que hacerlo de inmediato.

Cómo controlar la carga de anuncios

El evento OnNativeAdLoaded es del tipo EventHandler<NativeAdEventArgs>. El anuncio, encapsulado en un objeto NativeAd, se puede recuperar desde NativeAdEventArgs, como se muestra a continuación:

private NativeAd nativeAd;
...
private void HandleNativeAdLoaded(object sender, NativeAdEventArgs args) {
    Debug.Log("Native ad loaded.");
    this.nativeAd = args.nativeAd;
}

Recupera recursos de anuncios nativos

Una vez cargados los anuncios, se puede acceder a sus recursos como se muestra a continuación. Los recursos gráficos se muestran como objetos Texture2D y los elementos de texto se muestran como objetos string.

private bool nativeAdLoaded;
private NativeAd nativeAd;

void Update() {
    ...

    if (this.nativeAdLoaded) {
        this.nativeAdLoaded = false;
        // Get Texture2D for the icon asset of native ad.
        Texture2D iconTexture = this.nativeAd.GetIconTexture();

        // Get string for headline asset of native ad.
        string headline = this.nativeAd.GetHeadlineText();
    }
}

private void HandleNativeAdLoaded(object sender, NativeAdEventArgs args) {
    Debug.Log("Native ad loaded.");
    this.nativeAd = args.nativeAd;
    this.nativeAdLoaded = true;
}

Ten en cuenta que solo se debe acceder a los recursos del anuncio en el subproceso principal, por ejemplo, desde el método Update() de una secuencia de comandos de Unity. Además, ten en cuenta que no siempre se garantiza que los siguientes elementos estén presentes y se deben verificar antes de mostrarse:

  • GetStarRating()
  • GetStore()
  • GetPrice()
  • GetAdvertiser()
  • GetIconTexture()

Recurso de AdChoices

Es un requisito mostrar el recurso del anuncio de AdChoices como parte del anuncio nativo. Además, es importante que el recurso del anuncio de AdChoices se vea fácilmente. Por lo tanto, elige los colores de fondo y las imágenes de manera adecuada.

Registra GameObjects para el recurso del anuncio

Debes registrar el GameObject para que el recurso del anuncio se muestre en tu app de Unity. Si el registro se realiza correctamente, el método que se usa para registrar el GameObject muestra un bool. Para una List<GameObject>, el método muestra un int que indica el recuento de GameObject que se registró correctamente.

Si el registro de un recurso del anuncio no es exitoso, no se reconocerán las impresiones ni los clics en el anuncio nativo correspondiente.

if (!this.nativeAd.RegisterIconImageGameObject(icon))
{
    // Handle failure to register the icon ad asset.
}

El elemento GameObject registrado para un recurso del anuncio debe tener un componente de colisionador convexo que represente el tamaño y la forma del GameObject. Si los objetos GameObject registrados en los recursos del anuncio no tienen componentes Collider o tienen uno configurado de forma incorrecta, los anuncios nativos no funcionarán correctamente.

En el siguiente fragmento de código, se agrega un elemento BoxCollider a GameObject que usa un TextMesh para mostrar el recurso de anuncio de título de un anuncio nativo. Una vez que se adjunte BoxCollider a GameObject, se ajustará la escala automáticamente para admitir el texto del componente TextMesh.

// Create GameObject that will display the headline ad asset.
GameObject headline = new GameObject();
headline.AddComponent<TextMesh>();
headline.GetComponent<TextMesh>().characterSize = 0.5 f;
headline.GetComponent<TextMesh>().anchor = TextAnchor.MiddleCenter;
headline.GetComponent<TextMesh>().color = Color.black;

// Get string of the headline asset.
string headlineText = this.nativeAd.GetHeadlineText();
headline.GetComponent<TextMesh>().text = headlineText;

// Add box collider to the GameObject which will automatically scale.
headline.AddComponent<BoxCollider>();

Demostración

En el siguiente código, se muestra cómo recuperar el recurso de ícono de un anuncio nativo que se cargó correctamente, mostrar el recurso de anuncio de ícono configurando la textura de un Quad y registrar el GameObject que se usará para mostrar el recurso. Este proceso de recuperar el recurso del anuncio y registrarlo en la clase de anuncio nativo debe repetirse para cada uno de los recursos que muestra la app.

private GameObject icon;
private bool nativeAdLoaded;
private NativeAd nativeAd;
...
void Update() {
    ...

    if (this.nativeAdLoaded) {
        this.nativeAdLoaded = false;
        // Get Texture2D for icon asset of native ad.
        Texture2D iconTexture = this.nativeAd.GetIconTexture();

        icon = GameObject.CreatePrimitive(PrimitiveType.Quad);
        icon.transform.position = new Vector3(1, 1, 1);
        icon.transform.localScale = new Vector3(1, 1, 1);
        icon.GetComponent<Renderer>().material.mainTexture = iconTexture;

        // Register GameObject that will display icon asset of native ad.
        if (!this.nativeAd.RegisterIconImageGameObject(icon))
        {
            // Handle failure to register ad asset.
        }
    }
}
...

private void HandleNativeAdLoaded(object sender, NativeAdEventArgs args) {
    Debug.Log("Native ad loaded.");
    this.nativeAd = args.nativeAd;
    this.nativeAdLoaded = true;
}