原生高级广告(统一)

本指南介绍了如何使用 Google 移动广告 Unity 插件在 Unity 应用中植入 AdMob 原生高级广告,以及在这一过程中需要注意的一些重要事项。

原生广告无论是在形式上还是功能上都与广告投放到的内容相契合,可为用户带来浑然一体的体验。原生广告在视觉设计上与投放到的应用也如出一辙。借助 AdMob 的原生高级广告格式,发布商能够呈现与内容结合得天衣无缝的广告。通过原生广告技术,您可以充分利用 Unity 应用中的原生代码以高度定制的方式呈现广告。

原生高级广告在展示时使用的 GameObjects 类型与您已用于开发应用的类型相同,而且能以和周围视觉设计相称的形式呈现,让用户有浑然一体的使用体验。加载原生广告时,您的应用会收到一个包含其素材资源的原生对象,然后就由此 Unity 应用(而不是 SDK)进行展示。

标准的原生高级广告字段说明有两种:应用安装和内容。两者均由 UnifiedNativeAd 表示,并且此对象包含了原生广告的素材资源。某些素材资源可能不存在,因此请在展示之前检查它们是否存在。您可以查看客户成功案例:案例研究 1案例研究 2

前提条件

加载原生广告格式

原生高级广告通过 AdLoader 类加载,该类有自己的 AdLoader.Builder 类,可在广告创建过程中对广告进行自定义。ForUnifiedNativeAd() 方法会将 AdLoader 配置为处理统一原生广告。

private void RequestNativeAd() {
    AdLoader adLoader = new AdLoader.Builder(INSERT_AD_UNIT_HERE)
        .ForUnifiedNativeAd()
        .Build();
}

注册 AdLoader 广告事件

要在原生高级广告加载成功或加载失败时收到通知,请将代理添加到下列事件的 AdLoader 类中。

OnUnifiedNativeAdLoaded
在统一原生广告成功加载时调用。必须为此事件添加代理,以便访问已加载的广告。
OnAdFailedToLoad
在原生广告未能加载时调用。

加载广告

构建完 AdLoader 后,即可调用其 LoadAd() 方法来请求广告:

adLoader.LoadAd(new AdRequest.Builder().Build());

汇总广告请求

以下代码段演示了如何构建 AdLoader 并配置为请求统一原生广告,如何为成功和失败的广告加载设置代理,以及如何发出广告请求。

private void RequestNativeAd() {
    AdLoader adLoader = new AdLoader.Builder(INSERT_AD_UNIT_HERE)
        .ForUnifiedNativeAd()
        .Build();
    adLoader.OnUnifiedNativeAdLoaded += this.HandleUnifiedNativeAdLoaded;
    adLoader.LoadAd(new AdRequest.Builder().Build());
}

处理失败的广告加载

OnAdFailedToLoad 事件的类型为 EventHandler<AdFailedToLoadEventArgs>。以下代码分析了此事件中广告加载失败的原因。

private void HandleNativeAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) {
    MonoBehaviour.print("Native ad failed to load: " + args.Message);
}

展示广告

加载原生高级广告时,系统会调用相应广告格式的广告事件。然后,就由您的应用负责展示广告了,尽管不一定要立即展示广告。

处理广告加载

OnUnifiedNativeAdLoaded 事件的类型为 EventHandler<UnifiedNativeAdEventArgs>。可以从 UnifiedNativeAdEventArgs 获取封装在 UnifiedNativeAd 对象中的广告,如下所示:

private UnifiedNativeAd nativeAd;
...
private void HandleUnifiedNativeAdLoaded(object sender, UnifiedNativeAdEventArgs args) {
    MonoBehaviour.print("Unified Native ad loaded.");
    this.nativeAd = args.nativeAd;
}

获取原生广告素材资源

广告加载后,可以对其素材资源进行访问,如下所示。图片素材资源会作为 Texture2D 对象返回,文字素材资源会作为 string 对象返回。

