广告展示位置

本指南介绍了如何使用 Google 移动广告 Unity 插件的“广告展示位置”功能为您的应用制作和展示广告。

前提条件

初始化 Google 移动广告 SDK

在加载广告之前,请先使用 Action<InitializationStatus> 回调调用 MobileAds.Initialize(),以初始化移动广告 SDK。此操作仅需执行一次,最好是在应用启动时执行。

using GoogleMobileAds.Api;
using System.Collections.Generic;
...
public class GoogleMobileAdsDemoScript : MonoBehaviour
{
    ...
    public void Start()
    {
        // Initialize the Mobile Ads SDK.
        MobileAds.Initialize((initStatus) =>
        {
            // SDK initialization is complete
        });
        ...
    }
}

创建广告展示位置

使用 Google 移动广告展示横幅广告的第一步是创建并配置广告展示位置。您可以从 Unity 编辑器中的素材资源 > Google 移动广告 > 广告展示位置中选择横幅广告、插页式广告或激励广告格式的广告展示位置。然后,系统会设置三个演示广告展示位置,以供使用。

要添加新的广告展示位置,请点击列表末尾的添加新展示位置按钮。您可以通过“检查器”视图配置广告展示位置。

广告展示位置配置

每个展示位置都具有以下属性:

展示位置名称
展示位置的名称。用于在场景中设置广告时标识展示位置。
广告格式
横幅广告、激励广告、插页式广告。广告的类型。
广告单元 ID
为 Android 和 iOS 设备提供横幅广告单元 ID。您至少需要提供一个广告单元 ID。
跨场景持久化
选中后,无论场景如何变化,横幅广告都将保留在屏幕上(行为与 DontDestroyOnLoad 相同)。
已启用自动加载
如果选中此设置,当与广告展示位置关联的场景加载时,广告就会自动加载。

以下屏幕截图显示了名为 My Awesome Banner 的广告展示位置示例。

向场景中添加 AdGameObject

您可以使用 Unity 编辑器中的 GameObject > Google 移动广告为场景添加横幅广告、插页式广告或激励广告格式的 AdGameObject。请选择要将格式添加到有效场景的格式。

向场景中添加 AdGameObject 后,您将在 Unity 编辑器的层次结构视图中看到一个代表广告的 GameObject。

您可以通过更改 GameObject 本身的名称来更改展示位置的名称。以下屏幕截图显示了名为 Banner Ad 的 AdGameObject 示例。

AdGameObject 设置

您可以从 Ad Game Object (Script) 组件设置中的 Inspector 视图中,在场景中配置 AdGameObject。

广告展示位置

从已配置的展示位置的下拉列表中选择广告展示位置。该列表将仅包含采用正确格式的广告单元。例如,对于横幅广告游戏对象,下拉菜单只会显示已配置的横幅广告展示位置。

BannerAdGameObject 配置(仅限横幅广告)

  • 尺寸 - 选择要使用的横幅广告的尺寸。
    • 锚定自适应横幅广告提供了几个更多选项:
      • 屏幕方向 - 选择用于计算广告高度的设备屏幕方向。
      • 使用全屏宽度 - 选中此复选框后,横幅广告将占据全屏宽度。如果您取消选中使用全屏宽度选项,则可以调整屏幕的宽度百分比 (50~99%)。
    • 借助自定义,您可以提供横幅宽度和高度。
  • 广告位置 - 选择应放置横幅广告的位置。

回调

您可以实现与广告回调对应的函数。例如,如果您想在横幅广告加载失败时进行处理:

  1. 创建一个与广告回调兼容的函数。

    public void OnBannerAdFailedToLoad(string reason) {
        Debug.Log("Banner ad failed to load: " + reason);
    }
    
  2. 将包含上述函数的脚本附加到场景中的任意 GameObject。

  3. 点击 + 按钮,然后拖放您已将脚本附加到的 GameObject。

  4. 选择要与广告回调相关联的函数。对于参数化广告回调,请选择接受动态变量的函数,以便从 SDK 获取参数值。

通过脚本使用 AdGameObject

