質問編集履歴

4

アセットや環境を詳しく追加

2024/08/30 04:19

投稿

michikusa-mc
michikusa-mc

スコア27

test CHANGED
File without changes
test CHANGED
@@ -17,16 +17,13 @@
17
17
  - シーンを移動する。
18
18
  ※Teratailの最大文字数制限を超過してしまうため、一部削減しています。
19
19
  ```
20
- 08-21 18:58:51.167 9854 9854 I Unity : onResume
20
+ I Unity : onResume
21
21
  ...
22
+ I Unity : 広告を初期化することを試みます。
22
23
  ...
23
- 08-21 18:58:58.220 9854 9870 I Unity : 広告初期化することを試みます。
24
+ I Unity : 広告の表示条件が満たされていません。再初期化ます。
24
25
  ...
25
- 08-21 18:59:31.662 9854 9870 I Unity : 広告の表示条件が満たされていません。再初期化します。
26
- 08-21 18:59:31.662 9854 9870 I Unity : UnityEngine.StackTraceUtility:ExtractStackTrace ()
27
- ...
28
- 08-21 18:59:31.687 9854 9870 I Unity : 広告が閉じられました。シーン遷移を続行します。
26
+ I Unity : 広告が閉じられました。シーン遷移を続行します。
29
- ...
30
27
  ```
31
28
  特に初期化の際のエラーといったものは見られませんでした。
32
29
 
@@ -48,12 +45,15 @@
48
45
  ### 補足情報(FW/ツールのバージョンなど)
49
46
  - Unity 2020.3.4f1
50
47
  - Advertisement Legacy 4.4.2
48
+ ~~     追記      ~~
49
+ - Windows10 22H2
51
- IsReady関数は何故か実装されていません。
50
+ - 実機→Android9.0 PIE
52
-
53
- 繰り返しになりますが、UnityEditorでは広告がしっかりと表示されております。(仮ですが)
51
+ - adb: 1.0.41
52
+ - APILevel: 26
53
+ -
54
54
 
55
55
  私は初心者であるため色々なツッコミどころがあるかと思われますが、どうかご伝授お願いします...。
56
- 何か必要な情報がありましたら、ご遠慮なく言ってください。お願いします...
56
+ 何か必要な情報がありましたら、ご遠慮なく言ってください。
57
57
  ### 追記 2
58
58
  @blanket 様からのご伝授により、AdsInitializerに以下のように改善しました。
59
59
  ```cs
@@ -333,3 +333,9 @@
333
333
  - テストモードが原因ではない
334
334
  - apkには異常はない?
335
335
  ということもわかりました。
336
+
337
+ # 追記3
338
+ アセットは以下のようなものを入れています。(パッケージマネージャーのプロジェクト内より)
339
+ ![assets](https://ddjkaamml8q8x.cloudfront.net/questions/2024-08-30/cc8725be-9de4-4f1b-8220-56f8d283aa21.png)
340
+ それに加え、PlayFabSDKもあります。TextMeshProも。それ以外は特に入れていません。
341
+

3

コードの追記などをしました。

2024/08/29 07:40

投稿

michikusa-mc
michikusa-mc

スコア27

test CHANGED
File without changes
test CHANGED
@@ -34,20 +34,8 @@
34
34
  ~~以下、関連するソースコードと変数などの情報を記述します。~~
35
35
  追記の欄をご確認ください。旧コードが必要な場合はコメントしていただければと思います。
36
36
  - 広告マネージャー(AdsInitializer.cs) ※Initalizerと書かれてはいますが表示処理関数も含まれています。
37
- また、GameManager(シーン推移)からは、ShowUnityAds関数は以下のように呼ばれます。
37
+ ~~また、GameManager(シーン推移)からは、ShowUnityAds関数は以下のように呼ばれます。~~
38
- ```cs
39
- ...
40
- if (Random.value < Paramaters.Entity.adDisplayChance)
41
- {
42
- AudioListener.volume = 0f;
38
+ 追記の欄をご覧ください。
43
- yield return StartCoroutine(AdsInitializer.Instance.ShowUnityAds(() =>
44
- {
45
- Debug.Log("広告が閉じられました。シーン遷移を続行します。");
46
- }));
47
- AudioListener.volume = 1f;
48
- }
49
- ...
50
- ```
51
39
  - Paramaters.Entity.adDisplayChanceはfloat型であり1fです。
52
40
 
53
41
  ### 試したこと
@@ -56,7 +44,6 @@
56
44
  - AdsのSDKのVerを下げて実装→しようとしたがQiitaに「動かなくなる」という趣旨のことが書かれてあったため却下
57
45
  - Googleを調べる→X
58
46
  - AdsManagerのインスタンスがないのかと思われましたが存在確認はしっかりと取れました。
59
- -
60
47
 
61
48
  ### 補足情報(FW/ツールのバージョンなど)
62
49
  - Unity 2020.3.4f1
@@ -67,17 +54,13 @@
67
54
 
68
55
  私は初心者であるため色々なツッコミどころがあるかと思われますが、どうかご伝授お願いします...。
69
56
  何か必要な情報がありましたら、ご遠慮なく言ってください。お願いします...
70
- ### 追記 1
57
+ ### 追記 2
71
58
  @blanket 様からのご伝授により、AdsInitializerに以下のように改善しました。
72
59
  ```cs
