重新加载Unity中的场景后,Google Admob奖励视频回调被多次调用 [英] Google Admob Reward Video callback called mutiple times after reloading scene in Unity

查看:550
本文介绍了重新加载Unity中的场景后,Google Admob奖励视频回调被多次调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Unity中开发一个Android游戏APK。
我已将Google Admob SDK集成到我的项目中,并通过引用 https://developers.google.com/admob/unity/rewarded-video

I'm developing an android game apk in Unity. I've integrated Google Admob SDK in my project and succeeded to show the Google admob reward video ads in my android apk by referring https://developers.google.com/admob/unity/rewarded-video.

但是在场景出现时重新加载以重新启动游戏
多次调用的回调函数。

However when scene is reloaded to restart game callback functions called multiple times.

回调函数示例:

// Called when an ad request has successfully loaded.
rewardBasedVideo.OnAdLoaded += HandleRewardBasedVideoLoaded;
// Called when an ad request failed to load.
rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoad;
// Called when an ad is shown.
rewardBasedVideo.OnAdOpening += HandleRewardBasedVideoOpened;
// Called when the ad starts to play.
rewardBasedVideo.OnAdStarted += HandleRewardBasedVideoStarted;
// Called when the user should be rewarded for watching a video.
rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded;

第一次加载场景:回调函数被调用一次。

scene loaded first time: callback functions are called 1 time.

场景再次加载:回调函数被调用两次。

scene loaded again: callback functions are called 2 times.

场景再次加载:回调函数被调用了3次。

scene loaded again: callback functions are called 3 times.

...

我认为根本原因是即使重新加载Unity场景,回调函数也会累积。

I think the root cause is that callback functions are accumulated even reloading Unity scenes.

即使改变场景,我怎么也只能使这种回调函数调用1次?

How can I make such callback functions be called only 1 time even changing scene?

推荐答案

终于找到了使广告正常运行的解决方案

So I finally figured out the solution to get the ads working properly

首先按照Google所示安装google ad SDK

First install the google ad SDK as shown by Google

在此处关注Google的admonb统一集成理论

然后将以下脚本用于横幅广告,插页式广告和奖励视频广告

Then use the following script for Banner,Interstitial as well as Rewarded Video Ads

SaveManager及其相关的脚本在我的功能中

SaveManager and related are some scripts used in my function

忽略它们

您必须在更新功能中更新并调用广告,并使用bool进行检查

You have to update and call ads in update function and use bool to check if the event handlers are called or not.

请参见插页式广告和奖励广告的onAdFailedToLoad事件处理程序。

See the onAdFailedToLoad event handlers of interstitial and rewarded ads

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

// Example script showing how to invoke the Google Mobile Ads Unity plugin.

public class adMob : MonoBehaviour
{
private BannerView bannerView;
private InterstitialAd interstitial;
private RewardedAd rewardedAd;
private float deltaTime = 0.0f;
private static string outputMessage = string.Empty;

public Text coinValueHolder;
int rewardAmount;

private bool reqInterstitial = true;
private bool reqRewardedAdVideo = true;

public static adMob ins;

public static string OutputMessage
{
    set { outputMessage = value; }
}

public void Start()
{

    #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

    MobileAds.SetiOSAppPauseOnBackground(true);

    // Initialize the Google Mobile Ads SDK.
    MobileAds.Initialize(appId);

    this.CreateAndLoadRewardedAd();
}

public void Awake()
{
    if (ins == null)
    {
        ins = this;
        DontDestroyOnLoad(gameObject);
    }
    else if (ins != null)
    {
        Destroy(gameObject);
    }
}

public void Update()
{
    // Calculate simple moving average for time to render screen. 0.1 factor used as 
    smoothing
    // value.
    this.deltaTime += (Time.deltaTime - this.deltaTime) * 0.1f;

    if (rewardAmount > 0)
    {
        coinValueHolder = 
        GameObject.FindGameObjectWithTag("coinText").GetComponent<Text>();

        SaveManager.coins += 100;
        SaveManager.ins.SaveDataFromDataObjects();
        coinValueHolder.text = SaveManager.coins.ToString();
        rewardAmount = 0;
    }

    if(reqInterstitial)
    {
        this.RequestInterstitial();
        reqInterstitial = false;
    }

    if(reqRewardedAdVideo)
    {
        this.CreateAndLoadRewardedAd();
        reqRewardedAdVideo = false;
    }
}

// Returns an ad request with custom ad targeting.
public AdRequest CreateAdRequest()
{
    return new AdRequest.Builder().Build();
}

public void RequestBanner()
{
    // These ad units are configured to always serve test ads.
    #if UNITY_EDITOR
    string adUnitId = "unused";
    #elif UNITY_ANDROID
    string adUnitId = "ca-app-pub-3940256099942544/6300978111";
    #elif UNITY_IPHONE
    string adUnitId = "ca-app-pub-3940256099942544/2934735716";
    #else
    string adUnitId = "unexpected_platform";
    #endif

    // Clean up banner ad before creating a new one.
    if (this.bannerView != null)
    {
        this.bannerView.Destroy();
    }

    // Create a 320x50 banner at the top of the screen.
    this.bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Bottom);

