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中的回调造成崩溃的处理方式的主要内容,如果未能解决你的问题,请参考以下文章