yandexmobile / yandex-ads-unity-plugin

Yandex Mobile Ads Unity Plugin
Other
52 stars 9 forks source link

Fatal Exception: java.lang.Exception NullReferenceException : Object reference not set to an instance of an object. #85

Closed Hetagkaty closed 1 month ago

Hetagkaty commented 10 months ago

Unity 2022.3.13 Yandex Mobile ads lite 6.1.0 В Crashlitycs, как на андроид так и на iOS, полно таких ошибок: YandexMobileAds.InterstitialAdLoader+<>c__DisplayClass11_1.b3 (YandexMobileAds.InterstitialAdLoader+<>cDisplayClass11_1) YandexMobileAds.Common.MainThreadDispatcher.Update (YandexMobileAds.Common.MainThreadDispatcher)

Видел похожую тему (https://github.com/yandexmobile/yandex-ads-unity-plugin/issues/65), но там написано, что в одном из обновлений исправили проблему. ![Uploading yma.png…]()

mobile-ads-github commented 10 months ago

Спасибо за Ваше обращение, для разбора создана задача с номером PCODESUP-2645. Мы ознакомимся и вернемся с ответом в течение 2 дней, возможно запросим дополнительную информацию.

Thank you for your message, a task with the number PCODESUP-2645 has been created for analysis. We will get acquainted and return with the answer within 2 days, we may request additional information.

Hetagkaty commented 10 months ago

Есть новости? ) yads

mobile-ads-github commented 9 months ago

Здравствуйте! К сожалению у нас не получается воспроизвести проблему. Предоставьте пожалуйста сэмпл/снипет кода, чтобы мы могли понять как вы работаете с Interstitital.

Hetagkaty commented 9 months ago

Здравствуйте! К сожалению у нас не получается воспроизвести проблему. Предоставьте пожалуйста сэмпл/снипет кода, чтобы мы могли понять как вы работаете с Interstitital.

using GoogleMobileAds.Api; using UnityEngine; using YandexMobileAds; using YandexMobileAds.Base; using UnityEngine.Events; using System;

public class Advertising : MonoBehaviour { private InterstitialAd interstitialAdAdmob;

private InterstitialAdLoader interstitialAdLoaderYandex;
private Interstitial interstitialAdYandex;

private const string androidAdUnitId = "admob id";
private const string iOSAdUnitId = "admob id";

private const string androidYandexAdsAdUnitId = "yandex id";
private const string iOSYandexAdsAdUnitId = "yandex id";
private string currentYandexAdsAdUnitId;

[SerializeField] private UnityEvent adLoadedEvent = default;
[SerializeField] private UnityEvent adFailedLoadEvent = default;

private void Awake()
{
    currentYandexAdsAdUnitId = (Application.platform == RuntimePlatform.IPhonePlayer) ? iOSYandexAdsAdUnitId : androidYandexAdsAdUnitId;
    SetupLoaderYandex();
    DestroyInterstitialYandex();
    RequestInterstitialYandex();
}

private void Start()
{
    RequestAndLoadAdmobInterstitialAd();
}

private void RequestAndLoadAdmobInterstitialAd()
{

if UNITY_ANDROID

    string _adUnitId = androidAdUnitId;

elif UNITY_IOS

    string _adUnitId = iOSAdUnitId;

else

    string _adUnitId = "unused";

endif

    if (interstitialAdAdmob != null)
    {
        interstitialAdAdmob.Destroy();
        interstitialAdAdmob = null;
    }
    var adRequest = new GoogleMobileAds.Api.AdRequest();
    InterstitialAd.Load(_adUnitId, adRequest,
        (InterstitialAd ad, LoadAdError error) =>
        {
            // if error is not null, the load request failed.
            if (error != null || ad == null)
            {
                adFailedLoadEvent?.Invoke();
                return;
            }

            interstitialAdAdmob = ad;
            RegisterEventHandlers(ad);
            adLoadedEvent?.Invoke();
        });
}
private void RegisterEventHandlers(InterstitialAd ad)
{
    ad.OnAdFullScreenContentClosed += () =>
    {
        RequestAndLoadAdmobInterstitialAd();
    };
    ad.OnAdFullScreenContentFailed += (GoogleMobileAds.Api.AdError error) =>
    {
        RequestAndLoadAdmobInterstitialAd();
    };
}

private void SetupLoaderYandex()
{
    interstitialAdLoaderYandex = new InterstitialAdLoader();
    interstitialAdLoaderYandex.OnAdLoaded += HandleInterstitialLoaded;
}

public void HandleInterstitialLoaded(object sender, InterstitialAdLoadedEventArgs args)
{
    interstitialAdYandex = args.Interstitial;
    interstitialAdYandex.OnAdFailedToShow += HandleInterstitialFailedToShow;
    interstitialAdYandex.OnAdDismissed += HandleInterstitialDismissed;
}

public void HandleInterstitialDismissed(object sender, EventArgs args)
{
    DestroyInterstitialYandex();
    RequestInterstitialYandex();
}

public void HandleInterstitialFailedToShow(object sender, EventArgs args)
{
    DestroyInterstitialYandex();
    RequestInterstitialYandex();
}

private void RequestInterstitialYandex()
{
    string adUnitId = currentYandexAdsAdUnitId;
    AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
    interstitialAdLoaderYandex.LoadAd(adRequestConfiguration);
}

public void ShowInterstitialAdvertising()
{
    if (interstitialAdAdmob != null && interstitialAdAdmob.CanShowAd())
    {
        interstitialAdAdmob.Show();
    }
    else if (interstitialAdYandex != null)
    {
        interstitialAdYandex.Show();
    }
}

private void DestroyInterstitialAdmob()
{
    if (interstitialAdAdmob != null)
    {
        interstitialAdAdmob.Destroy();
        interstitialAdAdmob = null;
    }
}

private void DestroyInterstitialYandex()
{
    if (interstitialAdYandex != null)
    {
        interstitialAdYandex.Destroy();
        interstitialAdYandex = null;
    }
}

public void DestroyAllAdvertising()
{
    DestroyInterstitialAdmob();
    DestroyInterstitialYandex();
}

}


Использую совместно с Admob. Этот скрипт есть в каждой сцене (например: сцена меню и сцена игры).
mobile-ads-github commented 8 months ago

Здравствуйте! Приносим извинения за поздний ответ. Мы обнаружили проблему в коде плагина, исправление будет опубликовано в следующей версии.

В качестве временного решения, установите EventHandler для OnAdFailedToLoad в SetupLoaderYandex():

private void SetupLoaderYandex()
{
    interstitialAdLoaderYandex = new InterstitialAdLoader();
    interstitialAdLoaderYandex.OnAdLoaded += HandleInterstitialLoaded;
    interstitialAdLoaderYandex.OnAdFailedToLoad += HandleInterstitialFailedToLoad;
}

public void HandleInterstitialFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
    Debug.Log($"HandleInterstitialFailedToLoad event received with message: {args.Message}");
}