插屏广告

插屏广告是一种全屏广告格式,嵌入在应用内容中,在自然暂停时显示,例如在游戏关卡之间过渡或完成目标操作时。

当应用呈现插屏广告时,用户有两个选择:点击广告并前往广告商网站或关闭广告并返回应用。

插屏广告中,用户注意力会完全集中在广告上,因此展示成本较高。

本指南将展示如何将插屏广告集成到 Unity 应用中。除了代码示例和说明之外,它还包含特定格式的建议和其他资源的链接。

前提条件

  1. 按照 快速入门 中的流程集成 Yandex Mobile Ads Unity 插件。
  2. 确保您运行的是最新的 Yandex Mobile Ads Unity 插件 版本。如果您使用聚合,请同时确保您运行的是最新版本的 统一构建

实施

集成插屏广告的关键步骤:

  1. 创建 InterstitialAdLoader 广告加载器并注册广告加载事件的监听器。
  2. AdRequestConfiguration 中设置广告加载参数。
  3. 使用 InterstitialAdLoader.LoadAd(AdRequestConfiguration) 方法加载广告。
  4. 如果您使用 Adfox,请传递 其他设置
  5. 注册用户与您的广告互动的事件的监听器。
  6. 通过调用 Interstitial.Show() 方法展示广告。
  7. 释放资源

插屏广告集成的特点

  1. 如果您在 onAdFailedToLoad 事件中收到错误,请不要尝试再次加载新广告。如果没有其他选项,请限制广告加载重试次数。这将有助于避免出现限制时持续出现不成功的请求和连接问题。

  2. 我们建议对所有广告加载使用 InterstitialAdLoader 的单个实例,以提高性能。

分步指南

  1. 在附加到 GameObject的 C# 脚本中创建一个 InterstitialAdLoader 对象,然后注册广告加载事件侦听器。

    using UnityEngine;
    using YandexMobileAds;
    using YandexMobileAds.Base;
    
    public class YandexMobileAdsInterstitialDemoScript : MonoBehaviour
    {
        private InterstitialAdLoader interstitialAdLoader;
        private Interstitial interstitial;
    
        private void SetupLoader()
        {
            interstitialAdLoader = new InterstitialAdLoader();
            interstitialAdLoader.OnAdLoaded += HandleInterstitialLoaded;
            interstitialAdLoader.OnAdFailedToLoad += HandleInterstitialFailedToLoad;
            // ...
        }
    
        public void HandleInterstitialLoaded(object sender, InterstitialAdLoadedEventArgs args)
        {
            // 广告加载成功。现在您可以处理它了。
            interstitial = args.Interstitial;
        }
    
        public void HandleInterstitialFailedToLoad(object sender, AdFailedToLoadEventArgs args)
        {
            // 广告 {args.AdUnitId} 加载失败,原因是 {args.Message}
            // 强烈建议不要尝试从 OnAdFailedToLoad 事件加载新广告。
        }
    }
    
  2. AdRequestConfiguration 中设置广告加载参数。

    string adUnitId = "demo-interstitial-yandex"; // 替换为 "R-M-XXXXXX-Y"
    AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
    

    AdUnitId:在合作伙伴界面中发布的唯一标识符,格式为:RM-XXXXXX-Y。

    提示

    出于测试目的,您可以使用演示单元 ID:"demo-interstitial-yandex"。在发布广告之前,请确保将演示单元 ID 替换为真实的广告单元 ID。

    您可以通过 AdRequestConfiguration.Builder 传递用户兴趣、上下文应用数据、位置详细信息或其他数据来扩展广告请求参数。在请求中提供额外的上下文数据可以显著提高您的广告质量。

  3. 使用 LoadAd 方法加载广告,并将 AdRequestConfiguration 作为参数传递。

    interstitialAdLoader.LoadAd(adRequestConfiguration);
    
  4. 注册用户与您的广告互动的事件的监听器。

    using System;
    
    // ...
    interstitial.OnAdClicked += HandleAdClicked;
    interstitial.OnAdShown += HandleInterstitialShown;
    interstitial.OnAdFailedToShow += HandleInterstitialFailedToShow;
    interstitial.OnAdImpression += HandleImpression;
    interstitial.OnAdDismissed += HandleInterstitialDismissed;
    // ...
    
    public void HandleAdClicked(object sender, EventArgs args)
    {
        // 记录广告点击时调用。
    }
    
    public void HandleInterstitialShown(object sender, EventArgs args)
    {
        // 广告展示时调用。
    }
    
    public void HandleInterstitialFailedToShow(object sender, AdFailureEventArgs args)
    {
        // 当 InterstitialAd 未能显示时调用。
    }
    
    public void HandleInterstitialDismissed(object sender, EventArgs args)
    {
        // 广告关闭时调用。
    }
    
    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // 记录广告展示次数时调用。
    }
    
  5. 通过在 Interstitial 对象上调用Show() 来展示广告。

    if (interstitial != null)
    {
        interstitial.Show();
    }
    
  6. 对显示的广告调用 Destroy(),并清除当前屏幕上不再使用的链接。

    这可以释放资源并防止内存泄漏。

    public void DestroyInterstitial()
    {
        if (interstitial != null)
        {
            interstitial.Destroy();
            interstitial = null;
        }
    }
    

