激励广告

激励广告是一种受欢迎的全屏广告格式,用户观看广告后会获得奖励。

这种广告类型的显示由用户激活,例如,为了在游戏中获得奖励或额外生命。

高度的用户积极性使得这种广告格式成为免费应用中最受欢迎和最具盈利性的广告格式。

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

前提条件

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

实施

集成激励广告的关键步骤:

  1. 创建 RewardedAdLoader 广告加载器并注册广告加载事件的监听器。
  2. AdRequestConfiguration 中设置广告加载参数。
  3. 使用 RewardedAdLoader.LoadAd(AdRequestConfiguration) 方法加载广告。
  4. 注册用户与您的广告互动的事件的监听器。
  5. 通过调用 RewardedAd.Show() 方法展示广告。
  6. 释放资源

激励广告集成的特点

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

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

分步指南

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

    using UnityEngine;
    using YandexMobileAds;
    using YandexMobileAds.Base;
    
    public class YandexMobileAdsRewardedAdDemoScript : MonoBehaviour
    {
        private RewardedAdLoader rewardedAdLoader;
        private RewardedAd rewardedAd;
    
        private void SetupLoader()
        {
            rewardedAdLoader = new RewardedAdLoader();
            rewardedAdLoader.OnAdLoaded += HandleAdLoaded;
            rewardedAdLoader.OnAdFailedToLoad += HandleAdFailedToLoad;
            // ...
        }
    
        public void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
        {
            // 激励广告已成功加载。现在您可以处理它了。
            rewardedAd = args.RewardedAd;
        }
    
        public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
        {
            // 广告 {args.AdUnitId} 加载失败,原因是 {args.Message}
            // 强烈建议不要尝试从 OnAdFailedToLoad 事件加载新广告。
        }
    }
    
  2. AdRequestConfiguration 中设置广告加载参数。

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

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

    提示

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

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

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

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

    using System;
    
    // ...
    rewardedAd.OnAdClicked += HandleAdClicked;
    rewardedAd.OnAdShown += HandleAdShown;
    rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
    rewardedAd.OnAdImpression += HandleImpression;
    rewardedAd.OnAdDismissed += HandleAdDismissed;
    rewardedAd.OnRewarded += HandleRewarded;
    // ...
    
    public void HandleAdClicked(object sender, EventArgs args)
    {
        // 当记录激励广告点击时调用。
    }
    
    public void HandleAdShown(object sender, EventArgs args)
    {
        // 广告展示时调用。
    }
    
    public void HandleAdFailedToShow(object sender, AdFailureEventArgs args)
    {
        // 广告展示失败时调用。
    }
    
    public void HandleAdDismissed(object sender, EventArgs args)
    {
        // 广告关闭时调用。
    }
    
    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // 记录广告展示次数时调用。
    }
    
    public void HandleRewarded(object sender, Reward args)
    {
        // 当用户可以获得 {args.type} 和 {args.amount} 奖励时调用。
    }
    
  5. 通过在 RewardedAd 对象上调用 Show() 来展示广告。

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

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

    public void DestroyRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
    }
    

测试激励广告集成

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

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

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

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

重要

在商店中发布您的应用之前,请确保将演示广告版位 ID 替换为从 Partner Interface 获取的真实广告版位 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 rewarded was integrated successfully

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

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

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

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

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

重要

在将您的应用发布到商店之前,请确保将演示广告单元 ID 替换为从 Partner Interface 获取的真实 ID。

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

测试广告集成

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

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

YMAMobileAds.enableLogging()

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

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

提示

广告预加载

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

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

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

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

public void HandleAdFailedToShow(object sender, EventArgs args)
{
    // 广告展示失败时调用。

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

    // 现在您可以预加载下一个激励广告。
    RequestRewardedAd();
}

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

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

    // 现在您可以预加载下一个激励广告。
    RequestRewardedAd();
}

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

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

完整代码示例

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

public class YandexMobileAdsRewardedAdDemoScript : MonoBehaviour
{
    private RewardedAdLoader rewardedAdLoader;
    private RewardedAd rewardedAd;
    private Button button;

    private void Awake()
    {
        SetupLoader();
        RequestRewardedAd();
        DontDestroyOnLoad(gameObject);
        button.onClick.AddListener(ShowRewardedAd);
    }

    private void SetupLoader()
    {
        rewardedAdLoader = new RewardedAdLoader();
        rewardedAdLoader.OnAdLoaded += HandleAdLoaded;
        rewardedAdLoader.OnAdFailedToLoad += HandleAdFailedToLoad;
    }

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

    private void ShowRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Show();
        }
    }

    public void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
    {
        // 广告加载成功。现在您可以处理它了。
        rewardedAd = args.RewardedAd;

        // 为广告操作添加事件处理程序
        rewardedAd.OnAdClicked += HandleAdClicked;
        rewardedAd.OnAdShown += HandleAdShown;
        rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
        rewardedAd.OnAdImpression += HandleImpression;
        rewardedAd.OnAdDismissed += HandleAdDismissed;
        rewardedAd.OnRewarded += HandleRewarded;
    }

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

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

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

        // 现在您可以预加载下一个激励广告。
        RequestRewardedAd();
    }

    public void HandleAdFailedToShow(object sender, AdFailureEventArgs args)
    {
        // 激励广告展示失败时调用。

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

        // 现在您可以预加载下一个激励广告。
        RequestRewardedAd();
    }

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

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

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

    public void HandleRewarded(object sender, Reward args)
    {
        // 当用户可以获得 {args.type} 和 {args.amount} 奖励时调用。
    }

    public void DestroyRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
    }
}

其他资源

上一篇
下一篇