---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/unity/rewarded.md
  - https://ads.yandex.com/helpcenter/pt/dev/unity/rewarded.md
  - https://ads.yandex.com/helpcenter/ru/dev/unity/rewarded.md
  - https://ads.yandex.com/helpcenter/zh/dev/unity/rewarded.md
  - href: zh/dev/unity/rewarded.md
    type: text/markdown
    title: Markdown version
  - href: llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/zh/llms.txt

# 激励广告

<!-- source: zh/dev/_includes/rewarded.md -->
激励广告是一种受欢迎的全屏广告格式，用户观看广告后会获得奖励。
<!-- endsource: zh/dev/_includes/rewarded.md -->

<!-- source: zh/dev/_includes/rewarded.md -->
广告展示采用主动选择机制：例如，用户可以主动触发广告以获取游戏奖励或额外生命值。
<!-- endsource: zh/dev/_includes/rewarded.md -->

<!-- source: zh/dev/_includes/rewarded.md -->
强烈的用户动机使这种广告格式成为免费应用中最受欢迎且盈利能力最强的广告格式。
<!-- endsource: zh/dev/_includes/rewarded.md -->

{% cut "外观" %}

{% list tabs %}

- 文字和图片广告

  <iframe width="200" height="405.5" allow="autoplay" src="https://runtime.strm.yandex.ru/player/video/vplvwvhqbegh6vee44kp?autoplay=1&mute=0&loop=1" frameborder="0" allowfullscreen></iframe>

- 视频广告

  <iframe width="200" height="405.5" allow="autoplay" src="https://runtime.strm.yandex.ru/player/video/vplvozdigmqlrtjfki7o?autoplay=1&mute=0&loop=1" frameborder="0" allowfullscreen></iframe>

{% endlist %}

{% endcut %}

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

## 前提条件 {#pre}

