やりたい事
Admobのバナー広告が(通信環境により)表示されない場合、
3秒毎に再度広告表示をリクエストして、できるだけ表示させるようにしたい。
(Awakeでバナー広告を一番先に読み込んでおりますが、
広告が表示されない事がある為、
Awakeで読み込めなかった場合に、再度広告表示のリクエストをして表示させたい)
下記のスクリプトで広告が表示されていない場合は、
3秒ごとに表示のリクエストをするようにできました。
問題
2つの広告が重なって表示されてしまう。(ipad mini / iPad airで試した場合)
※バナー広告だけ読み込んでおります。
(Admob側の広告ユニット番号の申請もバナー広告のみしかしておりません)
下の添付写真のように左上の小さい広告と背後にバナー広告が重なって表示されてしまいます。
(常時ではないが、ごくたまに起こります)
推測ですが、左上の小さい広告も一応、バナー広告扱いのようです。
問題は表示のリフレッシュがうまくいってないようです。
- 最初の広告が出力される。
- アドモブ側が自動的に次の広告にリフレッシュしようとする時に、
次の広告のデータを受け取れない。(通信環境により)
そして最初の広告が表示されっぱなしになる。
3. その間、下記スクリプトの3秒ごとの広告表示リクエストが実行されており、(Invoke("RequestBanner",3.0f);)
リクエストが成功した時、2番目の広告が表示されるが、
下の広告が表示されたままで、上に重なってしまっている。
結果的に2番目の広告が小さい場合、後ろ側の通常のサイズのバナー広告が一緒に見えてしまう。
もし次の広告への再リクエストが失敗したとしても、
その時点で、現在表示されている広告を削除するのは避けたいです。
(空欄になるより最初の広告を残しておきたい。)
質問
どうにか、次の広告が表示される時だけ、
元の広告を削除するようにできませんでしょうか?
または、
小さな広告は表示させない、
または
小さな広告を通常バナー広告サイズまで拡大するような
制御はできませんでしょうか?
ご教授よろしくおねがいいたします。
using UnityEngine; using System.Collections; using GoogleMobileAds; using GoogleMobileAds.Api; using System; public class AdScript : MonoBehaviour { void Awake() { // イニシャライズ #if UNITY_ANDROID MobileAds.Initialize("ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX"); #endif // #if UNITY_IOS MobileAds.Initialize("ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX"); #endif // DontDestroyOnLoad (this); // バナー広告を表示 RequestBanner (); } private void RequestBanner() { // string adUnitId = "INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE"; #if UNITY_ANDROID string adUnitId = "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX"; // string adUnitId = "INSERT_IOS_BANNER_AD_UNIT_ID_HERE"; #elif UNITY_IOS string adUnitId = "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX"; // #else string adUnitId = "unexpected_platform"; #endif // Create a smart banner at the bottom of the screen. BannerView bannerView = new BannerView(adUnitId, AdSize.SmartBanner, AdPosition.Bottom); // BannerView bannerView = new BannerView(adUnitId, AdSize.SmartBanner, AdPosition.Bottom); // Create an empty ad request. AdRequest request = new AdRequest.Builder().Build(); // Load the banner with the request. bannerView.LoadAd(request); // Called when an ad request has successfully loaded. bannerView.OnAdLoaded += HandleOnAdLoaded; // Called when an ad request failed to load. bannerView.OnAdFailedToLoad += HandleOnAdFailedToLoad; } //広告が表示されてない場合 public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) { Invoke ("RequestBanner", 3.0f);//3秒送らせて再度バナー表示トライ Debug.Log ("広告表示なし 再トライ"); } //広告が表示された場合 public void HandleOnAdLoaded(object sender, EventArgs args) { Debug.Log ("広告が表示されました"); } }
[追記]いただいた回答を元に修正して書き換えてみました。
広告が表示されてない場合の処理(HandleOnAdFailedToLoad)に追記しました。
using UnityEngine; using System.Collections; using GoogleMobileAds; using GoogleMobileAds.Api; using System; /// /// public class AdScript : MonoBehaviour { // RequestBannerを呼ぶまでの待機時間 public static readonly float REQUEST_INTERVAL = 3; BannerView bannerView; bool IsLoaded; float WaitingForRequestTime; string APP_ID { get { #if UNITY_ANDROID return "ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx"; #elif UNITY_IOS return "ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx"; #endif } } string BANNER_ID { get { #if UNITY_ANDROID return "ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx"; #elif UNITY_IOS return "ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx"; #endif } } void Awake() { // イニシャライズ MobileAds.Initialize(APP_ID); DontDestroyOnLoad(this); // バナー広告を表示 RequestBanner(); } void Update() { //「広告が読み込み完了していない」且つ「RequestBannerを呼ぶまでの待機時間」が0以上なら処理開始 if(!IsLoaded && WaitingForRequestTime > 0) // 3、2、1の間だけupdadeが実行される { //WaitingForRequestTimeが0になるまでTime.deltaTimeで引き続ける WaitingForRequestTime -= Time.deltaTime; // 3から1づつ引いていく //0になったらRequestBannerを呼ぶ if(WaitingForRequestTime <= 0) RequestBanner(); // 0で実行 } } private void RequestBanner() { IsLoaded = false; //※すでに存在すれば一度破棄する if(bannerView != null) bannerView.Destroy(); // Create a smart banner at the bottom of the screen. bannerView = new BannerView(BANNER_ID, AdSize.SmartBanner, AdPosition.Bottom); // Create an empty ad request. AdRequest request = new AdRequest.Builder().Build(); // Load the banner with the request. bannerView.LoadAd(request); // // // Called when an ad request has successfully loaded. bannerView.OnAdLoaded += HandleOnAdLoaded; // Called when an ad request failed to load. bannerView.OnAdFailedToLoad += HandleOnAdFailedToLoad; } //広告が表示されてない場合 public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) { // WaitingForRequestTime = REQUEST_INTERVAL;//初期値3にもどす // Debug.Log("広告表示なし 再トライ"); IsLoaded = false; // ネットワークにアクセス可能かどうかを取得する switch (Application.internetReachability) { //再トライなし case NetworkReachability.NotReachable: Debug.Log( "ネットワークが使えない 広告表示なし 再トライなし" ); break; case NetworkReachability.ReachableViaCarrierDataNetwork: Debug.Log( "キャリアネットワークでアクセス可能 再トライ" ); WaitingForRequestTime = REQUEST_INTERVAL;//初期値3にもどす break; case NetworkReachability.ReachableViaLocalAreaNetwork: Debug.Log( "WiFi でアクセス可能 再トライ" ); WaitingForRequestTime = REQUEST_INTERVAL;//初期値3にもどす break; } } //広告が表示された場合 public void HandleOnAdLoaded(object sender, EventArgs args) { IsLoaded = true; Debug.Log("広告が表示されました"); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/21 10:48
2018/04/21 13:48 編集
2018/04/21 13:33 編集
2018/04/21 15:08
2018/04/21 18:46
2018/04/21 19:11
2018/04/22 04:42 編集
2018/04/22 09:25 編集