Unity3D - AdMob在Android中的回调造成崩溃的处理方式

Posted EZhex1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D - AdMob在Android中的回调造成崩溃的处理方式相关的知识,希望对你有一定的参考价值。

游戏开发总是要接入各种各样的SDK,广告也成了一种常用的变现方式。而AdMob对于游戏开发的老鸟来说一定不会陌生。 AdMob for Unity

RewardBasedVideoAd.Instance.OnAdFailedToLoad;
RewardBasedVideoAd.Instance.OnAdLoaded;
RewardBasedVideoAd.Instance.OnAdOpening;
RewardBasedVideoAd.Instance.OnAdStarted;
RewardBasedVideoAd.Instance.OnAdRewarded;
RewardBasedVideoAd.Instance.OnAdClosed;
RewardBasedVideoAd.Instance.OnAdLeavingApplication;

关键的地方无非就是监听这几个事件。本人在最初测试工程中并未发现任何异常,但是同样的脚本放在项目中时却出现了崩溃和UI显示异常的状况。具体现象:无论在OnAdRewarded还是在OnAdClosed中,如果有UI相关的逻辑,那么就会出现显示异常,如果有粒子特效,那么就会出现崩溃后自动重启应用。

Unity捕获不到相关异常,但是android日志中会有这样一个错误:call to OpenGL ES API with no current context (logged once per thread)

从内容和崩溃现象上看,这个是渲染异常造成的。根据之前了解的部分Android开发知识分析,广告视频在Android中会由单独的Activity去播放,no current context,是否因为回调发生在广告视频的Activity中,而此时Unity的Activity被挂起造成了渲染失败呢?

于是想出了一个解决办法:

RewardBasedVideoAd.Instance.OnAdRewarded += HandleOnAdRewarded;
private void HandleAdRewarded(object sender, Reward reward)

    reward = true;


void OnApplicationPause(bool pauseStatus)

    if (!pauseStatus && reward)
    
        // do reward
        reward = false;
    

果然,在这种先标记然后等待Unity的OnApplicationPause消息去调用的情况下,回调会在广告播放完毕UnityActivity变为活动状态时执行,崩溃重启的情况没有再出现。

但是问题又来了,ios中并不是Activity这种机制,广告播放时游戏并不会暂停,也就不会出现OnApplicationPause消息。解决方案很简单,将回调放到Update里去执行即可。

另外,需要监听的消息并不是只有这一个。在简单优化后,代码如下

private Queue<Action> callbackQueue = new Queue<Action>();

private void HandleAdRewarded(object sender, Reward reward)

    callbackQueue.Enqueue(delegate  Debug.Log("rewarded"); );

private void HandleAdClosed(object sender, EventArgs args)

    callbackQueue.Enqueue(delegate  Debug.Log("closed"); );


void Update()

    while (callbackQueue.Count > 0)
    
        callbackQueue.Dequeue().Invoke();
    

这样就能避免在Android上的崩溃,同时在iOS下也能保证奖励回调成功。

PS:虽然有人指出call to OpenGL ES API with no current context (logged once per thread)造成崩溃的情况应该算是OpenGL的Bug,但是作为Unity的SDK,AdMob for Unity的回调并不在Unity的Activity中,这也实在是不太合理。

以上是关于Unity3D - AdMob在Android中的回调造成崩溃的处理方式的主要内容,如果未能解决你的问题,请参考以下文章

怎样在Unity3D 中加入AdMob

怎么在unity3d里添加admob广告

iOS平台加入Google Admob -1/2(Unity3D开发之七)

如何添加AdMob广告到现有的Unity3D ios游戏

Android 中的 AdMob Facebook 中介

unity3d开发的android应用中增加AD系统的详细步骤