73
60
  using System.Collections;
74
- using System.Collections.Generic;
75
61
  using UnityEngine;
76
62
  using UnityEngine.UI;
77
63
  using UnityEngine.Advertisements;
78
- #if UNITY_EDITOR
79
- using UnityEditor.Advertisements;
80
- #endif
81
64
 
82
65
  public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
83
66
  {
@@ -89,6 +72,8 @@
89
72
  private System.Action onAdClosed;
90
73
  public static AdsInitializer Instance = null;
91
74
  private bool isAdReady;
75
+ private int _retryAttempts = 0; // 再試行回数
76
+
92
77
 
93
78
  private void Awake()
94
79
  {
@@ -102,103 +87,120 @@
102
87
  Destroy(gameObject);
103
88
  }
104
89
  isAdReady = false;
90
+ }
91
+
92
+ private void Start()
93
+ {
94
+ Debug.Log("Game IDは" + _gameId + "に初期化されています。");
95
+ Debug.Log((Instance == null ? "Instanceがnullです。" : "Instanceがnullではありません。"));
96
+
97
+ if (!Advertisement.isInitialized && Advertisement.isSupported)
98
+ {
99
+ Debug.Log("広告を初期化することを試みます。");
100
+ Invoke(nameof(InitializeAds), 2f);
101
+ }
102
+ else if (Advertisement.isInitialized)
103
+ {
104
+ Debug.Log("広告はすでに初期化されています。");
105
+ OnInitializationComplete();
106
+ }
107
+ else
108
+ {
109
+ Debug.LogWarning("広告の初期化またはサポートがありません。");
110
+ }
111
+ }
112
+
113
+
114
+ private void InitializeAds()
115
+ {
105
116
  #if UNITY_IOS
106
- _gameId = "XXXXXXX";
117
+ _gameId = "5678792";
107
118
  _interstitialAdPracementId = "Interstitial_iOS";
108
119
  _rewardAdPracementId = "Rewarded_iOS";
109
120
  _bannerAdPracementId = "Banner_iOS";
110
121
  #elif UNITY_ANDROID
111
- _gameId = "XXXXXXX";
122
+ _gameId = "5678793";
112
- _interstitialAdPracementId = "Interstitial_Android";
123
+ _interstitialAdPracementId = "Interstitial_Android";
113
- _rewardAdPracementId = "Rewarded_Android";
124
+ _rewardAdPracementId = "Rewarded_Android";
114
- _bannerAdPracementId = "Banner_Android";
125
+ _bannerAdPracementId = "Banner_Android";
115
126
  #else
116
- _gameId = "XXXXXXX";
127
+ _gameId = "5678793";
117
128
  _interstitialAdPracementId = "Interstitial_Android";
118
129
  _rewardAdPracementId = "Rewarded_Android";
119
130
  _bannerAdPracementId = "Banner_Android";
120
131
  #endif
121
- }
132
+
122
-
123
- private void Start()
124
- {
125
- Debug.Log("Game IDは" + _gameId + "に初期化されています。");
126
- Debug.Log("AdsManagerの数は" + GameObject.FindGameObjectsWithTag("Ads").Length.ToString());
133
+ // https://teratail.com/questions/gz01z3aeeplu99#reply-idhv4lq3k7eujv これをみてくれ
127
134
 
128
135
  if (!Advertisement.isInitialized && Advertisement.isSupported)
129
136
  {
137
+ Advertisement.Initialize("5678793", true, this);
130
- Debug.Log("広告を初期化することを試み。");
138
+ Debug.Log("広告を表示しした。");
131
- InitializeAds();
132
-
133
- }
134
- else if (Advertisement.isInitialized)
135
- {
136
- Debug.Log("広告はすでに初期化されています。");
137
- OnInitializationComplete();
138
139
  }
139
140
  else
140
141
  {
141
- Debug.LogWarning("広告の初期化またはサポートがありません。");
142
- }
143
-
144
- }
145
-
146
-
147
- private void InitializeAds()
148
- {
149
- if (!Advertisement.isInitialized && Advertisement.isSupported)
150
- {
151
- Advertisement.Initialize(_gameId, true, Instance);
152
- }
153
- else
154
- {
155
142
  Debug.LogWarning("Unity Ads is not supported or already initialized.");
156
143
  }
157
144
  }
