在 Unity 應用程式中加入 AdMob 應用程式開啟頁面廣告

1. 簡介

在本程式碼研究室中,您將在 Unity 應用程式中導入 AdMob 應用程式開啟頁面廣告。

建構項目

本程式碼研究室會引導您使用 Google 行動廣告 Unity 外掛程式,在 Unity 應用程式中導入 AdMob 應用程式開啟頁面廣告。

6338548c3f73e7cf.gif

在執行本程式碼研究室的過程中,如果您遇到任何問題 (例如程式碼錯誤、文法錯誤、用詞不明確等),請使用程式碼研究室左下角的「回報錯誤」連結來回報問題。

課程內容

  • 如何設定 Google 行動廣告 Unity 外掛程式
  • 如何在 Unity 應用程式中導入應用程式開啟頁面廣告

軟硬體需求

  • Unity 2018.4 以上版本
  • Xcode 12 以上版本和 CocoaPods (部署至 iOS)

您對 AdMob 使用體驗的評價如何?

新手 中級 還算容易

2. 設定開發環境

下載程式碼

下載 ZIP 檔案後,請解壓縮其中的內容。您會使用一個名為「admob-appopen-unity-main」的資料夾。

或者,您也可以透過指令列複製 GitHub 存放區:

$ git clone https://github.com/googlecodelabs/admob-appopen-unity

存放區包含兩個資料夾:

  • android_studio_folder.png 範例程式碼:您將在本程式碼研究室中建構的程式碼。
  • android_studio_folder.png 完成:在本程式碼研究室中完成的程式碼。

3. 設定 AdMob 應用程式和廣告單元

由於 Unity 是多平台 SDK,因此您需要在 AdMob 中新增 Android 和 iOS 的應用程式和廣告單元。

設定 Android 裝置

如要設定 Android,您必須新增 Android 應用程式並建立廣告單元。

新增 Android 應用程式

  1. AdMob 控制台中,按一下「應用程式」選單中的「新增應用程式」
  2. 選取「Android」做為平台。系統詢問「該應用程式是否在支援的應用程式商店上架?」時,請按一下「否」
  3. 在應用程式名稱欄位中輸入 AdMob app open ad
  4. 完成本程式碼研究室不需要啟用使用者指標。不過我們建議您這麼做,因為可以幫助您深入瞭解使用者行為。按一下「新增」完成程序。

建立廣告單元

  1. AdMob 管理中心的「應用程式」選單中,選取「AdMob 應用程式開啟頁面廣告」應用程式 (Android)。
  2. 按一下「廣告單元」選單。

  1. 按一下「新增廣告單元」
  2. 格式請選取「應用程式開啟頁面廣告」
  3. 在「廣告單元名稱」欄位中輸入 android-appopen
  4. 按一下「建立廣告單元」完成設定程序。

新的廣告單元通常需要幾個小時才能放送廣告。

如果您想要立即測試廣告行為,請使用 Android 應用程式 ID/廣告單元 ID 和 iOS 應用程式 ID/廣告單元 ID 表格中所列的測試應用程式 ID 和廣告單元 ID。

設定 iOS 裝置

如要設定 iOS,您需要新增 iOS 應用程式並建立廣告單元。

新增 iOS 應用程式

  1. AdMob 控制台中,按一下「應用程式」選單中的「新增應用程式」
  2. 選取「iOS」iOS做為平台。系統詢問「該應用程式是否在支援的應用程式商店上架?」時,請按一下「否」
  3. 在應用程式名稱欄位中輸入 AdMob app open ad
  4. 完成本程式碼研究室不需要啟用使用者指標。不過我們建議您這麼做,因為可以幫助您深入瞭解使用者行為。按一下「新增」完成程序。

建立廣告單元

  1. AdMob 管理中心的「應用程式」選單中,選取「AdMob 內嵌廣告」應用程式 (iOS)。
  2. 按一下「廣告單元」選單。

  1. 按一下「新增廣告單元」
  2. 格式請選取「應用程式開啟頁面廣告」
  3. 在「廣告單元名稱」欄位中輸入 ios-appopen
  4. 按一下「建立廣告單元」完成設定程序。

新的廣告單元通常需要幾個小時才能放送廣告。

如果您想立即測試廣告行為,請使用下表所列的測試應用程式 ID 和廣告單元 ID。