测试插屏广告集成

使用演示广告单元进行广告测试

我们建议使用测试广告来测试您的插屏广告集成和应用本身。

为了保证为每个广告请求返回测试广告,我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。

演示广告单元 ID:demo-interstitial-yandex

重要

确保在将应用发布到商店之前,您已将演示广告版位 ID 替换为在 PI 中获取的真实广告版位 ID。

您可以在 用于测试的演示广告单元 版块找到可用的演示广告版位 ID 列表。

测试广告集成

您可以使用 SDK 的内置分析器检查插屏广告集成。

该工具可确保您的插屏广告正确集成,并向日志输出详细报告。 要查看报告,请在用于 Android 应用程序调试的 Logcat 工具中搜索“YandexAds”关键字。

adb logcat -v brief '*:S YandexAds'

如果集成成功,您将看到以下消息:

adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type interstitital was integrated successfully

如果您在集成插屏广告时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。

使用演示广告单元进行广告测试

我们建议使用测试广告来测试您的广告集成和应用本身。

为了保证为每个广告请求返回测试广告,我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。

演示广告单元 ID:demo-interstitial-yandex

重要

确保在将应用发布到商店之前,您已将演示广告版位 ID 替换为在 PI 中获取的真实广告版位 ID。

您可以在 用于测试的演示广告单元 部分找到可用的演示广告版位 ID 列表。

测试广告集成

您可以使用本机控制台工具测试广告集成。

要查看详细日志,请调用 YMAMobileAds 类的 enableLogging 方法。

YMAMobileAds.enableLogging()

要查看 SDK 日志,请前往控制台工具并设置 sybsystem = com.yandex.mobile.ads.sdk。您还可以按类别和错误级别过滤日志。

如果您在集成广告时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。

提示

广告预加载

加载广告可能需要几秒钟的时间,具体取决于移动聚合中对接的广告网络数量和用户的互联网速度。我们建议在展示广告之前预加载广告。

您可以在 gameObjectAwake 方法中调用广告加载。确保使用 DontDestroyOnLoad() 调用保留场景之间的对象。这可确保加载的广告不会在场景更改时因 gameObject 而被删除。

private void Awake()
{
    SetupLoader();
    RequestInterstitial();
    DontDestroyOnLoad(gameObject);
}

除此之外,您还可以将下一个广告的加载绑定到广告展示完成或失败时运行的回调函数。如下所示:

public void HandleInterstitialFailedToShow(object sender, EventArgs args)
{
    // 当 InterstitialAd 未能显示时调用。

    // 广告关闭后清除资源。
    DestroyInterstitial();

    // 现在您可以预加载下一个插屏广告。
    RequestInterstitial();
}

public void HandleInterstitialDismissed(object sender, EventArgs args)
{
    // 广告关闭时调用。

    // 广告关闭后清除资源。
    DestroyInterstitial();

    // 现在您可以预加载下一个插屏广告。
    RequestInterstitial();
}

如果您在太多不太可能显示的屏幕上缓存广告,您的广告效果可能会下降。例如,如果用户每次会话完成 2-3 个游戏关卡,则您不应缓存 6-7 个屏幕的广告。否则,您的广告可见性可能会降低,并且广告系统可能会降低您的应用的优先级。

为确保您为应用找到良好的平衡,请在合作伙伴界面中跟踪“展示次数份额”或“已观看展示次数份额”指标。如果该指标低于 20%,您可能需要修改缓存算法。展示次数百分比越高越好。

完整代码示例

using System;
using UnityEngine;
using UnityEngine.UI;
using YandexMobileAds;
using YandexMobileAds.Base;

public class YandexMobileAdsInterstitialDemoScript : MonoBehaviour
{
    private InterstitialAdLoader interstitialAdLoader;
    private Interstitial interstitial;
    private Button button;

    private void Awake()
    {
        SetupLoader();
        RequestInterstitial();
        DontDestroyOnLoad(gameObject);
        button.onClick.AddListener(ShowInterstitial);
    }

    private void SetupLoader()
    {
        interstitialAdLoader = new InterstitialAdLoader();
        interstitialAdLoader.OnAdLoaded += HandleInterstitialLoaded;
        interstitialAdLoader.OnAdFailedToLoad += HandleInterstitialFailedToLoad;
    }

    private void RequestInterstitial()
    {
        string adUnitId = "demo-interstitial-yandex"; // 替换为 "R-M-XXXXXX-Y"
        AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
        interstitialAdLoader.LoadAd(adRequestConfiguration);
    }

    private void ShowInterstitial()
    {
        if (interstitial != null)
        {
            interstitial.Show();
        }
    }

    public void HandleInterstitialLoaded(object sender, InterstitialAdLoadedEventArgs args)
    {
        // 广告加载成功。现在您可以处理它了。
        interstitial = args.Interstitial;

        // 为广告操作添加事件处理程序
        interstitial.OnAdClicked += HandleAdClicked;
        interstitial.OnAdShown += HandleInterstitialShown;
        interstitial.OnAdFailedToShow += HandleInterstitialFailedToShow;
        interstitial.OnAdImpression += HandleImpression;
        interstitial.OnAdDismissed += HandleInterstitialDismissed;
    }

    public void HandleInterstitialFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        // 广告 {args.AdUnitId} 加载失败,原因是 {args.Message}
        // 强烈建议不要尝试从 OnAdFailedToLoad 事件加载新广告。
    }

    public void HandleInterstitialDismissed(object sender, EventArgs args)
    {
        // 广告关闭时调用。

        // 广告关闭后清除资源。
        DestroyInterstitial();

        // 现在您可以预加载下一个插屏广告。
        RequestInterstitial();
    }

    public void HandleInterstitialFailedToShow(object sender, EventArgs args)
    {
        // 当 InterstitialAd 未能显示时调用。

        // 广告关闭后清除资源。
        DestroyInterstitial();

        // 现在您可以预加载下一个插屏广告。
        RequestInterstitial();
    }

    public void HandleAdClicked(object sender, EventArgs args)
    {
        // 记录广告点击时调用。
    }

    public void HandleInterstitialShown(object sender, EventArgs args)
    {
        // 广告展示时调用。
    }

    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // 记录广告展示次数时调用。
    }

    public void DestroyInterstitial()
    {
        if (interstitial != null)
        {
            interstitial.Destroy();
            interstitial = null;
        }
    }
}

其他资源