158
145
 
159
146
  public IEnumerator ShowUnityAds(System.Action onAdClosedCallback)
160
147
  {
161
- if (Instance == null)
162
- {
163
- Debug.LogError("広告マネージャーのインスタンスがnullです。");
164
- }
165
-
166
148
  bool adClosed = false;
167
149
  onAdClosed = () => adClosed = true;
168
150
 
169
- Debug.Log("広告はサポート" + (Advertisement.isSupported ? "されています" : "されていません"));
170
- Debug.Log("isAdReadyは" + (isAdReady ? "true" : "false"));
171
- Debug.Log("初期化は" + (Advertisement.isInitialized ? "されています" : "されていません"));
172
-
173
- if (Advertisement.isInitialized && Advertisement.isSupported)
151
+ if (/*isAdReady*/true)
174
- {
152
+ {
175
- if (!isAdReady)
153
+ if (Advertisement.isInitialized && /* isAdReady */ true)
176
154
  {
177
- Debug.Log("広告をロードています...");
155
+ Debug.Log("広告を表示します");
178
- Advertisement.Load(_interstitialAdPracementId, Instance);
156
+ Advertisement.Show(_interstitialAdPracementId, this);
179
-
180
- // 広告が準備完了するまで待機
181
- while (!isAdReady)
182
- {
183
- yield return null;
184
- }
185
157
  }
186
-
158
+ else
159
+ {
187
- Debug.Log("広告を表示し。");
160
+ Debug.LogError("広告が初期化されていないか、ロードされていせん。");
188
- Advertisement.Show(_interstitialAdPracementId, Instance);
161
+ }
189
-
162
+
190
- // 広告が閉じるまで待機
163
+ // 広告が閉じられるまで待機
191
164
  while (!adClosed)
192
165
  {
193
166
  yield return null;
194
167
  }
195
168
 
169
+ Debug.Log("広告が閉じられました。シーン遷移を続行します。");
196
170
  onAdClosedCallback?.Invoke();
197
171
  }
198
172
  else
199
173
  {
200
- Debug.Log("広告の表示条件満たされていません。再初期化します。");
174
+ Debug.Log("広告の準備できていません。");
175
+ onAdClosedCallback?.Invoke();
176
+ }
177
+ LoadAd();
178
+ yield return new WaitForSeconds(1);
179
+ }
180
+
181
+ public void TestLog()
182
+ {
183
+ Debug.Log("テストです。");
184
+ }
185
+
186
+ private IEnumerator WaitForAdToClose(System.Action onAdClosedCallback)
187
+ {
188
+ bool adClosed = false;
201
- Advertisement.Initialize(_gameId, true, Instance);
189
+ onAdClosedCallback += () => adClosed = true;
190
+
191
+ // タイムアウトの設定(例えば10秒)
192
+ float timeout = 10f;
193
+ float elapsedTime = 0f;
194
+
195
+ while (!adClosed && elapsedTime < timeout)
196
+ {
197
+ elapsedTime += Time.deltaTime;
198
+ yield return null;
199
+ }
200
+
201
+ if (!adClosed)
202
+ {
203
+ Debug.LogWarning("広告は時間内に閉じず、元の機能を再開しました。");
202
204
  onAdClosedCallback?.Invoke();
203
205
  }
204
206
  }
@@ -207,13 +209,20 @@
207
209
  {
208
210
  Debug.Log("広告の初期化が完了しました。");
209
211
  // 初期化が完了したので、広告をロード
210
- isAdReady = false; // 初期化後にロードが行われるので、isAdReadyをリセット
211
- Advertisement.Load(_interstitialAdPracementId, this);
212
+ LoadAd();
212
213
  }
213
214
 
214
215
  public void OnInitializationFailed(UnityAdsInitializationError error, string message)
215
216
  {
216
217
  Debug.LogError($"Initialization failed: {error} - {message}");
218
+ }
219
+
220
+ private void LoadAd()
221
+ {
222
+ if (!isAdReady)
223
+ {
224
+ Advertisement.Load(_interstitialAdPracementId, this);
225
+ }
217
226
  }
218
227
 
219
228
  public void OnUnityAdsAdLoaded(string placementId)
@@ -222,48 +231,65 @@
222
231
  if (placementId == _interstitialAdPracementId)
223
232
  {
224
233
  isAdReady = true;
234
+ _retryAttempts = 0; // リセット
225
- }
235
+ }
226
- }
236
+ }
227
-
228
237
 
229
238
  public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