从脚本中获取 AdGameObject 实例

所有 AdGameObject 对象都具有便捷方法 LoadAd()。这将使用没有定位的普通 AdRequest 加载广告。要应用定位,您应通过自己配置的广告请求使用 LoadAd(AdRequest adRequest)

要获取 AdGameObject 的实例,请针对每种格式使用以下方法:

MobileAds.Instance.GetAd<BannerAdGameObject>("AD_GAMEOBJECT_NAME");

返回的 BannerAdGameObject 对象还包含便捷方法 Hide()Show()

插页式广告

MobileAds.Instance.GetAd<InterstitialAdGameObject>("AD_GAMEOBJECT_NAME");

返回的 InterstitialAdGameObject 对象具有简便方法 ShowIfLoaded()

已奖励

MobileAds.Instance.GetAd<RewardedAdGameObject>("AD_GAMEOBJECT_NAME");

返回的 RewardedAdGameObject 对象具有简便方法 ShowIfLoaded()

例如,您可以获取 BannerAdGameObject 的实例并按如下方式加载:

using UnityEngine;

using GoogleMobileAds.Api;
using GoogleMobileAds.Placement;

public class BannerTestScript : MonoBehaviour
{
    BannerAdGameObject bannerAd;

    void Start()
    {
        bannerAd = MobileAds.Instance
            .GetAd<BannerAdGameObject>("AD_GAMEOBJECT_NAME");

        bannerAd.LoadAd();
        ...
    }
    ...
}

如果存在一个名为 BannerAdBannerAdGameObject,您可以获取如下所示的实例:

MobileAds.Instance.GetAd<BannerAdGameObject>("BannerAd");

访问 AdGameObject 中的底层广告对象

这些代码段演示了如何访问与 AdGameObject 关联的底层广告对象。

BannerAdGameObject bannerAd = MobileAds.Instance
    .GetAd<BannerAdGameObject>("AD_GAMEOBJECT_NAME");

// Access BannerView object
BannerView bannerView = bannerAd.BannerView;

插页式广告

InterstitialAdGameObject interstitialAdGameObject = MobileAds.Instance
    .GetAd<InterstitialAdGameObject>("AD_GAMEOBJECT_NAME");

// Access InterstitialAd object
InterstitialAd interstitialAd = interstitialAdGameObject.InterstitialAd;

已奖励

RewardedAdGameObject rewardedAdGameObject = MobileAds.Instance
    .Get<RewardedAdGameObject>("AD_GAMEOBJECT_NAME");

// Access RewardedAd object
RewardedAd rewardedAd = rewardedAdGameObject.RewardedAd;

示例

展示插页式广告

以下示例展示了如何配置游戏,以使用 AdGameObject 加载和展示插页式广告。

向场景添加 InterstitialAdGameObject 并启用自动加载功能,以便在场景加载时自动加载广告。

接下来,确保您已按照以下方式初始化 SDK。请注意,如果您忘记初始化 SDK,AdGameObject 中的自动加载功能将不起作用。

然后,通过调用 InterstitialAdGameObject.ShowIfLoaded() 函数在屏幕转换期间展示插页式广告。以下代码展示了在场景转换之间展示插页式广告的示例。

using UnityEngine;
using UnityEngine.SceneManagement;

using GoogleMobileAds.Api;
using GoogleMobileAds.Placement;

public class MainScene : MonoBehaviour
{
    InterstitialAdGameObject interstitialAd;

    void Start()
    {
        interstitialAd = MobileAds.Instance
            .GetAd<InterstitialAdGameObject>("interstitial");

        MobileAds.Initialize((initStatus) => {
            Debug.Log("Initialized MobileAds");
        });
    }

    public void OnClickShowGameSceneButton()
    {
        // Display an interstitial ad
        interstitialAd.ShowIfLoaded();

        // Load a scene named "GameScene"
        SceneManager.LoadScene("GameScene");
    }
}

由于您已在广告展示位置中启用了自动加载功能,因此您无需明确请求广告。当场景发生变化时,如果插页式广告已准备就绪,系统就会展示插页式广告。

