実現したいこと
- ShowUnityAds関数(スクリプトなどか後述)でUnity Adsの広告が表示されるようにするようにしたい
- 実機(Android9.0)で広告が表示されるようにしたい
前提
Unityで、「インタースティシャル広告が表示される」状態になるように実装しています。
(厳密には、「シーン推移時に広告を表示してから移動する」状態を考えております。)
発生している問題・エラーメッセージ
Unity Editorでは、問題なく広告(仮)が表示されます。
しかし、実機で動かそうとすると、Initializeが実行された気配がなくなるのです。
これはAndroidでテストをしている時に取ったログ(adb logcat -s Unity
より)です。
流れとしては以下のような形式です。
- アプリを起動する。
- アプリが開かれると、広告が初期化され、初期化が終わった際にLoadする。
- シーンを移動する。
※Teratailの最大文字数制限を超過してしまうため、一部削減しています。
I Unity : onResume ... I Unity : 広告を初期化することを試みます。 ... I Unity : 広告の表示条件が満たされていません。再初期化します。 ... I Unity : 広告が閉じられました。シーン遷移を続行します。
特に初期化の際のエラーといったものは見られませんでした。
該当のソースコード
以下、関連するソースコードと変数などの情報を記述します。
追記の欄をご確認ください。旧コードが必要な場合はコメントしていただければと思います。
- 広告マネージャー(AdsInitializer.cs) ※Initalizerと書かれてはいますが表示処理関数も含まれています。
また、GameManager(シーン推移)からは、ShowUnityAds関数は以下のように呼ばれます。
追記の欄をご覧ください。
- Paramaters.Entity.adDisplayChanceはfloat型であり1fです。
試したこと
- GPT4oに聞く→まともな解決策が提案されず
- Teratailで検索→こちらの状況とは当てはまらず
- AdsのSDKのVerを下げて実装→しようとしたがQiitaに「動かなくなる」という趣旨のことが書かれてあったため却下
- Googleを調べる→X
- AdsManagerのインスタンスがないのかと思われましたが存在確認はしっかりと取れました。
補足情報(FW/ツールのバージョンなど)
- Unity 2020.3.4f1
- Advertisement Legacy 4.4.2
~~ 追記 ~~
- Windows10 22H2
- 実機→Android9.0 PIE
- adb: 1.0.41
- APILevel: 26
私は初心者であるため色々なツッコミどころがあるかと思われますが、どうかご伝授お願いします...。
何か必要な情報がありましたら、ご遠慮なく言ってください。
追記 2
@blanket 様からのご伝授により、AdsInitializerに以下のように改善しました。
cs
1using System.Collections; 2using UnityEngine; 3using UnityEngine.UI; 4using UnityEngine.Advertisements; 5 6public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener 7{ 8 private string _gameId; 9 private string _interstitialAdPracementId; 10 private string _rewardAdPracementId; 11 private string _bannerAdPracementId; 12 13 private System.Action onAdClosed; 14 public static AdsInitializer Instance = null; 15 private bool isAdReady; 16 private int _retryAttempts = 0; // 再試行回数 17 18 19 private void Awake() 20 { 21 if (Instance == null) 22 { 23 Instance = this; 24 DontDestroyOnLoad(gameObject); 25 } 26 else 27 { 28 Destroy(gameObject); 29 } 30 isAdReady = false; 31 } 32 33 private void Start() 34 { 35 Debug.Log("Game IDは" + _gameId + "に初期化されています。"); 36 Debug.Log((Instance == null ? "Instanceがnullです。" : "Instanceがnullではありません。")); 37 38 if (!Advertisement.isInitialized && Advertisement.isSupported) 39 { 40 Debug.Log("広告を初期化することを試みます。"); 41 Invoke(nameof(InitializeAds), 2f); 42 } 43 else if (Advertisement.isInitialized) 44 { 45 Debug.Log("広告はすでに初期化されています。"); 46 OnInitializationComplete(); 47 } 48 else 49 { 50 Debug.LogWarning("広告の初期化またはサポートがありません。"); 51 } 52 } 53 54 55 private void InitializeAds() 56 { 57#if UNITY_IOS 58 _gameId = "5678792"; 59 _interstitialAdPracementId = "Interstitial_iOS"; 60 _rewardAdPracementId = "Rewarded_iOS"; 61 _bannerAdPracementId = "Banner_iOS"; 62#elif UNITY_ANDROID 63 _gameId = "5678793"; 64 _interstitialAdPracementId = "Interstitial_Android"; 65 _rewardAdPracementId = "Rewarded_Android"; 66 _bannerAdPracementId = "Banner_Android"; 67#else 68 _gameId = "5678793"; 69 _interstitialAdPracementId = "Interstitial_Android"; 70 _rewardAdPracementId = "Rewarded_Android"; 71 _bannerAdPracementId = "Banner_Android"; 72#endif 73 74 // https://teratail.com/questions/gz01z3aeeplu99#reply-idhv4lq3k7eujv これをみてくれ 75 76 if (!Advertisement.isInitialized && Advertisement.isSupported) 77 { 78 Advertisement.Initialize("5678793", true, this); 79 Debug.Log("広告を表示しました。"); 80 } 81 else 82 { 83 Debug.LogWarning("Unity Ads is not supported or already initialized."); 84 } 85 } 86 87 public IEnumerator ShowUnityAds(System.Action onAdClosedCallback) 88 { 89 bool adClosed = false; 90 onAdClosed = () => adClosed = true; 91 92 if (/*isAdReady*/true) 93 { 94 if (Advertisement.isInitialized && /* isAdReady */ true) 95 { 96 Debug.Log("広告を表示します。"); 97 Advertisement.Show(_interstitialAdPracementId, this); 98 } 99 else 100 { 101 Debug.LogError("広告が初期化されていないか、ロードされていません。"); 102 } 103 104 // 広告が閉じられるまで待機 105 while (!adClosed) 106 { 107 yield return null; 108 } 109 110 Debug.Log("広告が閉じられました。シーン遷移を続行します。"); 111 onAdClosedCallback?.Invoke(); 112 } 113 else 114 { 115 Debug.Log("広告の準備ができていません。"); 116 onAdClosedCallback?.Invoke(); 117 } 118 LoadAd(); 119 yield return new WaitForSeconds(1); 120 } 121 122 public void TestLog() 123 { 124 Debug.Log("テストです。"); 125 } 126 127 private IEnumerator WaitForAdToClose(System.Action onAdClosedCallback) 128 { 129 bool adClosed = false; 130 onAdClosedCallback += () => adClosed = true; 131 132 // タイムアウトの設定(例えば10秒) 133 float timeout = 10f; 134 float elapsedTime = 0f; 135 136 while (!adClosed && elapsedTime < timeout) 137 { 138 elapsedTime += Time.deltaTime; 139 yield return null; 140 } 141 142 if (!adClosed) 143 { 144 Debug.LogWarning("広告は時間内に閉じず、元の機能を再開しました。"); 145 onAdClosedCallback?.Invoke(); 146 } 147 } 148 149 public void OnInitializationComplete() 150 { 151 Debug.Log("広告の初期化が完了しました。"); 152 // 初期化が完了したので、広告をロード 153 LoadAd(); 154 } 155 156 public void OnInitializationFailed(UnityAdsInitializationError error, string message) 157 { 158 Debug.LogError($"Initialization failed: {error} - {message}"); 159 } 160 161 private void LoadAd() 162 { 163 if (!isAdReady) 164 { 165 Advertisement.Load(_interstitialAdPracementId, this); 166 } 167 } 168 169 public void OnUnityAdsAdLoaded(string placementId) 170 { 171 Debug.Log($"広告ユニット {placementId} がロードされました。"); 172 if (placementId == _interstitialAdPracementId) 173 { 174 isAdReady = true; 175 _retryAttempts = 0; // リセット 176 } 177 } 178 179 public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message) 180 { 181 Debug.LogError($"Failed to load Ad: {placementId} - {error} - {message}"); 182 isAdReady = false; 183 184 if (_retryAttempts < 3) // 最大3回再試行 185 { 186 _retryAttempts++; 187 StartCoroutine(RetryLoadAd()); 188 } 189 } 190 191 public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message) 192 { 193 Debug.LogError($"Error showing Ad Unit {placementId}: {error} - {message}"); 194 isAdReady = false; 195 196 if (_retryAttempts < 3) 197 { 198 _retryAttempts++; 199 // StartCoroutine(RetryShowAd()); 200 InitializeAds(); 201 } 202 } 203 204 public IEnumerator RetryShowAd() 205 { 206 yield return new WaitForSeconds(2f); // 2秒後に再試行 207 ShowUnityAds(onAdClosed); // 再試行する 208 } 209 210 private IEnumerator RetryLoadAd() 211 { 212 yield return new WaitForSeconds(2f); // 2秒後に再試行 213 LoadAd(); 214 } 215 216 public void OnUnityAdsShowStart(string placementId) 217 { 218 Debug.Log("広告表示開始"); 219 } 220 221 public void OnUnityAdsShowClick(string placementId) 222 { 223 Debug.Log("広告クリック"); 224 } 225 226 public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState) 227 { 228 Debug.Log("広告表示完了"); 229 isAdReady = false; 230 onAdClosed?.Invoke(); 231 LoadAd(); // 次の広告をロード 232 } 233}
そして、呼び出す側のスクリプトにも少々改善を加えました。
cs
1 if (Random.value < Paramaters.Entity.adDisplayChance) 2 { 3 AudioListener.volume = 0f; 4 Debug.Log("広告表示開始"); 5 yield return StartCoroutine(AdsInitializer.Instance.ShowUnityAds(() => 6 { 7 Debug.Log("広告が閉じられました。シーン遷移を続行します。"); 8 })); 9 Debug.Log("広告表示終了"); 10 11 AudioListener.volume = 1f; 12 } 13 yield break; 14...
そのログがこちらです。一部は削減しています。
I Unity : Game IDは(AndroidのゲームID)に初期化されています。 I Unity : AdsManagerの数は1 I Unity : 広告を初期化することを試みます。 I Unity : 広告表示開始 I Unity : 広告はサポートされています I Unity : 初期化はされていません I Unity : 広告の表示条件が満たされていません。再初期化します。 I Unity : 広告が閉じられました。シーン遷移を続行します。 I Unity : 広告表示終了
以下のことより、
- Game Idの間違いではない
- 初期化をしようとはしている
- 表示開始~終了までの一連の長れが実行されている
- サポートはされている
- 初期化がされていない
- GameIDやインタースティシャル広告のユニットが誤っているわけではない
また、
ということがわかりました。また、 @blanket 様のアドバイスや自分の判断による修正により
- 初期化が原因なのは確実、できていない
- テストモードが原因ではない
- apkには異常はない?
ということもわかりました。
追記3
アセットは以下のようなものを入れています。(パッケージマネージャーのプロジェクト内より)
それに加え、PlayFabSDKもあります。TextMeshProも。それ以外は特に入れていません。
回答1件
あなたの回答
tips
プレビュー