private bool unifiedNativeAdLoaded;
private UnifiedNativeAd nativeAd;
...
void Update() {
    ...

    if (this.unifiedNativeAdLoaded) {
        this.unifiedNativeAdLoaded = false;
        // Get Texture2D for icon asset of native ad.
        Texture2D iconTexture = this.nativeAd.GetIconTexture();

        // Get string for headline asset of native ad.
        string headline = this.nativeAd.GetHeadlineText();
    }
}
...

private void HandleUnifiedNativeAdLoaded(object sender, UnifiedNativeAdEventArgs args) {
    MonoBehaviour.print("Unified native ad loaded.");
    this.nativeAd = args.nativeAd;
    this.unifiedNativeAdLoaded = true;
}

请注意,只应在主线程上访问广告素材资源,例如,从 Unity 脚本的 Update() 方法访问。另请注意,并不保证以下素材资源总是存在,所以应在展示前对此进行检查:

  • GetStarRating()
  • GetStore()
  • GetPrice()
  • GetAdvertiser()
  • GetIconTexture()

广告选择素材资源

根据要求,广告选择素材资源只能作为原生高级广告的一部分进行展示。此外,广告选择素材资源一定要显眼易见,因此请选择适当的背景颜色和图片。

为广告素材资源注册 GameObjects

对于要展示的每个广告素材资源,您都必须注册 GameObject,供在 Unity 应用中展示该素材资源使用。为广告素材资源注册 的每个方法都会返回一个 bool,以指示注册是否成功。如果广告素材资源注册失败,则无法识别相应原生广告获得的展示和点击。

if (!this.nativeAd.RegisterIconImageGameObject(icon))
{
    // Handle failure to register ad asset.
}

为广告素材资源注册的 GameObject 必须具有代表 的大小和形状的凸起 Collider 组件。如果给广告素材资源注册的 GameObject 对象缺少 Collider 组件或该组件配置不正确,则原生高级广告将无法正常运行。

在以下代码段中,BoxCollider 被添加到 GameObject 对象,该对象使用 TextMesh 来展示原生广告的标题广告素材资源。BoxCollider 附加到 GameObject 后会自动扩缩,以适应 TextMesh 组件的文字。

// Create GameObject that will display the headline ad asset.
GameObject headline = new GameObject();
headline.AddComponent<TextMesh>();
headline.GetComponent<TextMesh>().characterSize = 0.5 f;
headline.GetComponent<TextMesh>().anchor = TextAnchor.MiddleCenter;
headline.GetComponent<TextMesh>().color = Color.black;

// Get string of the headline asset.
string headlineText = this.nativeAd.GetHeadlineText();
headline.GetComponent<TextMesh>().text = headlineText;

// Add box collider to the GameObject which will automatically scale.
headline.AddComponent<BoxCollider>();

演示

以下代码演示了如何获取已成功加载的原生广告的图标素材资源,如何通过设置 Quad 的纹理来展示图标广告素材资源,以及如何注册 GameObject 供展示该素材资源使用。对于应用展示的每项素材资源,都应为其重复上述过程,即获取相应广告素材资源并向原生广告类注册它。

private GameObject icon;
private bool unifiedNativeAdLoaded;
private UnifiedNativeAd nativeAd;
...
void Update() {
    ...

    if (this.unifiedNativeAdLoaded) {
        this.unifiedNativeAdLoaded = false;
        // Get Texture2D for icon asset of native ad.
        Texture2D iconTexture = this.nativeAd.GetIconTexture();

        icon = GameObject.CreatePrimitive(PrimitiveType.Quad);
        icon.transform.position = new Vector3(1, 1, 1);
        icon.transform.localScale = new Vector3(1, 1, 1);
        icon.GetComponent<Renderer>().material.mainTexture = iconTexture;

        // Register GameObject that will display icon asset of native ad.
        if (!this.nativeAd.RegisterIconImageGameObject(icon))
        {
            // Handle failure to register ad asset.
        }
    }
}
...

private void HandleUnifiedNativeAdLoaded(object sender, UnifiedNativeAdEventArgs args) {
    MonoBehaviour.print("Unified native ad loaded.");
    this.nativeAd = args.nativeAd;
    this.unifiedNativeAdLoaded = true;
}