如何检查广​​告是否已在 Unity 中完成

How to check if an advertisement has finished in Unity

我正在统一使用来自 admob 的奖励视频广告。当玩家死亡并询问他们是否想观看要复活的广告时,广告会被调用。我正在尝试检查广告何时结束,以便奖励玩家。

void Update()
{
    if(isCalled == true){
        string adUnitId = "ca-app-pub-5920324855307233/4458481507";
        RewardBasedVideoAd rewardBasedVideo = RewardBasedVideoAd.Instance;
        AdRequest request = new AdRequest.Builder().Build();
        rewardBasedVideo.LoadAd(request, adUnitId);
        showAd(rewardBasedVideo);
    }
}

public void showAd(RewardBasedVideoAd rewardBasedVideo)
{
    if (rewardBasedVideo.IsLoaded())
    {
        //Subscribe to Ad event
        rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
        rewardBasedVideo.Show();
    }
}

public void HandleRewardBasedVideoRewarded(object sender, Reward args)
{
    string type = args.Type;
    double amount = args.Amount;
    //Reawrd User here
    print("User rewarded with: " + amount.ToString() + " " + type);

    isCalled = false;

    managerScript.revival();
    managerScript.Loading.SetActive(false);
}

第一次在场景中观看广告时调用方法 revival 并关闭加载屏幕,一切正常,之后再次观看广告时它不起作用,"HandleRewardBasedVideoRewarded"方法没有被调用,一个新的广告只是弹出来一遍又一遍地观看。我该如何解决它,因为当广告第二次结束时游戏没有调用 "HandleRewardBasedVideoRewarded" 方法。所以方法 revival 被调用并且加载屏幕像第一次打开游戏时一样关闭。 注意:即使场景重启(不是整个游戏),问题仍然存在。

更新: 我已经将脚本编辑为您的解决方案,但问题仍然存在。为什么它不起作用? 这是完整的脚本:

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

public class GameAdvertising : MonoBehaviour {

    public bool isCalled;
    public GameObject Manager;
    GameManager managerScript;

    string adUnitId = "ca-app-pub-5920324855307233/4458481507";
    RewardBasedVideoAd rewardBasedVideo = null;

    void Start () {
        managerScript = gameObject.GetComponent<GameManager>();

        isCalled = false;

        //Subscribe to Ad event once
        rewardBasedVideo = RewardBasedVideoAd.Instance;
        //Subscribe to Ad event once
        rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;

    }

    public void adButton()
    {
        isCalled = true;
    }

    void Update()
    {
        if(isCalled == true){
            AdRequest request = new AdRequest.Builder().Build();
            rewardBasedVideo.LoadAd(request, adUnitId);
            showAd();
        }
    }

    public void showAd()
    {
        if (rewardBasedVideo.IsLoaded())
        {
            rewardBasedVideo.Show();
        }
    }

    public void HandleRewardBasedVideoRewarded(object sender, Reward args)
    {
        string type = args.Type;
        double amount = args.Amount;
        //Reawrd User here
        print("User rewarded with: " + amount.ToString() + " " + type);

        isCalled = false;

        managerScript.revival();
        managerScript.Loading.SetActive(false);
    }
}

可能是因为您在不止一次调用 rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded; 时注册了多次活动。您应该从那里删除它并将其放在 Start 函数中。

string adUnitId = "ca-app-pub-5920324855307233/4458481507";
RewardBasedVideoAd rewardBasedVideo = null;

void Start()
{
    //Subscribe to Ad event once
    rewardBasedVideo = RewardBasedVideoAd.Instance;
    //Subscribe to Ad event once
    rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;
}

public void adButton()
{
   AdRequest request = new AdRequest.Builder().Build();
   rewardBasedVideo.LoadAd(request, adUnitId);
   showAd();
}

void Update()
{

}

public void showAd()
{
    print("IN showAd()");
    if (rewardBasedVideo.IsLoaded())
    {
        print("IN showAd() AND IsLoaded()");
        rewardBasedVideo.Show();
    }else{
        print("IN showAd() NOT IsLoaded()");
     }
}

public void HandleRewardBasedVideoRewarded(object sender, Reward args)
{
    print("IN HandleRewardBasedVideoRewarded()");
    IsLoaded()
    string type = args.Type;
    double amount = args.Amount;
    //Reawrd User here
    print("User rewarded with: " + amount.ToString() + " " + type);


    managerScript.revival();
    managerScript.Loading.SetActive(false);
}

public void OnDestroy()
{
    //Un-Subscribe to Ad event once
    rewardBasedVideo.OnAdRewarded -= HandleRewardBasedVideoRewarded;
}