回答編集履歴

2

追記

2018/04/21 18:47

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -192,6 +192,8 @@
192
192
 
193
193
  {
194
194
 
195
+ IsLoaded = false;
196
+
195
197
  WaitingForRequestTime = REQUEST_INTERVAL;
196
198
 
197
199
  Debug.Log("広告表示なし 再トライ");

1

大幅に回答を訂正します。

2018/04/21 18:47

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,3 +1,229 @@
1
+ ### [追記]回答が間違っていたので変更します。
2
+
3
+ 申し訳ありません。Invokeをループ処理と勘違いしておりましたので回答を大幅に変更させていただきます。
4
+
5
+
6
+
7
+ 今の問題は、Invokeが呼ばれた後にバナー広告が読み込み完了してもInvokeは止まらず別のバナーを生成してしまうということが問題かと思います。それを防ぐのは簡単ですがInvokeを使うことは避けた方が良いのでUpdateでチェックすると良いと思います。処理は下記のようになります。
8
+
9
+
10
+
11
+ 1. 広告リクエストが失敗して3秒後にRequestBannerを呼ぶ
12
+
13
+ 2. 待機時間の3秒以内に広告が呼ばれた場合終了する
14
+
15
+ 3. 更に失敗した場合1からやり直す
16
+
17
+
18
+
19
+ ```C#
20
+
21
+ using UnityEngine;
22
+
23
+ using GoogleMobileAds;
24
+
25
+ using GoogleMobileAds.Api;
26
+
27
+ using System;
28
+
29
+
30
+
31
+ public class AdScript : MonoBehaviour
32
+
33
+ {
34
+
35
+ string APP_ID
36
+
37
+ {
38
+
39
+ get
40
+
41
+ {
42
+
43
+ #if UNITY_ANDROID
44
+
45
+ return "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX";
46
+
47
+ #elif UNITY_IOS
48
+
49
+ return "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX";
50
+
51
+ #endif
52
+
53
+ }
54
+
55
+ }
56
+
57
+
58
+
59
+ string BANNER_ID
60
+
61
+ {
62
+
63
+ get
64
+
65
+ {
66
+
67
+ #if UNITY_ANDROID
68
+
69
+ return "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX";
70
+
71
+ #elif UNITY_IOS
72
+
73
+ return "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX";
74
+
75
+ #endif
76
+
77
+ }
78
+
79
+ }
80
+
81
+
82
+
83
+ /// <summary>
84
+
85
+ /// RequestBannerを呼ぶまでの待機時間
86
+
87
+ /// </summary>
88
+
89
+ public static readonly float REQUEST_INTERVAL = 3;
90
+
91
+
92
+
93
+ BannerView bannerView;
94
+
95
+ bool IsLoaded;
96
+
97
+ float WaitingForRequestTime;
98
+
99
+
100
+
101
+ void Awake()
102
+
103
+ {
104
+
105
+ // イニシャライズ
106
+
107
+ MobileAds.Initialize(APP_ID);
108
+
109
+ DontDestroyOnLoad(this);
110
+
111
+ // バナー広告を表示
112
+
113
+ RequestBanner();
114
+
115
+ }
116
+
117
+
118
+
119
+ void Update()
120
+
121
+ {
122
+
123
+ //「広告が読み込み完了していない」且つ「RequestBannerを呼ぶまでの待機時間」が0以上なら処理開始
124
+
125
+ if(!IsLoaded && WaitingForRequestTime > 0)
126
+
127
+ {
128
+
129
+ //WaitingForRequestTimeが0になるまでTime.deltaTimeで引き続ける
130
+
131
+ WaitingForRequestTime -= Time.deltaTime;
132
+
133
+ //0になったらRequestBannerを呼ぶ
134
+
135
+ if(WaitingForRequestTime <= 0) RequestBanner();
136
+
137
+ }
138
+
139
+ }
140
+
141
+
142
+
143
+ void RequestBanner()
144
+
145
+ {
146
+
147
+ IsLoaded = false;
148
+
149
+
150
+
151
+ //※すでに存在すれば一度破棄する
152
+
153
+ if (bannerView != null) bannerView.Destroy();
154
+
155
+
156
+
157
+ // Create a smart banner at the bottom of the screen.
158
+
159
+ bannerView = new BannerView(BANNER_ID, AdSize.SmartBanner, AdPosition.Bottom);
160
+
161
+ // BannerView bannerView = new BannerView(adUnitId, AdSize.SmartBanner, AdPosition.Bottom);
162
+
163
+
164
+
165
+ // Create an empty ad request.
166
+
167
+ AdRequest request = new AdRequest.Builder().Build();
168
+
169
+
170
+
171
+ // Load the banner with the request.
172
+
173
+ bannerView.LoadAd(request);
174
+
175
+
176
+
177
+ // Called when an ad request has successfully loaded.
178
+
179
+ bannerView.OnAdLoaded += HandleOnAdLoaded;
180
+
181
+ // Called when an ad request failed to load.
182
+
183
+ bannerView.OnAdFailedToLoad += HandleOnAdFailedToLoad;
184
+
185
+ }
186
+
187
+
188
+
189
+ //広告が表示されてない場合
190
+
191
+ public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
192
+
193
+ {
194
+
195
+ WaitingForRequestTime = REQUEST_INTERVAL;
196
+
197
+ Debug.Log("広告表示なし 再トライ");
198
+
199
+ }
200
+
201
+
202
+
203
+ //広告が表示された場合
204
+
205
+ public void HandleOnAdLoaded(object sender, EventArgs args)
206
+
207
+ {
208
+
209
+ IsLoaded = true;
210
+
211
+ Debug.Log("広告が表示されました");
212
+
213
+ }
214
+
215
+ }
216
+
217
+ ```
218
+
219
+
220
+
221
+
222
+
223
+ ### [追記]以下は過去の間違った回答です。
224
+
225
+
226
+
1
227
  申し訳ないですが今の実装はやめた方がよいと思います。理由は2点あります。
2
228
 
3
229