Как создать несколько видеороликов с наградами в приложении Unity?

последние несколько дней я пытаюсь внедрить видео с вознаграждением (admob) в свое приложение Unity. Я хочу, чтобы люди могли смотреть видео с несколькими наградами, с разными типами наград. Я чувствую, что я близок (а может и нет), так как у меня он работает почти корректно. При первом нажатии на тестовое объявление показывается объявление, я получаю вознаграждение и сообщение о том, что я получил вознаграждение. Если я затем загружу/посмотрю второе объявление, оно сработает, но вознаграждение будет не таким, каким должно быть. Я получаю обе награды. Итак, я сначала смотрю рекламу на 100 монет, получаю 100 монет, и все отлично работает. Затем я смотрю рекламу 500 монет, но получаю 600 монет, и сообщения о том, что я получил 100, и 500 монет, хотя я только «заработал» 500 монет. Похоже, что где-то в HandleRewardBasedVideoRewardedAdMob есть ошибка, но я перепробовал все, что мог придумать, и не нашел ничего подобного в Интернете. Я использовал маленькую награду на 100 монет и большую на 500 монет. Я надеюсь, что кто-то может мне помочь, так как это сводит меня с ума. Спасибо за ваше время!

using UnityEngine;
using GoogleMobileAds.Api;
using System;

public class AdsManager : MonoBehaviour {

    #region AdMob
    [Header("Admob")]
    private string adMobAppID = "";
    private string videoAdMobIdsmall = "ca-app-pub-3940256099942544/5224354917";
    private string videoAdMobIdbig = "ca-app-pub-3940256099942544/5224354917";
    private RewardBasedVideoAd rewardBasedAdMobVideosmall; 
    private RewardBasedVideoAd rewardBasedAdMobVideobig;
    AdRequest AdMobVideoRequestsmall;
    AdRequest AdMobVideoRequestbig;
    #endregion
    [Space(15)]
    public decimal moneyToAddsmall;
    public decimal moneyToAddbig;

    static AdsManager instance;
    public static AdsManager Instance
    {
        get
        {
            if(instance == null)
                instance = GameObject.FindObjectOfType(typeof(AdsManager)) as AdsManager;

            return instance;
        }
    }

    void Awake ()
    {
        gameObject.name = this.GetType().Name;
        DontDestroyOnLoad(gameObject);
        InitializeAds();    
    }


    public void ShowVideoRewardsmall() {
        moneyToAddsmall = 100;
        if(rewardBasedAdMobVideosmall.IsLoaded())
        {
            AdMobShowVideosmall();
        }
    }

    public void ShowVideoRewardbig() {
        moneyToAddbig = 500;
        if(rewardBasedAdMobVideobig.IsLoaded())
        {
            AdMobShowVideobig();
        }
    }

    private void RequestRewardedVideosmall()
    {
        // Called when an ad request has successfully loaded.
        rewardBasedAdMobVideosmall.OnAdLoaded += HandleRewardBasedVideoLoadedAdMobsmall;
        // Called when an ad request failed to load.
        rewardBasedAdMobVideosmall.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoadAdMobsmall;
        // Called when an ad is shown.
        rewardBasedAdMobVideosmall.OnAdOpening += HandleRewardBasedVideoOpenedAdMobsmall;
        // Called when the ad starts to play.
        rewardBasedAdMobVideosmall.OnAdStarted += HandleRewardBasedVideoStartedAdMobsmall;
        // Called when the user should be rewarded for watching a video.
        rewardBasedAdMobVideosmall.OnAdRewarded += HandleRewardBasedVideoRewardedAdMobsmall;
        // Called when the ad is closed.
        rewardBasedAdMobVideosmall.OnAdClosed += HandleRewardBasedVideoClosedAdMobsmall;
        // Called when the ad click caused the user to leave the application.
        rewardBasedAdMobVideosmall.OnAdLeavingApplication += HandleRewardBasedVideoLeftApplicationAdMobsmall;
        // Create an empty ad request.
        AdMobVideoRequestsmall = new AdRequest.Builder().Build();
        // Load the rewarded video ad with the request.
        this.rewardBasedAdMobVideosmall.LoadAd(AdMobVideoRequestsmall, videoAdMobIdsmall);
    }

    public void HandleRewardBasedVideoLoadedAdMobsmall(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoLoaded event received");

    }

    public void HandleRewardBasedVideoFailedToLoadAdMobsmall(object sender, AdFailedToLoadEventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoFailedToLoad event received with message: " + args.Message);

    }

    public void HandleRewardBasedVideoOpenedAdMobsmall(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoOpened event received");
    }

    public void HandleRewardBasedVideoStartedAdMobsmall(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoStarted event received");
    }

    public void HandleRewardBasedVideoClosedAdMobsmall(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoClosed event received");
        this.rewardBasedAdMobVideosmall.LoadAd(AdMobVideoRequestsmall, videoAdMobIdsmall);
    }

    public void HandleRewardBasedVideoRewardedAdMobsmall(object sender, Reward args)
    {
        string type = args.Type;
        double amount = args.Amount;
        Statistics._instance.AddMoney(moneyToAddsmall);
        Toast.instance.ShowMessage("Congratulations with your 100 coins!", 4);
        MonoBehaviour.print("HandleRewardBasedVideoRewarded event received for " + amount.ToString() + " " + type);

    }

    public void HandleRewardBasedVideoLeftApplicationAdMobsmall(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoLeftApplication event received");
    }

