Unity Google激励广告显示在屏幕后方且报MonoBehaviour错误如何解决
问题根因
这个报错是Google Mobile Ads Unity SDK的内部逻辑异常导致:SDK在展示激励广告时需要创建广告交互按钮的MonoBehaviour组件ButtonBehaviour,如果找不到当前场景中可用的激活状态Canvas/EventSystem来挂载组件,就会错误使用new关键字直接实例化MonoBehaviour,触发报错,进而导致广告的渲染层级计算错误,出现在所有UI后方。
修复步骤
- 优先升级Google Mobile Ads Unity SDK到最新稳定版,v7.1.0及之前的版本普遍存在该内部实例化bug,升级后大部分场景可直接解决问题。
- 确保
rewardedAd.Show()方法在Unity主线程中调用,不要在广告加载异步回调、子线程中直接触发广告展示,可通过在Update中检测标记位的方式保证主线程执行。 - 隐藏自有UI时不要禁用全局
EventSystem或主Canvas,仅禁用你自己业务对应的UI父节点即可,若需要完全隐藏UI可将自有UI的CanvasGroup透明度设置为0,保留EventSystem和主Canvas的激活状态,给SDK提供组件挂载的载体。 - 若升级SDK后仍未解决,可在初始场景创建一个永久存活、始终激活的空Canvas,将其Sort Order设为-100(避免遮挡你的业务UI),给SDK预留固定的组件挂载载体。
- 检查所有自定义Canvas的Sort Order值,不要设置超过100,避免高优先级的自定义Canvas遮挡广告渲染层。
修复后参考代码
// 标记广告是否已加载完成 private bool _isRewardedAdLoaded = false; // 广告加载成功回调,仅做标记,不直接调用Show private void HandleRewardedAdLoaded(object sender, EventArgs args) { _isRewardedAdLoaded = true; } private void Update() { // 主线程检测广告展示条件,这里可替换为你自己的触发逻辑 if (Input.GetKeyDown(KeyCode.WatchAd) && _isRewardedAdLoaded) { ShowRewardedVideo(); } } public void ShowRewardedVideo () { if (rewardedAd == null || !rewardedAd.IsLoaded()) return; // 仅隐藏自有业务UI,不碰全局EventSystem和主Canvas YourBusinessUIRoot.SetActive(false); rewardedAd.Show(); }
问题复现截图

内容的提问来源于stack exchange,提问作者merna
相关产品推荐
相关产品推荐