選用:使用測試 AdMob 應用程式和廣告單元

如想按照程式碼研究室的說明操作,而非自行建立新的應用程式和廣告單元,您可以使用下表所列的測試 AdMob 應用程式 ID 和廣告單元 ID。

Android 應用程式 ID/廣告單元 ID

項目

應用程式 ID/廣告單元 ID

AdMob 應用程式 ID

ca-app-pub-3940256099942544~3347511713

廣告單元 ID

ca-app-pub-3940256099942544/3419835294

iOS 應用程式 ID/廣告單元 ID

項目

應用程式 ID/廣告單元 ID

AdMob 應用程式 ID

ca-app-pub-3940256099942544~1458002511

廣告單元 ID

ca-app-pub-3940256099942544/5662855259

如要進一步瞭解測試廣告,請參閱 Android 測試廣告iOS 測試廣告開發人員說明文件。

4. 新增 Google 行動廣告 Unity 外掛程式

整合 Google 行動廣告 Unity 外掛程式是放送 AdMob 廣告並賺取收益的第一步。

下載行動廣告 Unity 外掛程式

Google 行動廣告 Unity 外掛程式可讓 Unity 開發人員輕鬆在 Android 和 iOS 應用程式上放送 Google 行動廣告。這個外掛程式會提供 C# 介面,讓您要求 Unity 專案中的 C# 指令碼使用的廣告。

請使用下方連結下載外掛程式的 Unity 套件。

開啟範例專案

  1. 啟動 Unity Hub。
  2. 在「Projects」分頁中,點選「ADD」按鈕。
  3. 前往「設定開發環境」步驟中,前往解壓縮程式碼所下載的資料夾。
  4. 開啟 starter 資料夾。
  5. 您將在專案清單中看到 starter 專案。按一下專案,即可在 Unity 編輯器中開啟。

匯入行動廣告 Unity 外掛程式

  1. 在 Unity 編輯器中,依序選取「Assets」(資產) >「匯入套件 >上的自訂套件
  2. 選取您在上一個步驟中下載的 GoogleMobileAds-{VERSION}.unitypackage
  3. 確認已選取所有檔案,然後按一下「匯入」

設定 AdMob 應用程式 ID

  1. 在 Unity 編輯器中,依序選取「Assets」(資產) >「Google 行動廣告 >選單中的「設定」
  2. 請在每個欄位中輸入您的 Android 和 iOS AdMob 應用程式 ID。如果您想按照程式碼研究室的說明操作,而非自行建立新的應用程式和廣告單元,請按照下列方式輸入測試用的 AdMob 應用程式 ID。

8890521e199b1090.png

5. 建立公用程式類別

在「Scripts」資料夾下建立名為 AppOpenAdManager 的新類別。此類別會管理執行個體變數,以追蹤已載入的廣告和每個平台的廣告單元 ID。

AppOpenAdManager.cs

using System;
using GoogleMobileAds.Api;
using UnityEngine;

public class AppOpenAdManager
{
#if UNITY_ANDROID
    // Test ad unit ID: ca-app-pub-3940256099942544/3419835294
    private const string AD_UNIT_ID = "<YOUR_ANDROID_APPOPEN_AD_UNIT_ID>";
#elif UNITY_IOS
    // Test ad unit ID: ca-app-pub-3940256099942544/5662855259
    private const string AD_UNIT_ID = "<YOUR_IOS_APPOPEN_AD_UNIT_ID>";
#else
    private const string AD_UNIT_ID = "unexpected_platform";
#endif

    private static AppOpenAdManager instance;

    private AppOpenAd ad;

    private bool isShowingAd = false;

    public static AppOpenAdManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new AppOpenAdManager();
            }

            return instance;
        }
    }

    private bool IsAdAvailable
    {
        get
        {
            return ad != null;
        }
    }

    public void LoadAd()
    {
        // TODO: Load an app open ad.
    }
}

載入廣告

您可以使用靜態 AppOpenAd.LoadAd() 方法載入廣告。載入方法需要廣告單元 ID、ScreenOrientation 模式、AdRequest 物件以及廣告載入成功或失敗時呼叫的完成處理常式。

