Реклама с вознаграждением

Реклама с вознаграждением (Rewarded) — это полноэкранный рекламный формат, за просмотр которого пользователь получает бонус или награду (например: внутриигровые монеты, доступ к премиум-функциям, повтор попытки и т. д.).

Примечание

Пользователь принимает решение самостоятельно — смотреть рекламу или нет, а награду получает только в случае полного просмотра.

Примечание

Пример работы всех типов форматов есть в демопроекте.

Сущность

Описание

adUnitId

Используйте:

  • development mode — для работы с демоблоками;

  • production mode — для работы с R-M-XXXXXX-Y (уточните реальный ID в интерфейсе Рекламной сети Яндекса). R-M-XXXXXX-Y — это вид рабочего рекламного ID, по которому будут приходить разные креативы.

Пример создания рекламы с вознаграждением

using UnityEngine;
using UnityEngine.Events;
using YandexMobileAds;
using YandexMobileAds.Base;
using System.Collections.Generic;
using System;

[AddComponentMenu("Yandex Ads/Rewarded Ad Component")]
public class RewardedAdComponent : MonoBehaviour
{
    [Header("Ad Settings")]
    public string adName = "Default Rewarded Ad";

    [Header("Ad Unit IDs")]
    [Tooltip("Ad Unit ID for Android")]
    public string adUnitIdAndroid = "demo-rewarded-yandex";

    [Tooltip("Ad Unit ID for iOS")]
    public string adUnitIdiOS = "demo-rewarded-yandex";

    [Header("Configuration")]
    public bool autoLoading = true;
    public bool showAfterLoading = true;

    private RewardedAd rewardedAd;
    private RewardedAdLoader rewardedAdLoader;

    [System.Serializable]
    public class AdEvent : UnityEvent { }

    [System.Serializable]
    public class AdEventString : UnityEvent<string> { }

    [System.Serializable]
    public class AdEventWithAd : UnityEvent<RewardedAd> { }

    [System.Serializable]
    public class AdEventRewared : UnityEvent<Reward> { }

    [Header("Load Callbacks")]
    public AdEventWithAd OnAdLoaded;
    public AdEventString OnAdFailedToLoad;

    [Header("Interaction Callbacks")]
    public AdEventWithAd OnAdShown;
    public AdEventWithAd OnAdDismissed;
    public AdEventWithAd OnAdClicked;
    public AdEventString  OnAdFailedToShow;
    public AdEventString OnImpression;
    public AdEventRewared OnRewarded;

    private string CurrentAdUnitId
    {
        get
        {
#if UNITY_IOS
            return adUnitIdiOS;
#elif UNITY_ANDROID
            return adUnitIdAndroid;
#else
            Debug.LogWarning("Unsupported platform for Yandex Ads. Using IOS Ad Unit ID by default.");
            return adUnitIdAndroid;
#endif
        }
    }

    private void Start()
    {
        if (!string.IsNullOrEmpty(CurrentAdUnitId))
        {
            SetupLoader();
            if (autoLoading)
            {
                ConfigureAd();
            }
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Debug.Log("RewardedAdComponent: Ad Unit ID is missing.");
        }
    }

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

    private void ConfigureAd()
    {
        double lat = 60.0, lon = 30.0;

        // Собираем объект Location
        Location location = new Location.Builder()
            .SetLatitude(lat)
            .SetLongitude(lon)
            .Build();

        AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(CurrentAdUnitId)
                .WithAge("25")
                .WithGender("male") // или "female", "other"
                .WithContextTags(new List<string>() { "games", "unity", "test" })
                .WithContextQuery("user_search_query") // строка поискового запроса
                .WithLocation(location)
                .WithParameters(new Dictionary<string, string> {
                        { "custom1", "value1" },
                        { "custom2", "value2" }
                }).Build();
        try
        {
            rewardedAdLoader.LoadAd(adRequestConfiguration);
        }
        catch (Exception ex)
        {
            Debug.LogError($"{adName}: Configuration failed: {ex.Message}");
        }
    }

    public void Load()
    {
        ConfigureAd();
        
    }

    public void Show()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Show();
        }
        else
        {
            Debug.Log("Failed to show ad. Ad object not loaded");
        }
    }

    public void OnDestroy()
    {
        if (rewardedAd != null)
        {
            rewardedAd.OnAdShown -= HandleAdShown;
            rewardedAd.OnAdDismissed -= HandleAdDismissed;
            rewardedAd.OnAdClicked -= HandleAdClicked;
            rewardedAd.OnAdFailedToShow -= HandleAdFailedToShow;
            rewardedAd.OnAdImpression -= HandleImpression;
            rewardedAd.OnRewarded-= HandleRewarded;
            rewardedAd.Destroy();
            rewardedAd = null;
        }

        if (rewardedAdLoader != null)
        {
            rewardedAdLoader.OnAdLoaded -= HandleAdLoaded;
            rewardedAdLoader.OnAdFailedToLoad -= HandleAdFailedToLoad;
            rewardedAdLoader = null;
        }
    }

    #region Event Handlers

    private void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
    {
        rewardedAd = args.RewardedAd;

        rewardedAd.OnAdShown += HandleAdShown;
        rewardedAd.OnAdDismissed += HandleAdDismissed;
        rewardedAd.OnAdClicked += HandleAdClicked;
        rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
        rewardedAd.OnAdImpression += HandleImpression;
        rewardedAd.OnRewarded += HandleRewarded;

        OnAdLoaded?.Invoke(rewardedAd);

        if (showAfterLoading)
        {
            rewardedAd.Show();
        }
    }

    private void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) => OnAdFailedToLoad?.Invoke(args.Message);

    private void HandleAdShown(object sender, EventArgs args) => OnAdShown?.Invoke(rewardedAd);

    private void HandleAdDismissed(object sender, EventArgs args) => OnAdDismissed?.Invoke(rewardedAd);

    private void HandleAdClicked(object sender, EventArgs args) => OnAdClicked?.Invoke(rewardedAd);

    private void HandleAdFailedToShow(object sender, AdFailureEventArgs args) => OnAdFailedToShow?.Invoke(args.Message);

    private void HandleImpression(object sender, ImpressionData impressionData) =>
        OnImpression?.Invoke(impressionData?.rawData ?? string.Empty);

    private void HandleRewarded(object sender, Reward args) => OnRewarded?.Invoke(args);

    #endregion
}

Проверка интеграции

Соберите и запустите проект. Успешную интеграцию можно проверить в Logcat Android Studio по ключевому слову YandexAds:

[Integration] Ad type rewarded was integrated successfully