Объявления с вознаграждением Unity + Admob: событие не срабатывает

Я застрял с рекламой admob с вознаграждением, я не могу понять, как заставить событие работать. Проблема в том, что моя игра-викторина перезагружает сцену после каждого вопроса, и даже если я предотвращу уничтожение рекламы, событие вообще не срабатывает. Объявления показываются отлично. Я пробовал несколько вещей, но где-то должен сделать ошибку ... У кого-нибудь есть идея?

Большое тебе спасибо!

using System;
using System.Collections;
using UnityEngine;
using GoogleMobileAds.Api;


public class RewardedScriptRow : MonoBehaviour
{
    private RewardBasedVideoAd rewardBasedVideo;
    public AudioClip GiftSound;

    // Use this for initialization
    void Start()
    {    
        RequestInterstitial();
        Debug.Log("Load at start");
    }

    public void LaunchAd() //Called from another script
    {
        StartCoroutine("Load");
    }

    private void RequestInterstitial()
    {

        string adUnitId = "";
#if UNITY_ANDROID
        adUnitId = "ca-app-pub-00000/00000000";
#elif UNITY_IOS
         adUnitId = "ca-app-pub-0000000000000";
#else
         adUnitId = "unexpected_platform";
#endif

        // Get singleton reward based video ad reference.
        this.rewardBasedVideo = RewardBasedVideoAd.Instance;

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the interstitial with the request.
        this.rewardBasedVideo.LoadAd(request, adUnitId);

        rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoClosed;
        rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
    }


    IEnumerator Load()
    {
        while (!rewardBasedVideo.IsLoaded())
            yield return new WaitForEndOfFrame();

        yield return new WaitForSeconds(0.0f);
        rewardBasedVideo.Show();  
        yield break;
    }



    //EVENT
    public void HandleRewardBasedVideoRewarded(object sender, Reward args)
    {
        GetComponent<AudioSource>().PlayOneShot(GiftSound, 1.0F);
        RequestInterstitial();
    }

    public void HandleRewardBasedVideoClosed(object sender, EventArgs args)
    {
        GetComponent<AudioSource>().PlayOneShot(GiftSound, 1.0F);
        RequestInterstitial();
    }
}

ИЗМЕНИТЬ 1:

using System;
using System.Collections;
using UnityEngine;
using GoogleMobileAds.Api;


public class RewardedScriptRow : MonoBehaviour
{
    private RewardBasedVideoAd rewardBasedVideo;
    public AudioClip GiftSound;
    public static RewardedScriptRow Instance;

    // Use this for initialization
    void Start()
    {
         Instance = this;
         DontDestroyOnLoad(this);
         RequestRewardBasedVideo();

        rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoClosed;
        rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;

     }

    //Called after 10 questions
    public void LaunchAd() 
    {
        StartCoroutine("Load");
    }

    private void RequestRewardBasedVideo()
    {

        string adUnitId = "";
#if UNITY_ANDROID
        adUnitId = "ca-app-pub-0000000/0000000000";
#elif UNITY_IOS
         adUnitId = "ca-app-pub-00000/00000000";
#else
         adUnitId = "unexpected_platform";
#endif

        // Get singleton reward based video ad reference.
        this.rewardBasedVideo = RewardBasedVideoAd.Instance;
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the interstitial with the request.
        this.rewardBasedVideo.LoadAd(request, adUnitId);

    }

    //EVENT
    public void HandleRewardBasedVideoRewarded(object sender, Reward args)
    {
        GetComponent<AudioSource>().PlayOneShot(GiftSound, 1.0F); 
        RequestRewardBasedVideo();

    }
    public void HandleRewardBasedVideoClosed(object sender, EventArgs args)
    {
        GetComponent<AudioSource>().PlayOneShot(GiftSound, 1.0F);
        RequestRewardBasedVideo();
    }

    IEnumerator Load()
    {
        while (!rewardBasedVideo.IsLoaded())
            yield return new WaitForEndOfFrame();

        yield return new WaitForSeconds(0.0f);
        rewardBasedVideo.Show();
        yield break;
    }
}

А вот как в игре работают со сценами:

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

person Loïc Bernard    schedule 05.09.2018    source источник


Ответы (1)