如果您想手动请求广告,请在广告展示位置检查器中停用自动加载功能,并改为调用 InterstitialAdGameObject.LoadAd() 函数。以下代码段展示了如何手动请求广告。

public class MainScene : MonoBehaviour
{
    InterstitialAdGameObject interstitialAd;

    void Start()
    {
        interstitialAd = MobileAds.Instance
            .GetAdGameObject<InterstitialAdGameObject>("interstitial");

        MobileAds.Initialize((initStatus) => {
            Debug.Log("MobileAds initialized");

            // Load an interstitial ad after the SDK initialization is complete
            interstitialAd.LoadAd();
        });
    }
    ...
}

处理“观看激励广告”按钮状态

以下示例展示了如何通过广告展示位置启用“观看激励广告”按钮。

向场景中添加一个 Button GameObject(在此示例中名为 Button),它将用于展示激励广告。仅当有可用的激励广告时,此按钮才可用。

Start() 方法中,将按钮的活跃状态更改为 false。这样会使该按钮从场景中消失。

public class MainScene : MonoBehaviour
{
    ...
    void Start()
    {
        GameObject.Find("Button").SetActive(false);
        ...
    }
}

向场景中添加 RewardedAdGameObject,并从下拉列表中选择 AdMob 演示激励广告广告展示位置。

RewardedAdGameObject 检查器的“Callbacks”部分下方,点击 On Ad Loaded() 中的 + 按钮,以允许在加载激励广告时调用该函数。

将您在上一步中添加的 Button GameObject 拖放到无(对象)字段中。从下拉菜单中选择要调用的函数。 依次点击 No Function > GameObject > SetActive(bool),然后点击该复选框,使其将 true 作为参数发送(调用 SetActive(true))。

在此“Callbacks”部分,您还可以关联一个将在触发 RewardedAd.OnUserEarnedReward 事件时调用的事件。如需了解详情,请参阅本部分

接下来,将按钮设置为在用户点击后展示激励广告。在按钮检查器的 On ()“回调”部分中,点击 + 按钮,然后将激励广告展示位置 GameObject(在此示例中名为 Rewarded Ad)拖放到无(对象)字段。

然后,将 RewardedAdGameObject.ShowIfLoaded() 函数附加到按钮的 On Click() 回调中。

最后,别忘了初始化 SDK。以下代码段是本示例中使用的场景的完整代码:

using UnityEngine;

using GoogleMobileAds.Api;

public class MainScene : MonoBehaviour
{
    void Start()
    {
        GameObject.Find("Button").SetActive(false);

        MobileAds.Initialize((initStatus) => {
            Debug.Log("Initialized MobileAds");
        });
    }
}

运行项目后,您会在激励广告加载完毕并准备好展示时在场景中看到按钮。

为 RewardedAdGameObject 配置奖励回调

以下示例展示了如何为激励广告展示位置配置激励广告回调,以便在调用回调函数时向用户提供奖励。

创建一个新脚本,并定义一个接受 Reward 作为参数的函数,如下所示。

using UnityEngine;
using GoogleMobileAds.Api;

class RewardedTestScript : MonoBehaviour {
    ...
    public void OnUserEarnedReward(Reward reward) {
        Debug.Log("OnUserEarnedReward: reward=" +
            reward.Type + ", amount=" + reward.Amount);
    }
    ...
}

RewardedTestScript 脚本附加到场景中的任何 GameObject(广告展示位置 GameObject 除外)。在此示例中,它附加到主相机 GameObject。

向场景添加 RewardedAdGameObject。然后,在 RewardedAdGameObject 检查器的“Callbacks”部分下方,点击 On User Rewarded Reward (Reward) 中的 + 按钮,以便在向用户授予奖励时调用该函数。

将您在上一步中添加的主相机 GameObject 拖放到无(对象)字段。从下拉菜单中选择要调用的函数。依次点击无函数 > RewardedTestScript > OnUserEarnedReward

运行项目并观看激励广告后,如果您因与广告互动而将获得奖励,系统会调用 RewardedTestScript.OnUserEarnedReward()