230
239
  {
240
+ Debug.LogError($"Failed to load Ad: {placementId} - {error} - {message}");
241
+ isAdReady = false;
242
+
243
+ if (_retryAttempts < 3) // 最大3回再試行
244
+ {
245
+ _retryAttempts++;
246
+ StartCoroutine(RetryLoadAd());
247
+ }
248
+ }
249
+
250
+ public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
251
+ {
231
- Debug.LogError($"Error loading Ad Unit: {placementId} - {error} - {message}");
252
+ Debug.LogError($"Error showing Ad Unit {placementId}: {error} - {message}");
253
+ isAdReady = false;
254
+
255
+ if (_retryAttempts < 3)
256
+ {
257
+ _retryAttempts++;
258
+ // StartCoroutine(RetryShowAd());
259
+ InitializeAds();
260
+ }
261
+ }
262
+
263
+ public IEnumerator RetryShowAd()
264
+ {
265
+ yield return new WaitForSeconds(2f); // 2秒後に再試行
266
+ ShowUnityAds(onAdClosed); // 再試行する
267
+ }
268
+
269
+ private IEnumerator RetryLoadAd()
270
+ {
271
+ yield return new WaitForSeconds(2f); // 2秒後に再試行
272
+ LoadAd();
273
+ }
274
+
275
+ public void OnUnityAdsShowStart(string placementId)
276
+ {
277
+ Debug.Log("広告表示開始");
278
+ }
279
+
280
+ public void OnUnityAdsShowClick(string placementId)
281
+ {
282
+ Debug.Log("広告クリック");
283
+ }
284
+
285
+ public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
286
+ {
287
+ Debug.Log("広告表示完了");
232
288
  isAdReady = false;
233
289
  onAdClosed?.Invoke();
234
- }
235
-
236
- private IEnumerator RetryLoadAd()
237
- {
238
- yield return new WaitForSeconds(5); // 5秒後に再試行
239
- Advertisement.Load(_interstitialAdPracementId, this);
240
- }
241
-
242
- public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
243
- {
244
- Debug.LogError($"Error showing Ad Unit {placementId}: {error} - {message}");
245
- onAdClosed?.Invoke();
246
- }
247
-
248
- public void OnUnityAdsShowStart(string placementId)
249
- {
250
- Debug.Log("広告表示開始");
251
- }
252
-
253
- public void OnUnityAdsShowClick(string placementId)
254
- {
255
- Debug.Log("広告クリック");
256
- }
257
-
258
- public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
259
- {
260
- Debug.Log("広告表示完了");
261
- onAdClosed?.Invoke();
262
- // 広告表示後に再度ロード
290
+ LoadAd(); // 次の広告ロード
263
- Advertisement.Load(_interstitialAdPracementId, this);
264
291
  }
265
292
  }
266
-
267
293
  ```
268
294
  そして、呼び出す側のスクリプトにも少々改善を加えました。
269
295
  ```cs
@@ -279,19 +305,8 @@
279
305
 
280
306
  AudioListener.volume = 1f;
281
307
  }
282
- if (!isMoving)
283
- {
284
- isMoving = true;
308
+ yield break;
285
- fade.enabled = true;
286
- fade.color = new Color(0f, 0f, 0f, 0f);
287
- for (int i = 0; i < 10; i++)
288
- {
309
+ ...
289
- fade.color = new Color(0f, 0f, 0f, i * 0.1f);
290
- yield return new WaitForSeconds(0.1f);
291
- }
292
- SceneManager.LoadScene(scenename);
293
- StartCoroutine(FadeOut());
294
- }
295
310
  ```
296
311
  そのログがこちらです。一部は削減しています。
297
312
  ```
@@ -311,4 +326,10 @@
311
326
  - 表示開始~終了までの一連の長れが実行されている
312
327
  - サポートはされている
313
328
  - 初期化がされていない
329
+ - GameIDやインタースティシャル広告のユニットが誤っているわけではない
330
+ また、
331
+ ということがわかりました。また、 @blanket 様のアドバイスや自分の判断による修正により
332
+ - 初期化が原因なのは確実、できていない
333
+ - テストモードが原因ではない
334
+ - apkには異常はない?
314
- ということわかりました。
335
+ ということわかりました。

2

少々改善

2024/08/27 10:07

投稿

michikusa-mc
michikusa-mc

スコア27

test CHANGED
File without changes
test CHANGED
@@ -103,17 +103,17 @@
103
103
  }
104
104
  isAdReady = false;
105
105
  #if UNITY_IOS
106
- _gameId = "5678792";
106
+ _gameId = "XXXXXXX";
107
107
  _interstitialAdPracementId = "Interstitial_iOS";
108
108
  _rewardAdPracementId = "Rewarded_iOS";
109
109
  _bannerAdPracementId = "Banner_iOS";
110
110
  #elif UNITY_ANDROID