    // Register for ad events.
    this.bannerView.OnAdLoaded += this.HandleAdLoaded;
    this.bannerView.OnAdFailedToLoad += this.HandleAdFailedToLoad;
    this.bannerView.OnAdOpening += this.HandleAdOpened;
    this.bannerView.OnAdClosed += this.HandleAdClosed;
    this.bannerView.OnAdLeavingApplication += this.HandleAdLeftApplication;

    // Load a banner ad.
    this.bannerView.LoadAd(this.CreateAdRequest());
}

public void DestroyBanner()
{
    this.bannerView.Destroy();
}

public void RequestInterstitial()
{
    // These ad units are configured to always serve test ads.
    #if UNITY_EDITOR
    string adUnitId = "unused";
    #elif UNITY_ANDROID
    string adUnitId = "ca-app-pub-3940256099942544/1033173712";
    #elif UNITY_IPHONE
    string adUnitId = "ca-app-pub-3940256099942544/4411468910";
    #else
    string adUnitId = "unexpected_platform";
    #endif

    // Clean up interstitial ad before creating a new one.
    if (this.interstitial != null)
    {
        this.interstitial.Destroy();
    }

    // Create an interstitial.
    this.interstitial = new InterstitialAd(adUnitId);

    // Register for ad events.
    this.interstitial.OnAdLoaded += this.HandleInterstitialLoaded;
    this.interstitial.OnAdFailedToLoad += this.HandleInterstitialFailedToLoad;
    this.interstitial.OnAdOpening += this.HandleInterstitialOpened;
    this.interstitial.OnAdClosed += this.HandleInterstitialClosed;
    this.interstitial.OnAdLeavingApplication += 
    this.HandleInterstitialLeftApplication;

    // Load an interstitial ad.
    this.interstitial.LoadAd(this.CreateAdRequest());
}

public void CreateAndLoadRewardedAd()
{
    #if UNITY_EDITOR
    string adUnitId = "unused";
    #elif UNITY_ANDROID
    string adUnitId = "ca-app-pub-3940256099942544/5224354917";
    #elif UNITY_IPHONE
    string adUnitId = "ca-app-pub-3940256099942544/1712485313";
    #else
    string adUnitId = "unexpected_platform";
    #endif
    // Create new rewarded ad instance.
    this.rewardedAd = new RewardedAd(adUnitId);

    // Called when an ad request has successfully loaded.
    this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
    // Called when an ad request failed to load.
    this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
    // Called when an ad is shown.
    this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
    // Called when an ad request failed to show.
    this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
    // Called when the user should be rewarded for interacting with the ad.
    this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
    // Called when the ad is closed.
    this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;

    // Create an empty ad request.
    AdRequest request = this.CreateAdRequest();
    // Load the rewarded ad with the request.
    this.rewardedAd.LoadAd(request);
}

public void ShowInterstitial()
{
    if (this.interstitial.IsLoaded())
    {
        this.interstitial.Show();
    }
    else
    {
        MonoBehaviour.print("Interstitial is not ready yet");
    }
}

public void ShowRewardedAd()
{
    if (this.rewardedAd.IsLoaded())
    {
        this.rewardedAd.Show();
    }
    else
    {
        MonoBehaviour.print("Rewarded ad is not ready yet");
    }
}

#region Banner callback handlers

public void HandleAdLoaded(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdLoaded event received");
}

public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
    MonoBehaviour.print("HandleFailedToReceiveAd event received with message: " + 
    args.Message);
}

public void HandleAdOpened(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdOpened event received");
}

public void HandleAdClosed(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdClosed event received");
}

public void HandleAdLeftApplication(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdLeftApplication event received");
}

#endregion

#region Interstitial callback handlers

public void HandleInterstitialLoaded(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleInterstitialLoaded event received");
}

public void HandleInterstitialFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
    MonoBehaviour.print(
        "HandleInterstitialFailedToLoad event received with message: " + args.Message);
    this.reqInterstitial = true;
}

public void HandleInterstitialOpened(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleInterstitialOpened event received");
}

public void HandleInterstitialClosed(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleInterstitialClosed event received");
    this.reqInterstitial = true;
}

public void HandleInterstitialLeftApplication(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleInterstitialLeftApplication event received");
}

#endregion

#region RewardedAd callback handlers

public void HandleRewardedAdLoaded(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleRewardedAdLoaded event received");
}

public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
{
    MonoBehaviour.print(
        "HandleRewardedAdFailedToLoad event received with message: " + args.Message);
    this.reqRewardedAdVideo = true;
}

public void HandleRewardedAdOpening(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleRewardedAdOpening event received");
}

public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
{
    MonoBehaviour.print(
        "HandleRewardedAdFailedToShow event received with message: " + args.Message);
}

public void HandleRewardedAdClosed(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleRewardedAdClosed event received");
    this.reqRewardedAdVideo = true;
}

public void HandleUserEarnedReward(object sender, Reward args)
{
    string type = args.Type;
    double amount = args.Amount;
    rewardAmount = (int)amount;

    MonoBehaviour.print(
        "HandleRewardedAdRewarded event received for "
                    + amount.ToString() + " " + type);
}

#endregion

}

将上面的脚本放在Hierachy中的GameObject上

Place the above script on a GameObject in Hierachy

调用广告使用

adMob.ins.DestroyBanner();

或任何其他函数

adMob.ins._Your-Function-Name__();

这篇关于重新加载Unity中的场景后,Google Admob奖励视频回调被多次调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