You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:54:02