111
- _gameId = "5678793";
111
+ _gameId = "XXXXXXX";
112
112
  _interstitialAdPracementId = "Interstitial_Android";
113
113
  _rewardAdPracementId = "Rewarded_Android";
114
114
  _bannerAdPracementId = "Banner_Android";
115
115
  #else
116
- _gameId = "5678793";
116
+ _gameId = "XXXXXXX";
117
117
  _interstitialAdPracementId = "Interstitial_Android";
118
118
  _rewardAdPracementId = "Rewarded_Android";
119
119
  _bannerAdPracementId = "Banner_Android";

1

修正案をいただいたため追記をしました。

2024/08/26 10:20

投稿

michikusa-mc
michikusa-mc

スコア27

test CHANGED
File without changes
test CHANGED
@@ -19,196 +19,21 @@
19
19
  ```
20
20
  08-21 18:58:51.167 9854 9854 I Unity : onResume
21
21
  ...
22
- 08-21 18:58:57.999 9854 9870 I Unity : UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
23
- 08-21 18:58:57.999 9854 9870 I Unity : UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
24
- 08-21 18:58:57.999 9854 9870 I Unity : UnityEngine.Logger:Log (UnityEngine.LogType,object)
25
- ...
26
- 08-21 18:58:57.999 9854 9870 I Unity :
27
- 08-21 18:58:58.078 9854 9870 I Unity : THIS: x<sup>2</sup>=0
28
- ...
29
- (UnityEngine.LogType,UnityEngine.Object,string,object[])
30
- 08-21 18:58:58.078 9854 9870 I Unity : UnityEngine.Logger:Log (UnityEngine.LogType,object)
31
- 08-21 18:58:58.078 9854 9870 I Unity : UnityEngine.Debug:Log (object)
32
- 08-21 18:58:58.078 9854 9870 I Unity : Factor:<ViewFormula>g__GenerateEquation|11_0 (int,int,int) (at D:/UnityProject/Swap Factor/Assets/Scripts/GamePlay/Factor.cs:39)
33
- 08-21 18:58:58.078 9854 9870 I Unity : Factor:ViewFormula (int) (at D:/UnityProject/Swap Factor/Assets/Scripts/GamePlay/Factor.cs:88)
34
22
  ...
35
23
  08-21 18:58:58.220 9854 9870 I Unity : 広告を初期化することを試みます。
36
24
  ...
37
- 08-21 18:58:58.220 9854 9870 I Unity : UnityEngine.Debug:Log (object)
38
- 08-21 18:58:58.220 9854 9870 I Unity : AdsInitializer:Start () (at D:/UnityProject/Swap Factor/Assets/Scripts/Ad/AdsInitializer.cs:50)
39
- 08-21 18:58:58.220 9854 9870 I Unity :
40
- 08-21 18:58:58.220 9854 9870 I Unity : (Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)
41
- 08-21 18:58:58.220 9854 9870 I Unity :
42
25
  08-21 18:59:31.662 9854 9870 I Unity : 広告の表示条件が満たされていません。再初期化します。
43
- 08-21 18:59:31.662 9854 9870 I Unity : UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
44
- 08-21 18:59:31.662 9854 9870 I Unity : UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
45
- 08-21 18:59:31.662 9854 9870 I Unity : UnityEngine.Logger:Log (UnityEngine.LogType,object)
26
+ 08-21 18:59:31.662 9854 9870 I Unity : UnityEngine.StackTraceUtility:ExtractStackTrace ()
46
27
  ...
47
28
  08-21 18:59:31.687 9854 9870 I Unity : 広告が閉じられました。シーン遷移を続行します。
48
- 08-21 18:59:31.687 9854 9870 I Unity : UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
49
- 08-21 18:59:31.687 9854 9870 I Unity : UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
50
- 08-21 18:59:31.687 9854 9870 I Unity : UnityEngine.Logger:Log (UnityEngine.LogType,object)
51
29
  ...
52
30
  ```
53
31
  特に初期化の際のエラーといったものは見られませんでした。
54
32
 
55
33
  ### 該当のソースコード
56
- 以下、関連するソースコードと変数などの情報を記述します。
34
+ ~~以下、関連するソースコードと変数などの情報を記述します。~~
35
+ 追記の欄をご確認ください。旧コードが必要な場合はコメントしていただければと思います。
57
36
  - 広告マネージャー(AdsInitializer.cs) ※Initalizerと書かれてはいますが表示処理関数も含まれています。
