【问题标题】:Unity + Admob rewarded ads : event not firingUnity + Admob 奖励广告:事件未触发
【发布时间】:2023-03-23 20:44:02
【问题描述】:

我被 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);

【问题讨论】:

    标签: unity3d admob admob-rewardedvideoad


    【解决方案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 pattern,这样您就可以轻松地从其他类中访问该脚本。

    例子:

    StartCoroutine(RewardedScriptRow.Instance.LaunchAd());
    

    【讨论】:

    • 您好!非常感谢您的完整回答!首先,我修改了所有不好的东西,例如插页式名称等……你说得对。我注意到当我输入“this.rewardBasedVideo = RewardBasedVideoAd.Instance;”时广告没有启动在开始方法中,但只有当我把它放在请求中时。否则,由于我添加了您的代码,它似乎适用于奖励事件,但不适用于结束广告,这很奇怪。另外,奖励后,广告暂时没有重新加载,但我正在调查!再次感谢你:)
    • 仍然卡住,因为每个问题后场景都会重新加载。我每 10 个问题就调用 LaunchAd()。然后第一个显示,事件根本不记录重新加载请求......声音只是一个调试,它没有播放。因此,如果我退出或只是观看广告,则在下一行的末尾不会发生任何事情,因为广告尚未准备好,但是当我退出场景并重新启动测验时,广告出现在开头,我不明白所有内容是什么继续:D(我编辑了我的答案以获取更多详细信息)
    • 您的广告可能尚未加载?
    • 我不这么认为,广告之间大约有 15 秒
    • 对于刚开始加载的广告,这是由于不破坏只是复制广告对象的人。事件问题,还在寻找中!
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多