系統會在完成處理常式中,以參數的形式提供載入的 AppOpenAd 物件。請採用下列實作 LoadAd() 方法。

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    public void LoadAd()
    {
        AdRequest request = new AdRequest.Builder().Build();

        // Load an app open ad for portrait orientation
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                // Handle the error.
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            // App open ad is loaded.
            ad = appOpenAd;
        }));
    }
}

放送廣告

顯示廣告前,請先註冊每個事件處理常式,以監聽每個廣告事件。

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    public void ShowAdIfAvailable()
    {
        if (!IsAdAvailable || isShowingAd)
        {
            return;
        }

        ad.OnAdDidDismissFullScreenContent += HandleAdDidDismissFullScreenContent;
        ad.OnAdFailedToPresentFullScreenContent += HandleAdFailedToPresentFullScreenContent;
        ad.OnAdDidPresentFullScreenContent += HandleAdDidPresentFullScreenContent;
        ad.OnAdDidRecordImpression += HandleAdDidRecordImpression;
        ad.OnPaidEvent += HandlePaidEvent;

        ad.Show();
    }

    private void HandleAdDidDismissFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Closed app open ad");
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        isShowingAd = false;
        LoadAd();
    }

    private void HandleAdFailedToPresentFullScreenContent(object sender, AdErrorEventArgs args)
    {
        Debug.LogFormat("Failed to present the ad (reason: {0})", args.AdError.GetMessage());
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        LoadAd();
    }

    private void HandleAdDidPresentFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Displayed app open ad");
        isShowingAd = true;
    }

    private void HandleAdDidRecordImpression(object sender, EventArgs args)
    {
        Debug.Log("Recorded ad impression");
    }

    private void HandlePaidEvent(object sender, AdValueEventArgs args)
    {
        Debug.LogFormat("Received paid event. (currency: {0}, value: {1}",
                args.AdValue.CurrencyCode, args.AdValue.Value);
    }
}

考量廣告效期

應用程式開啟頁面廣告的廣告參照會在四小時後逾時。要求時間超過四小時後才顯示的廣告將會失效,可能無法賺取收益。

為確保您不顯示過期廣告,請將 IsAdAvailable 屬性修改為 AppOpenAdManager,檢查廣告載入後已過多久。接著,用這個方法檢查廣告是否仍然有效。

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    // TODO: Add loadTime field
    private DateTime loadTime;

    private bool IsAdAvailable
    {
        get
        {
            // TODO: Consider ad expiration
            return ad != null && (System.DateTime.UtcNow - loadTime).TotalHours < 4;
        }
    }

    public void LoadAd()
    {
        if (IsAdAvailable)
        {
            return;
        }

        AdRequest request = new AdRequest.Builder().Build();
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            ad = appOpenAd;
            Debug.Log("App open ad loaded");

            // TODO: Keep track of time when the ad is loaded.
            loadTime = DateTime.UtcNow;
        }));
    }
}

6. 更新廣告載入/顯示廣告的場景

更新 MainScene 類別中的 Start() 方法,以便在場景開始時載入應用程式開啟頁面廣告。

如要在應用程式前景事件發生時收到通知,建議您監聽 AppStateEventNotifier 單例。導入 AppStateEventNotifier.AppStateChanged 委派項目後,應用程式會收到應用程式啟動和前景事件快訊,而且可以顯示廣告。

MainScene.cs

using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using UnityEngine;

public class MainScene : MonoBehaviour
{
    public void Start()
    {
        // TODO: Request an app open ad.
        MobileAds.Initialize((initStatus) =>
        {
            AppOpenAdManager.Instance.LoadAd();
            AppStateEventNotifier.AppStateChanged += OnAppStateChanged;
        });
    }

    public void OnAppStateChanged(AppState state)
    {
        if (state == AppState.Foreground)
        {
            // TODO: Show an app open ad if available.
            AppOpenAdManager.Instance.ShowAdIfAvailable();
        }
    }
}

大功告成!在裝置或模擬器上建構並執行專案。應用程式啟動後,請稍待幾秒鐘,讓系統完全載入廣告。

之後,當您從其他應用程式/主畫面切換回應用程式時,應用程式開啟頁面廣告將如下所示。

6338548c3f73e7cf.gif

7. 全部完成!

您已完成程式碼研究室。您可以在 android_studio_folder.png「complete」資料夾中找到本程式碼研究室完成後的程式碼。