質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

576閲覧

Unity Adsで、Initializeが実機で実行された気配がなく、広告が表示されない

michikusa-mc

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2024/08/21 11:54

編集2024/08/30 04:19

実現したいこと

  • 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

アセットは以下のようなものを入れています。(パッケージマネージャーのプロジェクト内より)
assets
それに加え、PlayFabSDKもあります。TextMeshProも。それ以外は特に入れていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2024/08/21 12:15

質問とは関係ないですが、2020年度版はすでにサポート期間が終了しているので、新しいバージョンに更新したほうがいいです。
michikusa-mc

2024/08/22 11:19

@fiveHundred様 返信が遅れてすみません。了解です。新しいバージョンに更新し、問題が解決するかどうかを検証してみます。
guest

回答1

0

ベストアンサー

ログを見る限り、広告の初期化を試みていますが、広告の表示条件が満たされていないと出ています。以下の点を確認して、修正を試みてください。

private void Start() { if (!Advertisement.isInitialized && Advertisement.isSupported) { Debug.Log("広告を初期化することを試みます。"); Advertisement.Initialize(_gameId, true, this); } else if (Advertisement.isInitialized) { Debug.Log("広告はすでに初期化されています。"); OnInitializationComplete(); } else { Debug.LogWarning("広告の初期化またはサポートがありません。"); } }

ログの詳細

OnInitializationFailedやOnUnityAdsFailedToLoadのメソッドが呼び出されていないように見えるため、初期化自体が失敗している可能性が高いです。これらのメソッドにブレークポイントを設定して、エラーメッセージが表示されるかどうかを確認してください。

非同期処理の問題

実機では非同期処理のタイミングが異なる場合があります。初期化完了までの時間がかかっている可能性があるため、初期化が完了するまで少し待ってから広告を表示することを試してみてください。

広告表示前の確認

広告を表示しようとする前に、Advertisement.isInitializedがtrueであることを確認します。また、広告のロードが完了しているかも確認します。

if (Advertisement.isInitialized && isAdReady) { Debug.Log("広告を表示します。"); Advertisement.Show(_interstitialAdPracementId, this); } else { Debug.LogError("広告が初期化されていないか、ロードされていません。"); }

問題点

isAdReadyがtrueに遷移するのは、OnUnityAdsAdLoadedが呼び出されたときのみです。このメソッドは、広告が正常にロードされた場合にのみ実行されるため、ロードに失敗した場合や初期化が行われていない場合はisAdReadyがtrueになることはありません。
もし初期化が成功していないか、ロードが成功していない場合、isAdReadyは常にfalseのままとなり、広告は表示されません。

関数の整理

Unity Ads関連のコールバックメソッド
これらはUnity Adsのインターフェースに対応するコールバックメソッドであり、広告の状態に応じて自動的にUnity Ads SDKによって呼び出されます。

OnInitializationComplete: 初期化が成功したときに呼ばれます。
OnInitializationFailed: 初期化が失敗したときに呼ばれます。
OnUnityAdsAdLoaded: 広告が正常にロードされたときに呼ばれます。
OnUnityAdsFailedToLoad: 広告のロードに失敗したときに呼ばれます。
OnUnityAdsShowStart: 広告が表示され始めたときに呼ばれます。
OnUnityAdsShowClick: 広告がクリックされたときに呼ばれます。
OnUnityAdsShowComplete: 広告の表示が完了したときに呼ばれます。
OnUnityAdsShowFailure: 広告の表示に失敗したときに呼ばれます。
カスタムメソッド
ShowUnityAds: これはカスタムメソッドであり、自動的には呼ばれません。どこかでこのメソッドを明示的に呼び出す必要があります。
bool値の初期化のタイミング

改善点

初期化の成功確認:

OnInitializationCompleteメソッドでisAdReadyをfalseに初期化し、広告のロードが確実に行われるようにします。
広告のロードが完了したら、isAdReadyがtrueに設定されることを確認します。
ロード再試行:

広告のロードが失敗した場合、適切にハンドリングするために再試行ロジックを追加することが考えられます。例えば、一定時間後に再度ロードを試みるなど。

参考資料
Android 広告
【Unity】テスト広告がUnityエディタでは表示されるけどスマホ(実機)で表示されない

補足情報
Advertisement Legacy 4.12.0 · July 17, 2024
Unityバージョン 2022.3.25f1

chatGPTとの共有スペース20240826更新版

投稿2024/08/25 03:35

編集2024/08/30 04:51
isimasa

総合スコア308

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

michikusa-mc

2024/08/25 05:46

ご回答ありがとうございます。 回答していただいたように、実機で実行する際しばらく待ってみてから広告を表示させるようにしてみました。(2分程度) しかし解決には至りませんでした。 また、Unityエディタ上ではうまく広告が表示されました。初期化の際のメッセージも出現しました。 しかし実機でブレークポイントを設定したところ、OnInitializationComplete,OnInitializationFailedともに 実行されませんでした。 この場合どうすればよいでしょうか?
michikusa-mc

2024/08/26 10:22

ありがとうございます。返信が遅れて申し訳ありません。 編集していただいたものを見て、解決法を検討してみました。 chatGPTとの共有スペースなどのコードを参照し、書き換えてみました。 質問を追記しましたので、ご確認いただけますと幸いです。 ところで一つ可能性として思い浮かんだのが、「広告IDがBAN」されていることです。 自分としては心当たりがないのですがそのような可能性はありますでしょうか。 よろしくお願いいたします。
michikusa-mc

