Ad Manager 发布商还可以通过自行指定一系列素材资源来创建自己的原生广告格式。这类格式称为自定义原生广告格式,可以用于预订型广告。借助自定义原生广告,发布商可以将任意图片和字符串数据传递到其应用。此类数据由 CustomNativeAd 对象表示。
加载自定义原生广告
自定义原生广告是使用 AdLoader 对象加载的。ForCustomNativeAd() 方法会将 AdLoader 配置为处理自定义原生广告。此方法有以下两个参数:
- AdLoader应请求的自定义广告的- formatId。每种自定义的原生广告格式都具有与其相关联的格式 ID 值。此参数指示您的应用希望- AdLoader请求哪种格式。
- 用户点击广告时要调用的 Action<CustomNativeAd, string>(可选)。
自定义原生广告通过 AdLoader 类加载,该类有自己的 AdLoader.Builder 类,可在广告制作过程中对广告进行自定义。ForCustomNativeAd() 方法会将 AdLoader 配置为处理原生广告。
void LoadCustomNativeAd()
{
    AdLoader adLoader = new AdLoader.Builder("/21775744923/example/native")
            .ForCustomNativeAd("10063170")
            .Build();
    adLoader.LoadAd(new AdRequest.Builder().Build());
}
由于单个广告单元可以设置为投放多种自定义原生广告格式,因此可以使用不同的格式 ID 多次调用 ForCustomNativeAd(),以便使广告加载程序为可能存在的多种自定义原生广告格式做好准备。
自定义原生广告事件
AdLoader 类提供了类型为 EventHandler 的广告事件,以便向您发送自定义的原生广告的生命周期通知。下面的示例展示了如何在广告加载程序上注册自定义原生广告事件:
private AdLoader adLoader;
adLoader.OnCustomNativeAdLoaded += HandleCustomNativeAdLoaded;
adLoader.OnAdFailedToLoad += HandleCustomNativeAdFailedToLoad;
HandleCustomNativeAdLoaded() 方法包含 CustomNativeAdEventArgs 参数。您可以通过此事件参数访问已加载的自定义原生广告,如下所示:
void HandleCustomNativeAdLoaded(object sender, CustomNativeAdEventArgs args)
{
    this.customNativeAd = args.nativeAd;
}
HandleCustomNativeAdFailedToLoad() 方法包含 AdFailedToLoadEventArgs 参数。可以通过对 LoadAdError 字段调用 GetMessage 方法来访问错误消息,如下所示:
void HandleCustomNativeAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
    string message = args.LoadAdError.GetMessage();
    Debug.Log("Ad Loader fail event received with message: " + message);
}
展示自定义原生广告格式
自定义原生广告支持任意数量的用户指定的图片和文字素材资源。这些素材资源可通过 CustomNativeAd 类访问,该类提供以格式字段的变量 ID 作为参数的 GetTexture2D() 和 GetText() 方法。
以下是从自定义原生广告中访问素材资源的实现示例:
private bool adLoaded;
private Texture2D mainImageTexture;
private string headline;
private CustomNativeAd customNativeAd;
...
void Update()
{
    if(adLoaded)
    {
        mainImageTexture = customNativeAd.GetTexture2D("MainImage");
        headline = customNativeAd.GetText("Headline");
        adLoaded = false;
    }
}
...
void HandleCustomNativeAdLoaded(object sender, CustomNativeAdEventArgs args)
{
    customNativeAd = args.nativeAd;
    adLoaded = true;
    ...
}
处理自定义原生广告的展示次数和点击次数
使用自定义原生广告时,您的应用负责记录展示次数并向 SDK 报告点击事件。
记录展示次数
要记录自定义广告的展示次数,只需在相应 CustomNativeAd 上调用 RecordImpression() 方法:
customNativeAd.RecordImpression();
报告点击次数
要向 SDK 报告素材资源上发生了点击,请在相应的 CustomNativeAd 上调用 PerformClick() 方法,并传递获得点击的素材资源的名称。例如,如果您的自定义广告格式中有一个名为“MainImage”的素材资源,并且您希望报告与该素材资源对应的纹理上的点击,则代码大致会如下所示:
customNativeAd.PerformClick("MainImage");
响应自定义点击操作
当报告自定义广告上发生的点击时,系统将尝试按以下顺序从 SDK 获取可能的响应:
- 找到广告的深层链接网址的内容解析器,并启动第一个能够解析网址的内容解析器。 
- 打开浏览器并导航到广告的传统目标网址。 
如果您想自行处理自定义原生广告格式的点击操作,而不是让用户转到深层链接或网络浏览器,请在 AdLoader.Builder.ForCustomNativeAd() 方法中提供 Action<CustomNativeAd, string>(可选)。通过设置此自定义点击操作,您就可以替换 SDK 的点击行为。以下示例展示了如何使用自定义点击操作记录给定素材资源的点击:
private void LoadCustomNativeAd()
{
    AdLoader adLoader = new AdLoader.Builder("/21775744923/example/native")
            .ForCustomNativeAd("10063170", HandleCustomNativeAdClicked)
            .Build();
    adLoader.OnCustomNativeAdLoaded += HandleCustomNativeAdLoaded;
    adLoader.LoadAd(createAdRequest());
}
private void HandleCustomNativeAdClicked(CustomNativeAd customNativeAd, string assetName)
{
    Debug.Log("Custom Native ad asset with name " + assetName + " was clicked.");
}