<!-- source: zh/dev/_includes/pre-unity.md -->
1. 按照 [快速入门](https://ads.yandex.com/helpcenter/zh/dev/unity/quick-start.md) 中的流程集成 Yandex Mobile Ads Unity 插件。
2. 确保您运行的是最新的 [Yandex Mobile Ads Unity 插件](https://ads.yandex.com/helpcenter/zh/dev/platforms.md) 版本。如果您使用聚合，请同时确保您运行的是最新版本的 [统一构建](https://ads.yandex.com/helpcenter/zh/dev/platforms.md)。
<!-- endsource: zh/dev/_includes/pre-unity.md -->

## 实施 {#implement}

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

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

## 激励广告集成的特点 {#features}

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

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

## 分步指南

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

   ```c#
   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` 中设置广告加载参数。

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

   `AdUnitId`：在 Yandex Advertising Network 界面中发布的唯一标识符，如下所示：R-M-XXXXXX-Y。

   {% note tip %}

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

   您可以通过 `AdRequestConfiguration.Builder` 传递用户兴趣、上下文应用数据、位置详细信息或其他数据来扩展广告请求参数。在请求中提供额外的上下文数据可以显著提高您的广告质量。请参阅[广告定位](https://ads.yandex.com/helpcenter/zh/dev/unity/target.md)版块了解更多信息。

   {% endnote %}

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

   ```c#
   rewardedAdLoader.LoadAd(adRequestConfiguration);
   ```

4. 注册用户与您的广告互动的事件的监听器。

   ```c#
   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()` 来展示广告。

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

6. 对显示的广告调用 `Destroy()`，并清除当前屏幕上不再使用的链接。

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

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

## 测试激励广告集成 {#test}

{% list tabs %}

- Android

   <!-- source: zh/dev/_includes/test-android-rewarded.md -->
   ### 使用演示广告单元进行广告测试 {#demo-blocks}

   使用测试广告来检查您的激励广告集成和应用本身。为了确保每次广告请求都能返回测试广告，您可以使用一个特殊的演示广告版位 ID。

   演示广告单元 ID：`demo-rewarded-yandex`。

   {% note warning %}

   在应用商店发布应用前，请务必将演示广告版位 ID 替换为您在 Yandex Advertising Network 接口中获取的真实 ID。

   {% endnote %}

   有关所有可用演示广告版位 ID 的列表，请参阅[用于测试的演示广告单元](https://ads.yandex.com/helpcenter/zh/dev/android/demo-blocks.md)。

   ### 测试广告集成 {#test-int}

   您可以使用 SDK 的内置分析工具检查激励广告是否已正确集成。日志中将显示包含测试结果的详细报告。

   要查看报告，请在 Android 应用调试工具 [Logcat](https://developer.android.com/studio/command-line/logcat) 中搜索关键词“YandexAds”。
   ```bash
   adb logcat -v brief '*:S YandexAds'
   ```

   如果集成成功，将返回以下消息：
   ```bash
   adb logcat -v brief '*:S YandexAds'
   mobileads$ adb logcat -v brief '*:S YandexAds'
   I/YandexAds(13719): [Integration] Ad type rewarded was integrated successfully
   ```

   如果存在任何激励广告集成问题，您将收到详细的问题报告和故障排除建议。
   <!-- endsource: zh/dev/_includes/test-android-rewarded.md -->

- iOS

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

   <!-- source: zh/dev/_includes/test-ios-rewarded.md -->
   我们建议使用测试广告来测试您的广告集成和应用本身。

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

   演示广告单元 ID：`demo-rewarded-yandex`。

   {% note warning %}

   在商店中发布您的应用程序之前，确保将演示版位 ID 替换为您在 Yandex Advertising Network 界面中获得的真实 ID。

   {% endnote %}

   您可以在 [用于测试的演示广告单元](https://ads.yandex.com/helpcenter/zh/dev/ios/demo-blocks.md) 版块找到可用的演示广告版位 ID 列表。
   <!-- endsource: zh/dev/_includes/test-ios-rewarded.md -->

   ### 测试广告集成

   <!-- source: zh/dev/_includes/test-integration-ios.md -->
   您可以使用本机控制台工具测试广告集成。

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

   ```swift
   YMAMobileAds.enableLogging()
   ```

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

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

   <img src= "https://yastatic.net/s3/doc-binary/src/dev/mobile-ads/common/integration-ios-2.png">
   <!-- endsource: zh/dev/_includes/test-integration-ios.md -->

{% endlist %}

## 提示

### 广告预加载

<!-- source: zh/dev/_includes/preload.md -->
加载广告可能需要几秒钟的时间，具体取决于移动聚合中对接的广告网络数量和用户的互联网速度。我们建议在展示广告之前预加载广告。
<!-- endsource: zh/dev/_includes/preload.md -->

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

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

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

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

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

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

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

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

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

<!-- source: zh/dev/_includes/cash-ads.md -->
如果您在太多不太可能显示的屏幕上缓存广告，您的广告效果可能会下降。例如，如果用户每次会话完成 2-3 个游戏关卡，则您不应缓存 6-7 个屏幕的广告。否则，您的广告可见性可能会降低，并且广告系统可能会降低您的应用的优先级。

为确保您为应用程序找到良好的平衡，请在 Yandex Advertising Network 界面中跟踪“收视数比例”或“可见收视数比例”指标。如果它低于 20%，可能需要修改您的缓存算法。收视数比例越高越好。
<!-- endsource: zh/dev/_includes/cash-ads.md -->

### 完整代码示例

```c#
using System;
using UnityEngine;
using UnityEngine.UI;
using YandexMobileAds;
using YandexMobileAds.Base;

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

    private void Awake()
    {
        SetupLoader();
        RequestRewardedAd();
        DontDestroyOnLoad(gameObject);
        button = this.GetComponent<Button>();
        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;
        }
    }
}
```

## 其他资源 {#resources}

* <!-- source: zh/dev/_includes/github-pubdev-links.md -->
  [GitHub](https://github.com/yandexmobile/yandex-ads-unity-plugin) 链接。
  <!-- endsource: zh/dev/_includes/github-pubdev-links.md -->

