开始使用

本指南介绍了如何使用原生广告插件植入 AdMob 原生广告 以及在此过程中需要考虑的一些重要事项。

原生广告无论是在形式上还是功能上都与用户体验相匹配 它们的放置位置。原生广告在视觉设计上与投放到的应用也如出一辙。 借助 AdMob 的原生广告格式,发布商能够呈现 与内容关联。您可以使用此技术实现高度自定义的广告呈现 充分利用 Unity 应用中的原生代码。

展示原生广告时所使用的GameObjects类型 已经构建应用,并且可以设置格式, 影响用户的体验加载原生广告时 会收到一个包含其资源和 Unity 应用的原生对象(而不是 显示它们。

前提条件

  • Google 移动广告 Unity 插件 7.0.0 或更高版本。
  • 完成入门指南
  • 下载 并安装原生广告插件

加载原生广告格式

原生广告通过 AdLoader 类加载,该类拥有自己的 AdLoader.Builder 类,以便在创建过程中对其进行自定义。ForNativeAd() 方法会将 AdLoader 配置为处理原生广告。

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

注册 AdLoader 广告事件

要在原生广告加载成功或加载失败时收到通知,请将 委托给下列事件的 AdLoader 类。

OnNativeAdLoaded

在原生广告成功加载时调用。必须具有 该事件的代理来访问已加载的广告。

OnAdFailedToLoad

在原生广告加载失败时调用。

加载广告

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

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

汇总广告请求

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

private void RequestNativeAd() {
    AdLoader adLoader = new AdLoader.Builder(INSERT_AD_UNIT_HERE)
        .ForNativeAd()
        .Build();
    adLoader.OnNativeAdLoaded += this.HandleNativeAdLoaded;
    adLoader.OnAdFailedToLoad += this.HandleAdFailedToLoad;
    adLoader.LoadAd(new AdRequest.Builder().Build());
}

处理失败的广告加载

OnAdFailedToLoad 事件的类型为 EventHandle<AdFailedToLoadEventArgs>。 下面显示了从此事件中解析广告加载失败的原因。

private void RequestNativeAd() {
    ...
    adLoader.OnAdFailedToLoad += this.HandleNativeAdFailedToLoad;
}

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

展示原生广告

加载原生广告时,系统会调用相应广告格式的广告事件。 然后,就由您的应用负责展示广告了,尽管它不会 必须立即处理

处理广告加载

OnNativeAdLoaded 事件的类型为 EventHandler<NativeAdEventArgs>。通过 封装在 NativeAd 对象中的广告,可以从 NativeAdEventArgs,如下所示:

private NativeAd nativeAd;
...
private void HandleNativeAdLoaded(object sender, NativeAdEventArgs args) {
    Debug.Log("Native ad loaded.");
    this.nativeAd = args.nativeAd;
}

获取原生广告素材资源

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

private bool nativeAdLoaded;
private NativeAd nativeAd;

void Update() {
    ...

    if (this.nativeAdLoaded) {
        this.nativeAdLoaded = false;
        // Get Texture2D for the 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 HandleNativeAdLoaded(object sender, NativeAdEventArgs args) {
    Debug.Log("Native ad loaded.");
    this.nativeAd = args.nativeAd;
    this.nativeAdLoaded = true;
}

请注意,广告素材资源只能在主线程上访问,例如, 从 Unity 脚本的 Update() 方法中调用。另请注意,以下素材资源 并不一定存在, 显示:

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

“广告选择”素材资源

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

为广告素材资源注册 GameObject

您必须注册 GameObject,才能在 Unity 应用。如果注册成功,将使用注册 GameObject 会返回 bool。对于 List<GameObject>,该方法会返回 int 表示成功注册的 GameObject 数量。

如果广告素材资源注册失败, 则无法识别相应的原生广告。

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

为广告素材资源注册的 GameObject 必须具有凸形 Collider 代表 GameObject 的尺寸和形状的组件。如果 注册到广告素材资源的 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 nativeAdLoaded;
private NativeAd nativeAd;
...
void Update() {
    ...

    if (this.nativeAdLoaded) {
        this.nativeAdLoaded = 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 HandleNativeAdLoaded(object sender, NativeAdEventArgs args) {
    Debug.Log("Native ad loaded.");
    this.nativeAd = args.nativeAd;
    this.nativeAdLoaded = true;
}