複数回クリックした後に表示されるGoogleAdMob広告

Aug 20 2020

私はグーグルアドモブを使用して、ゲームにリワードビデオ広告を表示しています。ゲームが終了すると、ビデオの再生ボタンが有効になります。ユーザーがそれをクリックすると、「広告を見てプレーヤーを復活させますか」というパネルが開きます。「ok」を押す方法と「x」をキャンセルする方法の2つのオプションがあります。問題は、広告を表示するために「OK」を複数回クリックする必要があることです。「OK」を何度クリックしても、広告がまったく表示されない場合があります。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();
 }
}

関数RequestRewardBasedVideo()がビデオの再生ボタンに追加され、ShowVideoRewardAd()が「OK」ボタンに追加されます。テスト広告は正しく表示されますが、問題は、広告を表示するために[OK]ボタンを複数回押す必要があることです。なぜこれが起こっているのかわかりません。誰か助けてもらえますか?

回答

EdMarty Aug 21 2020 at 06:03

広告の読み込みには時間がかかる場合があります。久しぶりのように。実際、私は通常、アプリの起動時に最初の広告の読み込みを開始し、前の広告の再生が終了した直後に次の広告の読み込みを開始するほど長いです。

私の推測では、これは次のとおりです。

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

広告が実際に読み込まれるまで、ボタンをタップするたびに「表示」の呼び出しをスキップするだけです。

私の提案は、IsLoadedがtrueを返さない限り、広告を視聴するオプションを表示しないことです。または、IsLoadedがfalseの場合、ユーザーがタップしてビデオを視聴するときに「お待ちください」ダイアログをポップアップし、HandleRewardedAdLoadedまたはHandleRewardedAdFailedToLoadのいずれかが呼び出されるのを待つこともできます。

Vaillancourt Aug 20 2020 at 20:42

ここでは大げさな推測をします(実際には2つの推測です)。

最初の推測では、最初の広告を読み込もうとすると、広告フレームワークはまだ完全には初期化されていません。ドキュメントに基づくMobileAds.Initialize();と、初期化が完了すると呼び出されるコールバックをに渡すことができるようです。最初の広告をリクエストする前に、初期化が適切に完了するまで待つ必要があります。一見したところ、これを正確に行う方法に関してドキュメントはかなり悪いので、これを達成する方法についてさらに掘り下げることをお勧めします。

2番目の推測は、イベントハンドラーを設定する前に広告を読み込もうとしているということです。ドキュメントをもう一度見てみると、彼らはに電話をかけているようです

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

イベントリスナーを設定した。「LoadAd」を要求するとすぐに、フレームワークはその時点でリスナーのリストをフェッチし、非同期処理を実行して、呼び出し時に指定したメソッドを呼び出すと推測されます。LoadAdの呼び出しの時点ではリスナーがいなかったので、おそらくこれが「何も起こらない」と表示され、「複数回タップ」する必要がある理由です。最初の試行ではリスナーがなく、リスナーは二度目だけそこに。