onReady を使用してゲームの読み込みを手動でシーケンスする

ゲームが含まれているページが最初に読み込まれる際、さまざまな非同期イベントが発生します。

ゲームロジックの読み込み、広告タグの読み込み、Ad Placement API の初期化が始まり、広告をプリロードできます。その結果、ページ読み込みの直後に adBreak() を呼び出した場合、API が初期化されていないか、広告がプリロードが完了していない可能性があります。API が初期化されていない場合、呼び出しは失敗し、adBreakDone() コールバックを登録している場合は、breakStatusnotReady に設定されます。

ゲームロジックを Ad Placement API の初期化と同期する必要がある場合は、onReady() コールバックを adConfig() に使用できます。

onReady() は、次の条件が揃った場合に Ad Placement API によって呼び出されます。

  • 広告のタグが読み込まれている
  • Ad Placement API が読み込まれ、初期化されている
  • 広告のプリロードが完了している(adConfig() を使用してプリロードをリクエストした場合)

この時点で、Ad Placement API は完全に初期化されています。adBreak() を呼び出すと、notReady ステータスは返されません。ただし、adBreak() では依然として、広告が表示されないことがあります(使用可能な広告がない場合など)。

onReady() の使用例を次に示します。

...
<script>
    window.adsbygoogle = window.adsbygoogle || [];
    var adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    ...
    function init() {
      // Game start logic, show loading screen
      adConfig({
        preloadAdBreaks: 'on',
        onReady: showAd
      });
      // Don't start the gameplay just yet, keep loading.
    }

    function showAd() {
      // Show an ad
      adBreak({
        type: 'start',
        adBreakDone: startGame,  // always called, unblocks the game logic
        ...
      });
    }
    ...
</script>

: ページ読み込みの直後に adBreak() を呼び出す最も一般的な方法は、プレロールを実装することです。ここで説明する方法で独自に作成されるよりも、preroll プレースメント タイプを使用されることを強くおすすめします

preroll は、必要なプリロードとタイムアウトのロジックをすべて自動的に実装します。ゲームでプレロールを使用する場合、onReady() を使用する必要はありません。プレロールの詳細

タイムアウト

Ad Placement API の初期化が遅れた場合や、読み込みが完全に失敗した場合は、onReady() が呼び出される保証はありません。ゲームが適切なタイミングで開始されるように、タイムアウトを設定することをおすすめします。onReady() コールバックを受け取った場合は、adBreak() を呼び出して広告を配置できます。受け取らなかった場合は、広告呼び出しをスキップしてゲームの読み込みに進むことができます。

次の例には、タイムアウトが含まれており、プレロール プレースメントで実装されるロジックと似ています。

...
<script>
    window.adsbygoogle = window.adsbygoogle || [];
    var adBreak = adConfig = function(o) {adsbygoogle.push(o);}
    ...
    function init() {
        // Game start logic
        let adConfigPromise =
            new Promise((resolve, reject) => adConfig({
                preloadAdBreaks: 'on',
                onReady: () => resolve(true)
            }));
        let timeoutPromise =
            new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(false);
                }, 2000);
            });
        // Whatever happens first resolves this promise.
        Promise.race([
            adConfigPromise,
            timeoutPromise
        ]).then((shouldShowPreRoll) => {
            if (shouldShowPreRoll) {
                showPreRoll();
            } else {
                startGame();
            }
        });
    }

    function showPreRoll() {
      // Show ad
      adBreak({
          type: 'start',
          adBreakDone: startGame, // always called, unblocks the game logic
          ...
      });
    }
    ...
</script>