58
- ```cs
59
- using System.Collections;
60
- using System.Collections.Generic;
61
- using UnityEngine;
62
- using UnityEngine.Advertisements;
63
- #if UNITY_EDITOR
64
- using UnityEditor.Advertisements;
65
- #endif
66
-
67
- public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
68
- {
69
- private string _gameId;
70
- private string _interstitialAdPracementId;
71
- private string _rewardAdPracementId;
72
- private string _bannerAdPracementId;
73
-
74
- private System.Action onAdClosed;
75
- public static AdsInitializer Instance = null;
76
- private bool isAdReady;
77
-
78
- private void Awake()
79
- {
80
- if (Instance == null)
81
- {
82
- Instance = this;
83
- DontDestroyOnLoad(gameObject);
84
- }
85
- else
86
- {
87
- Destroy(gameObject);
88
- }
89
- isAdReady = false;
90
- #if UNITY_IOS
91
- _gameId = "XXXXXXX";
92
- _interstitialAdPracementId = "Interstitial_iOS";
93
- _rewardAdPracementId = "Rewarded_iOS";
94
- _bannerAdPracementId = "Banner_iOS";
95
- #elif UNITY_ANDROID
96
- _gameId = "XXXXXXX";
97
- _interstitialAdPracementId = "Interstitial_Android";
98
- _rewardAdPracementId = "Rewarded_Android";
99
- _bannerAdPracementId = "Banner_Android";
100
- #else
101
- _gameId = "XXXXXXX";
102
- _interstitialAdPracementId = "Interstitial_Android";
103
- _rewardAdPracementId = "Rewarded_Android";
104
- _bannerAdPracementId = "Banner_Android";
105
- #endif
106
- }
107
-
108
- private void Start()
109
- {
110
- if (!Advertisement.isInitialized && Advertisement.isSupported)
111
- {
112
- Debug.Log("広告を初期化することを試みます。");
113
- Advertisement.Initialize(_gameId, true, this);
114
- }
115
- else
116
- {
117
- Debug.LogWarning("広告の初期化またはサポートがありません。");
118
- }
119
- }
120
-
121
- public IEnumerator ShowUnityAds(System.Action onAdClosedCallback)
122
- {
123
- bool adClosed = false;
124
- onAdClosed = () => adClosed = true;
125
-
126
- if (Advertisement.isInitialized && Advertisement.isSupported)
127
- {
128
- if (!isAdReady)
129
- {
130
- Debug.Log("広告をロードしています...");
131
- Advertisement.Load(_interstitialAdPracementId, this);
132
-
133
- // 広告が準備完了するまで待機
134
- while (!isAdReady)
135
- {
136
- yield return null;
137
- }
138
- }
139
-
140
- Debug.Log("広告を表示します。");
141
- Advertisement.Show(_interstitialAdPracementId, this);
142
-
143
- // 広告が閉じるまで待機
144
- while (!adClosed)
145
- {
146
- yield return null;
147
- }
148
-
149
- onAdClosedCallback?.Invoke();
150
- }
151
- else
152
- {
153
- Debug.Log("広告の表示条件が満たされていません。再初期化します。"); // これが実行されます。
154
- Advertisement.Initialize(_gameId, true, this);
155
- onAdClosedCallback?.Invoke();
156
- }
157
- }
158
-
159
- public void OnInitializationComplete()
160
- {
161
- Debug.Log("広告の初期化が完了しました。"); // これは表示されませんでした。
162
- // 初期化が完了したので、広告をロード
163
- Advertisement.Load(_interstitialAdPracementId, this);
164
- }
165
-
166
- public void OnInitializationFailed(UnityAdsInitializationError error, string message)
167
- {
168
- Debug.LogError($"Initialization failed: {error} - {message}"); // これすらも表示されませんでした。
169
- }
170
-
171
- public void OnUnityAdsAdLoaded(string placementId)
172
- {
173
- Debug.Log($"広告ユニット {placementId} がロードされました。");
174
- if (placementId == _interstitialAdPracementId)
175
- {
176
- isAdReady = true;
177
- }
178
- }
179
-
180
- public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
181
- {
182
- Debug.LogError($"Error loading Ad Unit: {placementId} - {error} - {message}");
183
- isAdReady = false;
184
- onAdClosed?.Invoke();
185
- }
186
-
187
- public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
188
- {
189
- Debug.LogError($"Error showing Ad Unit {placementId}: {error} - {message}");
190
- onAdClosed?.Invoke();
191
- }
192
-
193
- public void OnUnityAdsShowStart(string placementId)
194
- {
195
- Debug.Log("広告表示開始");
196
- }
197
-
198
- public void OnUnityAdsShowClick(string placementId)
199
- {
200
- Debug.Log("広告クリック");
201
- }
202
-
203
- public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
204
- {
205
- Debug.Log("広告表示完了");
206
- onAdClosed?.Invoke();
207
- // 広告表示後に再度ロード
208
- Advertisement.Load(_interstitialAdPracementId, this);
209
- }
210
- }
211
- ```
212
37
  また、GameManager(シーン推移)からは、ShowUnityAds関数は以下のように呼ばれます。