2024/08/27 12:24

ご編集ありがとうございます。ChatGPTとのワークスペースも含め見ました。 適切なエラーハンドリングをすれば解決するかと思われましたが... 上手くはいきませんでした。 自分も対処を試みました。しかしUnity Adsのデフォルトのコールバックメソッドが「実機では呼び出されてすらない」という現状があります。なので「エラーハンドリングがXX」ということが原因ではない かと思われます。 ここからは自分で試したことを記述します。 - IPからBANを受けているのだと思いWi-Fiを変えて実行 → NG - ShowUnityAdsが実行されたことが分かるように自明に1秒に待ってみる → 実行されていた - 別プロジェクトでテスト広告が表示されるか試してみる → 出来なかった ここで異常を感じました。別プロジェクトですら広告が表示されないとなるとおかしいです。 この辺りどうすればよいでしょう。デバイス固有の問題なのでしょうか。 だとしたら仮想環境を用いて実行するのですが...。 何度も質問すみません。
isimasa

2024/08/27 21:03 編集

参考資料を追加しました。Project設定を確認されてみてください。 質問を見直してみたところ、シーン遷移と広告表示が一瞬で同時に起こっているのではと思えてきました。 using DG.Tweening; // DOTweenの名前空間をインポート DOTweenというAssetがあるので、広告表示とシーン遷移との処理を切り分けて関数にまとめ、 広告表示完了→フェード完了→シーン遷移完了 と、処理が完了するのを待って、OnCompleteメソッドを呼ぶようにしてみてください。
michikusa-mc

2024/08/29 07:33

ありがとうございます。 > シーン遷移と広告表示が一瞬で同時に起こっているのでは DOTweenを使用して変に実装してさらに狂わせるのはよくないと思ったため シーン推移のプログラムをコメントアウトし、広告表示のところだけを実行させるようにしました。 結果は、ダメでした。 > 参考資料を追加しました。 ありがとうございます。参考資料を見て、「うまく行かない場合は」のところを見てみました。 - プラットフォームは間違いなくAndroidです。 - UnityAdsのバージョンは4.x系に更新しています。 - GameIDが間違っている→後述します。 私が追加で試したことをここに記載します。 - Instanceが存在するかを確認した 以下のコードをStartに追加しました。 Debug.Log((Instance == null ? "Instanceがnullです。" : "Instanceがnullではありません。")); Instanceがnullではないようです。 - Initializeを遅延させて実行する 広告の初期化のタイミングが早すぎることを疑い、2f sec遅延させてみました。 結果は変わらず。 - isAdReady関係なく広告を表示する スクリプト上の「if (isAdReady) ~」をコメントアウトし、ロードされるか検証してみました。 これでShowをしてエラーが表示されるかを試したところ、 「E Unity : 広告が初期化されていないか、ロードされていません。」 とでてきました。やはり初期化がされていないのが原因のようです。 ~~ここから無駄な足搔き~~~ - Ads→Enable test modeをオフにする どこかの記事に「実機でビルドする際にはTest modeをオフにしましょう」といった趣旨のものが 書かれていたため、オフにしました。結果としては変わりませんでした。 - Project設定でインターネット接続を必須にする ダメでした。 - ビルドして実行→そのままではなくビルド→apk→adb install apkfileとしてみる ダメでした。 - ゲームIDを直接書く ダメでした。 ここまでわからない、となってしまうと非常に難しい状況です。 ここまでお付き合いいただいているのにもかかわらず解決に至っていないことをお詫びします...。 私が初心者でなければよかったのですが...。 いま使用しているAndroidが少々特殊な環境なので、違う機種を購入しテストすることも考えています。 どうでしょうか...?
michikusa-mc

2024/08/29 07:41

これらの修正をするにあたって修正したコードを載せて編集しました。ご確認いただけると嬉しいです。
isimasa

2024/08/29 12:32 編集

何か、project設定が変わるような特殊なアセット入れたりしませんでしたか? 環境を詳しく教えてくださればもっとピンポイントで対応できるかもしれません。 あとは、Androidのバージョンがサポートされていない可能性も。
michikusa-mc

2024/08/30 04:07

返信ありがとうございます。 > project設定が変わるような特殊なアセット入れたりしませんでしたか? いえ、特にそういったことはしていないと思います。入っているアセットを質問欄に載せておきます。 > 環境を詳しく教えてくださればもっとピンポイントで対応できるかもしれません。 わかりました。こちらも追記しておきます。 > あとは、Androidのバージョンがサポートされていない可能性も。 Androidは9.0です。対応していないということはないと思いますが...。
michikusa-mc

2024/09/08 00:25

編集ありがとうございます。 気づいておりませんでした。 見ていて気付いたのですが、恐らくデバイスが特殊な環境で、広告を表示できていなかったのかもしれません(前は表示できていたのですが...) 新しい実機を購入する方針で、色々な対策を行っていきたいです。ありがとうございました。 またご報告出来たらさせて頂きます。
michikusa-mc

2024/09/25 12:38

回答ありがとうございます。 試したところ問題が解決しました! 機種の問題でもあったようで、違うスマホでビルドしたらできました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問