Unity + Admob - награда за рекламу - PullRequest
0 голосов
/ 05 сентября 2018

Я застрял с рекламой на награду 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);

1 Ответ

0 голосов
/ 05 сентября 2018

Прежде всего: Кажется очень неразумным / нелогичным вызывать метод 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());
...