213
38
  ```cs
214
39
  ...
@@ -242,3 +67,248 @@
242
67
 
243
68
  私は初心者であるため色々なツッコミどころがあるかと思われますが、どうかご伝授お願いします...。
244
69
  何か必要な情報がありましたら、ご遠慮なく言ってください。お願いします...
70
+ ### 追記 1
71
+ @blanket 様からのご伝授により、AdsInitializerに以下のように改善しました。
72
+ ```cs
73
+ using System.Collections;
74
+ using System.Collections.Generic;
75
+ using UnityEngine;
76
+ using UnityEngine.UI;
77
+ using UnityEngine.Advertisements;
78
+ #if UNITY_EDITOR
79
+ using UnityEditor.Advertisements;
80
+ #endif
81
+
82
+ public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
83
+ {
84
+ private string _gameId;
85
+ private string _interstitialAdPracementId;
86
+ private string _rewardAdPracementId;
87
+ private string _bannerAdPracementId;
88
+
89
+ private System.Action onAdClosed;
90
+ public static AdsInitializer Instance = null;
91
+ private bool isAdReady;
92
+
93
+ private void Awake()
94
+ {
95
+ if (Instance == null)
96
+ {
97
+ Instance = this;
98
+ DontDestroyOnLoad(gameObject);
99
+ }
100
+ else
101
+ {
102
+ Destroy(gameObject);
103
+ }
104
+ isAdReady = false;
105
+ #if UNITY_IOS
106
+ _gameId = "5678792";
107
+ _interstitialAdPracementId = "Interstitial_iOS";
108
+ _rewardAdPracementId = "Rewarded_iOS";
109
+ _bannerAdPracementId = "Banner_iOS";
110
+ #elif UNITY_ANDROID
111
+ _gameId = "5678793";
112
+ _interstitialAdPracementId = "Interstitial_Android";
113
+ _rewardAdPracementId = "Rewarded_Android";
114
+ _bannerAdPracementId = "Banner_Android";
115
+ #else
116
+ _gameId = "5678793";
117
+ _interstitialAdPracementId = "Interstitial_Android";
118
+ _rewardAdPracementId = "Rewarded_Android";
119
+ _bannerAdPracementId = "Banner_Android";
120
+ #endif
121
+ }
122
+
123
+ private void Start()
124
+ {
125
+ Debug.Log("Game IDは" + _gameId + "に初期化されています。");
126
+ Debug.Log("AdsManagerの数は" + GameObject.FindGameObjectsWithTag("Ads").Length.ToString());
127
+
128
+ if (!Advertisement.isInitialized && Advertisement.isSupported)
129
+ {
130
+ Debug.Log("広告を初期化することを試みます。");
131
+ InitializeAds();
132
+
133
+ }
134
+ else if (Advertisement.isInitialized)
135
+ {
136
+ Debug.Log("広告はすでに初期化されています。");
137
+ OnInitializationComplete();
138
+ }
139
+ else
140
+ {
141
+ Debug.LogWarning("広告の初期化またはサポートがありません。");
142
+ }
143
+
144
+ }
145
+
146
+
147
+ private void InitializeAds()
148
+ {
149
+ if (!Advertisement.isInitialized && Advertisement.isSupported)
150
+ {
151
+ Advertisement.Initialize(_gameId, true, Instance);
152
+ }
153
+ else
154
+ {
155
+ Debug.LogWarning("Unity Ads is not supported or already initialized.");
156
+ }
157
+ }
158
+
159
+ public IEnumerator ShowUnityAds(System.Action onAdClosedCallback)
160
+ {
161
+ if (Instance == null)
162
+ {
163
+ Debug.LogError("広告マネージャーのインスタンスがnullです。");
164
+ }
165
+
166
+ bool adClosed = false;
167
+ onAdClosed = () => adClosed = true;
168
+
169
+ Debug.Log("広告はサポート" + (Advertisement.isSupported ? "されています" : "されていません"));
170
+ Debug.Log("isAdReadyは" + (isAdReady ? "true" : "false"));
171
+ Debug.Log("初期化は" + (Advertisement.isInitialized ? "されています" : "されていません"));
172
+
173
+ if (Advertisement.isInitialized && Advertisement.isSupported)
174
+ {
175
+ if (!isAdReady)
176
+ {
177
+ Debug.Log("広告をロードしています...");
178
+ Advertisement.Load(_interstitialAdPracementId, Instance);
179
+
180
+ // 広告が準備完了するまで待機
181
+ while (!isAdReady)
182
+ {
183
+ yield return null;
184
+ }
185
+ }
186
+
187
+ Debug.Log("広告を表示します。");
188
+ Advertisement.Show(_interstitialAdPracementId, Instance);
189
+
190
+ // 広告が閉じるまで待機
191
+ while (!adClosed)
192
+ {
193
+ yield return null;
194
+ }
195
+
196
+ onAdClosedCallback?.Invoke();
197
+ }
198
+ else
199
+ {
200
+ Debug.Log("広告の表示条件が満たされていません。再初期化します。");
201
+ Advertisement.Initialize(_gameId, true, Instance);
202
+ onAdClosedCallback?.Invoke();
203
+ }
204
+ }
205
+
206
+ public void OnInitializationComplete()
207
+ {
208
+ Debug.Log("広告の初期化が完了しました。");
209
+ // 初期化が完了したので、広告をロード
210
+ isAdReady = false; // 初期化後にロードが行われるので、isAdReadyをリセット
211
+ Advertisement.Load(_interstitialAdPracementId, this);
212
+ }
213
+
214
+ public void OnInitializationFailed(UnityAdsInitializationError error, string message)
215
+ {
216
+ Debug.LogError($"Initialization failed: {error} - {message}");
217
+ }
218
+
219
+ public void OnUnityAdsAdLoaded(string placementId)
220
+ {
221
+ Debug.Log($"広告ユニット {placementId} がロードされました。");
222
+ if (placementId == _interstitialAdPracementId)
223
+ {
224
+ isAdReady = true;
225
+ }
226
+ }
227
+
228
+
229
+ public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
230
+ {
231
+ Debug.LogError($"Error loading Ad Unit: {placementId} - {error} - {message}");
232
+ isAdReady = false;
233
+ onAdClosed?.Invoke();
234
+ }
235
+
236
+ private IEnumerator RetryLoadAd()
237
+ {
238
+ yield return new WaitForSeconds(5); // 5秒後に再試行
239
+ Advertisement.Load(_interstitialAdPracementId, this);
240
+ }
241
+
242
+ public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
243
+ {
244
+ Debug.LogError($"Error showing Ad Unit {placementId}: {error} - {message}");
245
+ onAdClosed?.Invoke();
246
+ }
247
+
248
+ public void OnUnityAdsShowStart(string placementId)
249
+ {
250
+ Debug.Log("広告表示開始");
251
+ }
252
+
253
+ public void OnUnityAdsShowClick(string placementId)
254
+ {
255
+ Debug.Log("広告クリック");
256
+ }
257
+
258
+ public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
259
+ {
260
+ Debug.Log("広告表示完了");
261
+ onAdClosed?.Invoke();
262
+ // 広告表示後に再度ロード
263
+ Advertisement.Load(_interstitialAdPracementId, this);
264
+ }
265
+ }
266
+
267
+ ```
268
+ そして、呼び出す側のスクリプトにも少々改善を加えました。
269
+ ```cs
270
+ if (Random.value < Paramaters.Entity.adDisplayChance)
271
+ {
272
+ AudioListener.volume = 0f;
273
+ Debug.Log("広告表示開始");
274
+ yield return StartCoroutine(AdsInitializer.Instance.ShowUnityAds(() =>
275
+ {
276
+ Debug.Log("広告が閉じられました。シーン遷移を続行します。");
277
+ }));
278
+ Debug.Log("広告表示終了");
279
+
280
+ AudioListener.volume = 1f;
281
+ }
282
+ if (!isMoving)
283
+ {
284
+ isMoving = true;
285
+ fade.enabled = true;
286
+ fade.color = new Color(0f, 0f, 0f, 0f);
287
+ for (int i = 0; i < 10; i++)
288
+ {
289
+ fade.color = new Color(0f, 0f, 0f, i * 0.1f);
290
+ yield return new WaitForSeconds(0.1f);
291
+ }
292
+ SceneManager.LoadScene(scenename);
293
+ StartCoroutine(FadeOut());
294
+ }
295
+ ```
296
+ そのログがこちらです。一部は削減しています。
297
+ ```
298
+ I Unity : Game IDは(AndroidのゲームID)に初期化されています。
299
+ I Unity : AdsManagerの数は1
300
+ I Unity : 広告を初期化することを試みます。
301
+ I Unity : 広告表示開始
302
+ I Unity : 広告はサポートされています
303
+ I Unity : 初期化はされていません
304
+ I Unity : 広告の表示条件が満たされていません。再初期化します。
305
+ I Unity : 広告が閉じられました。シーン遷移を続行します。
306
+ I Unity : 広告表示終了
307
+ ```
308
+ 以下のことより、
309
+ - Game Idの間違いではない
310
+ - 初期化をしようとはしている
311
+ - 表示開始~終了までの一連の長れが実行されている
312
+ - サポートはされている
313
+ - 初期化がされていない
314
+ ということがわかりました。