Annuncio Google AdMob mostrato dopo aver fatto clic più volte

Aug 20 2020

Utilizzo Google AdMob per mostrare annunci video con premio nel mio gioco. Al termine del gioco, il pulsante di riproduzione del video è abilitato. Se l'utente fa clic su questo, si apre un pannello che chiede "vorresti rianimare il giocatore guardando un annuncio". Ci sono due opzioni, una è premere "ok" e l'altra per annullare "x". Il problema è che devo fare clic su "ok" più volte per visualizzare l'annuncio. A volte l'annuncio non viene visualizzato affatto, non importa quante volte clicco su "ok". Ecco il codice che ho in 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 funzione RequestRewardBasedVideo () viene aggiunta al pulsante di riproduzione video e ShowVideoRewardAd () viene aggiunto al pulsante "ok". Gli annunci di prova vengono visualizzati correttamente, ma il problema è che devo premere più volte il pulsante ok per visualizzare l'annuncio. Non sono sicuro del motivo per cui sta accadendo. Qualcuno può aiutarmi per favore?

Risposte

EdMarty Aug 21 2020 at 06:03

Il caricamento degli annunci può richiedere del tempo. Tipo, molto tempo. Così tanto tempo, infatti, che di solito inizio a caricare il mio primo annuncio al lancio dell'app e inizio a caricare l'annuncio successivo immediatamente dopo che l'annuncio precedente è terminato.

La mia ipotesi è che questo:

public void ShowVideoRewardAd()
{
    if (this.rewardedAd.IsLoaded())
    {
        this.rewardedAd.Show();
    }
}

si limita a saltare la chiamata a Mostra più e più volte ogni volta che tocchi il pulsante, finché l'annuncio non viene effettivamente caricato.

Il mio suggerimento è di non mostrare nemmeno l'opzione per guardare un annuncio a meno che IsLoaded non restituisca true. In alternativa, è possibile visualizzare una finestra di dialogo "attendere per favore" quando l'utente tocca per guardare il video se IsLoaded è falso e attendere la chiamata di HandleRewardedAdLoaded o HandleRewardedAdFailedToLoad.

Vaillancourt Aug 20 2020 at 20:42

Farò un'ipotesi selvaggia qui (due ipotesi, in realtà).

La prima ipotesi è che il framework degli annunci non sia ancora completamente inizializzato una volta che si tenta di caricare il primo annuncio. Sulla base della documentazione , sembra che tu possa passare un callback a MobileAds.Initialize();che verrebbe chiamato una volta completata l'inizializzazione. Dovresti attendere fino al completamento corretto dell'inizializzazione prima di richiedere i tuoi primi annunci. A prima vista, la documentazione è piuttosto scadente su come farlo esattamente, quindi ti suggerisco di scavare un po 'più in là per trovare di più su come potresti ottenere questo risultato.

La seconda ipotesi è che stai tentando di caricare un annuncio prima di impostare i gestori di eventi. Se diamo un'altra occhiata alla documentazione , sembra che facciano le chiamate a

// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the rewarded ad with the request.
this.rewardedAd.LoadAd(request);

dopo aver impostato i listener di eventi. L'ipotesi è che non appena gli chiedi di "LoadAd", il framework recupera l'elenco degli ascoltatori in quel momento, e va a fare cose asincrone con esso e chiama i metodi che avevi fornito al momento della chiamata. Non c'erano ascoltatori al momento della chiamata a LoadAd, quindi forse è per questo che non vedi "non succede nulla" e devi "toccare più volte", perché al primo tentativo non ci sono ascoltatori e gli ascoltatori sarebbero lì solo la seconda volta.