Anuncio de Google admob que se muestra después de hacer clic varias veces
Estoy usando Google Admob para mostrar anuncios de video recompensados en mi juego. Una vez que finaliza el juego, se habilita el botón de reproducción de video. Si el usuario hace clic en eso, se abre un panel que pregunta "¿le gustaría revivir al jugador viendo un anuncio?". Hay dos opciones, una es presionar "ok" y la otra para cancelar "x". El problema es que tengo que hacer clic en "Aceptar" varias veces para que se muestre el anuncio. A veces, el anuncio no se muestra en absoluto, no importa cuántas veces haga clic en "Aceptar". Aquí está el código que tengo en adscript:
public class AdScript : MonoBehaviour
{
string App_ID = "ca-app-pub-123454545~12345678";
string Video_Ad_Id = "ca-app-pub-3940256099942544/5224354917";
private RewardedAd rewardedAd;
void Start()
{
MobileAds.Initialize(App_ID);
}
public void RequestRewardBasedVideo()
{
this.rewardedAd = new RewardedAd(Video_Ad_Id);
AdRequest request = new AdRequest.Builder().Build();
this.rewardedAd.LoadAd(request);
this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;
}
public void ShowVideoRewardAd()
{
if (this.rewardedAd.IsLoaded())
{
this.rewardedAd.Show();
}
}
public void HandleRewardedAdLoaded(object sender, EventArgs args)
{
MonoBehaviour.print("HandleRewardedAdLoaded event received");
}
public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
{
MonoBehaviour.print(
"HandleRewardedAdFailedToLoad event received with message: "
+ args.Message);
}
public void HandleRewardedAdOpening(object sender, EventArgs args)
{
MonoBehaviour.print("HandleRewardedAdOpening event received");
}
public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
{
MonoBehaviour.print(
"HandleRewardedAdFailedToShow event received with message: "
+ args.Message);
}
public void HandleRewardedAdClosed(object sender, EventArgs args)
{
this.RequestRewardBasedVideo();
}
public void HandleUserEarnedReward(object sender, Reward args)
{
GameManager.instance.ReceiveReward();
}
}
La función RequestRewardBasedVideo () se agrega al botón de reproducción de video y ShowVideoRewardAd () se agrega al botón "ok". Los anuncios de prueba se muestran correctamente, pero el problema es que tengo que presionar el botón Aceptar varias veces para que se muestre el anuncio. No estoy seguro de por qué sucede esto. ¿Puede ayudarme alguien, por favor?
Respuestas
Los anuncios pueden tardar un poco en cargarse. Como, un largo tiempo. Tanto tiempo, de hecho, que normalmente empiezo a cargar mi primer anuncio en el lanzamiento de la aplicación y empiezo a cargar el siguiente anuncio inmediatamente después de que el anuncio anterior termine de reproducirse.
Mi conjetura es que esto:
public void ShowVideoRewardAd()
{
if (this.rewardedAd.IsLoaded())
{
this.rewardedAd.Show();
}
}
simplemente omite la llamada a Mostrar una y otra vez cada vez que presiona el botón, hasta que el anuncio se carga realmente.
Mi sugerencia es que ni siquiera muestre la opción de ver un anuncio a menos que IsLoaded devuelva verdadero. Alternativamente, puede abrir un cuadro de diálogo "por favor espere" cuando el usuario toque para ver el video si IsLoaded es falso, y esperar a que se llame a HandleRejectedAdLoaded o HandleRejectedAdFailedToLoad.
Haré una suposición salvaje aquí (dos suposiciones, en realidad).
La primera suposición es que el marco de anuncios aún no se ha inicializado por completo una vez que intenta cargar su primer anuncio. Según la documentación , parece que podría pasar una devolución de llamada al MobileAds.Initialize();
que se llamaría una vez que se realiza la inicialización. Debería esperar hasta que la inicialización se complete correctamente antes de solicitar sus primeros anuncios. A primera vista, la documentación es bastante mala con respecto a cómo hacer esto exactamente, por lo que le sugiero que investigue un poco más para encontrar más información sobre cómo puede lograrlo.
La segunda suposición es que está intentando cargar un anuncio antes de configurar los controladores de eventos. Si echamos otro vistazo a la documentación , parece que hacen las llamadas a
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the rewarded ad with the request.
this.rewardedAd.LoadAd(request);
después de haber configurado los oyentes de eventos. La conjetura es que tan pronto como le pida "LoadAd", el marco recuperará la lista de oyentes en ese momento, e irá a hacer cosas asincrónicas con él y llamará a los métodos que había proporcionado en el momento de la llamada. No había oyentes en el momento de la llamada a LoadAd, por lo que quizás es por eso que ve "no sucede nada" y necesita "tocar varias veces", porque en el primer intento, no hay oyentes, y los oyentes serían allí solo en la segunda vez.