Прежде всего: кажется очень неразумным / нелогичным вызывать метод RequestInterstial в вашем мероприятии. Потому что, поступая так, вы создаете несколько подписок на одни и те же события, на которые вы уже подписаны! Это может привести к очень нежелательному / нежелательному поведению, а также к Stackoverflow exceptions

Мне непонятно, зачем вы вообще вызываете RequestInterstial при срабатывании события. Мне кажется, вы захотите загрузить новое видео после того, как будет показано первое. Реорганизуйте свой метод, чтобы не добавлять события подписки.

Переместите события подписки и код инициализации в метод Start или Awake.

Также вы запрашиваете не интертиал, а видео, основанное на вознаграждении. Я бы предложил переименовать, чтобы код был логичным.

Public static RewardedScriptRow Instance;

void Start()
{    
    Instance = this;
    DontDestroyOnLoad(this);
    RequestRewardBasedVideo();

    // Get singleton reward based video ad reference.
    this.rewardBasedVideo = RewardBasedVideoAd.Instance;

    rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoClosed;
    rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
}

private void RequestRewardBasedVideo()
    {
        #if UNITY_ANDROID
            string appId = "ca-app-pub-3940256099942544~3347511713";
        #elif UNITY_IPHONE
            string appId = "ca-app-pub-3940256099942544~1458002511";
        #else
            string appId = "unexpected_platform";
        #endif

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the rewarded video ad with the request.
        this.rewardBasedVideo.LoadAd(request, adUnitId);
    }

public void HandleRewardBasedVideoRewarded(object sender, Reward args)
{
    GetComponent<AudioSource>().PlayOneShot(GiftSound, 1.0F);
    RequestRewardBasedVideo();
}

В остальном он должен работать. Если вы по-прежнему не получаете желаемого результата, попробуйте установить точки останова во время отладки и / или используйте Debug.Log() внутри подписанных методов, чтобы увидеть, что происходит.

Изменить. Кроме того, если это происходит из-за перезагрузки сцен, вы можете попробовать добавить DontDestroyOnLoad(this);, чтобы предотвратить уничтожение AdObject. Я бы посоветовал создать этот сценарий в вашей самой первой сцене и удалить его из всех остальных (для предотвращения дублирования).

Затем вы даже можете применить шаблон singleton. так что вы можете легко получить доступ к сценарию из других классов.

Пример:

StartCoroutine(RewardedScriptRow.Instance.LaunchAd());
person Immorality    schedule 05.09.2018
comment
Привет ! Большое спасибо за полный ответ! Сначала я изменил все плохие вещи, такие как межстраничное имя и т. Д., Вы правы. Я заметил, что реклама не запускается, когда я помещаю this.rewardBasedVideo = RewardBasedVideoAd.Instance; в методе запуска, но только когда я помещаю его в запрос. В противном случае, поскольку я добавил ваш код, похоже, он работает для события вознаграждения, но не для события закрытия объявления, что странно. Кроме того, после награды реклама пока не перезагружается, но я изучаю! Еще раз спасибо :) - person Loïc Bernard; 05.09.2018
comment
По-прежнему застревает, так как сцена перезагружается после каждого вопроса. Я вызываю LaunchAd () каждые 10 вопросов. Первый показывает, что событие вообще не записывает запрос на перезагрузку ... Звук - это всего лишь отладка, и он не воспроизводится. Поэтому, если я ухожу или просто смотрю рекламу, в конце следующей строки ничего не происходит, потому что реклама не готова, но когда я выхожу из сцены и перезапускаю викторину, реклама появляется в начале, я не понимаю всего, что есть происходит: D (я отредактировал свой ответ для более подробной информации) - person Loïc Bernard; 05.09.2018
comment
Возможно ли, что ваше объявление еще не загружено? - person Immorality; 05.09.2018
comment
Я так не думаю, между объявлениями около 15 секунд. - person Loïc Bernard; 05.09.2018
comment
Для объявления, которое загружается вначале, это связано с тем, что не уничтожайте, кто просто дублирует объект объявления. Проблема с событием все еще ищется! - person Loïc Bernard; 05.09.2018
comment
Я сказал вам в своем ответе, создайте рекламный Gameobject только один раз. Удалите все остальные его экземпляры в других ваших сценах. - person Immorality; 05.09.2018
comment
Я тоже пробовал это, и никаких событий: / Все отладки хороши, реклама работает, событие вызывается один раз, но от них нет ответа - person Loïc Bernard; 05.09.2018