    private void RequestRewardedVideobig()
    {
        // Called when an ad request has successfully loaded.
        rewardBasedAdMobVideobig.OnAdLoaded += HandleRewardBasedVideoLoadedAdMobbig;
        // Called when an ad request failed to load.
        rewardBasedAdMobVideobig.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoadAdMobbig;
        // Called when an ad is shown.
        rewardBasedAdMobVideobig.OnAdOpening += HandleRewardBasedVideoOpenedAdMobbig;
        // Called when the ad starts to play.
        rewardBasedAdMobVideobig.OnAdStarted += HandleRewardBasedVideoStartedAdMobbig;
        // Called when the user should be rewarded for watching a video.
        rewardBasedAdMobVideobig.OnAdRewarded += HandleRewardBasedVideoRewardedAdMobbig;
        // Called when the ad is closed.
        rewardBasedAdMobVideobig.OnAdClosed += HandleRewardBasedVideoClosedAdMobbig;
        // Called when the ad click caused the user to leave the application.
        rewardBasedAdMobVideobig.OnAdLeavingApplication += HandleRewardBasedVideoLeftApplicationAdMobbig;
        // Create an empty ad request.
        AdMobVideoRequestbig = new AdRequest.Builder().Build();
        // Load the rewarded video ad with the request.
        this.rewardBasedAdMobVideobig.LoadAd(AdMobVideoRequestbig, videoAdMobIdbig);
    }


    public void HandleRewardBasedVideoLoadedAdMobbig(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoLoaded event received");

    }

    public void HandleRewardBasedVideoFailedToLoadAdMobbig(object sender, AdFailedToLoadEventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoFailedToLoad event received with message: " + args.Message);

    }

    public void HandleRewardBasedVideoOpenedAdMobbig(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoOpened event received");
    }

    public void HandleRewardBasedVideoStartedAdMobbig(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoStarted event received");
    }

    public void HandleRewardBasedVideoClosedAdMobbig(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoClosed event received");
        this.rewardBasedAdMobVideosmall.LoadAd(AdMobVideoRequestbig, videoAdMobIdsmall);
    }

    public void HandleRewardBasedVideoRewardedAdMobbig(object sender, Reward args)
    {
        string type = args.Type;
        double amount = args.Amount;
        Statistics._instance.AddMoney(moneyToAddbig);
        Toast.instance.ShowMessage("Congratulations with your 500 coins!", 4);
        MonoBehaviour.print("HandleRewardBasedVideoRewarded event received for " + amount.ToString() + " " + type);

    }

    public void HandleRewardBasedVideoLeftApplicationAdMobbig(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardBasedVideoLeftApplication event received");
    }

    void InitializeAds()
    {
        MobileAds.Initialize(adMobAppID);
        this.rewardBasedAdMobVideosmall = RewardBasedVideoAd.Instance;
        this.RequestRewardedVideosmall();
        this.rewardBasedAdMobVideobig = RewardBasedVideoAd.Instance;
        this.RequestRewardedVideobig();
    }

    void AdMobShowVideosmall()
    {
        rewardBasedAdMobVideosmall.Show();  
    }

    void AdMobShowVideobig()
    {
        rewardBasedAdMobVideobig.Show();    
    }

    bool isVideoAvaiable()
    {
        #if !UNITY_EDITOR
        if(rewardBasedAdMobVideosmall.IsLoaded())
        {
        return true;
        }
        #endif
        return false;
    }

    bool isVideoAvaiablebig()
    {
        #if !UNITY_EDITOR
        if(rewardBasedAdMobVideobig.IsLoaded())
        {
        return true;
        }
        #endif
        return false;
    }
}

person DaanNetherlands    schedule 14.09.2019    source источник


Ответы (2)


RewardBasedVideoAd — это отдельный объект (в отличие от BannerView и InterstitialAd). В вашем методе InitializeAds вы назначаете один и тот же объект для RequestRewardedVideosmall и rewardBasedAdMobVideobig. Вы не можете одновременно запрашивать более одного видеообъявления RewardBasedVideoAd.

Подробнее об этом можно прочитать здесь

Поскольку RewardedBasedVideoAd является одноэлементным, запросы на загрузку рекламы должны выполняться с использованием общего экземпляра.

person Dave    schedule 14.09.2019
comment
Спасибо за помощь! Но если я использую только 1 RewardedBasedVideoAd, возможно ли иметь 2 видео с вознаграждением с разными наградами? Наверное глупый вопрос, но я перерыл весь интернет. Так как я например пользуюсь только маленькими, то и ручка будет только для маленьких, а за большие некуда вознаграждать. - person DaanNetherlands; 14.09.2019
comment
Не глупый вопрос :). Вы можете запросить столько объявлений, сколько хотите. Вы просто не можете запросить несколько сразу. Поэтому, если вы хотите показать большую рекламу, вам нужно сделать новый запрос, который переопределит существующий. - person Dave; 14.09.2019
comment
Вам просто нужно решить, какое объявление должно загружаться первым и когда следует загружать другие объявления. И, в конце концов, вы решаете, как ваш пользователь будет вознагражден, когда вы подключаетесь к событию вознагражденияBasedVideo.OnAdRewarded. - person Dave; 14.09.2019

все это намного проще со стандартной библиотекой объявлений Unity, почему бы не использовать ее

это реклама Unity с рекламой с вознаграждением: https://unityads.unity3d.com/help/unity/integration-guide-unity#rewarded-video-ads

person Community    schedule 14.09.2019
comment
Спасибо за подсказку, но я всегда использовал admob, и у меня уже есть несколько других приложений с admob, просто видео без вознаграждения. И я думаю, что я уже там, просто нужно изменить одну мелочь. Я просто не вижу, что это такое. - person DaanNetherlands; 14.09.2019