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

Unity中Admob插屏广告无法加载问题求助

Unity Admob插屏广告无法加载问题排查与解决

问题描述

集成Admob插屏广告时,调用RequestInterstitial方法触发No Ad Loaded错误,错误栈如下:

No Ad Loaded
UnityEngine.Debug:Log (object)
GoogleMobileAds.Unity.InterstitialClient:Show ()
GoogleMobileAds.Api.InterstitialAd:Show ()
InterstitialScript:RequestInterstitial () (at Assets/Scripts/InterstitialScript.cs:52)
GameOver:Continue () (at Assets/Scripts/GameOver.cs:41)
UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

原实现代码:

using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;

public class InterstitialScript : MonoBehaviour
{
    private InterstitialAd interstitial;
    public static InterstitialScript instance;
    void Awake()
    {
        instance = this;
        MobileAds.Initialize(initStatus => { });

        if (interstitial.IsLoaded())
        {
            interstitial.Show();
        }
    }

    void Start()
    {
        //InterstitialScript = this;
        MobileAds.Initialize(initStatus => { });

        if (interstitial.IsLoaded())
        {
            interstitial.Show();
        }
    }

    public void RequestInterstitial()
    {
        #if UNITY_ANDROID
            string adUnitId = "ca-app-pub-9471668556390079~8501400148";
        #elif UNITY_IPHONE
            string adUnitId = null;
        #else
            string adUnitId = "unexpected_platform";
        #endif

        // Initialize an InterstitialAd.
        interstitial = new InterstitialAd(adUnitId);
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the interstitial with the request.
        if (interstitial.IsLoaded())
        {
            interstitial.LoadAd(request);
        }
        interstitial.Show();
    }

    void Update()
    {
        
    }
}

错误原因分析

  1. 广告单元ID错误:使用的是Admob应用ID(格式含~),而非插屏广告单元ID(正确格式为ca-app-pub-xxx/xxx)。
  2. 加载逻辑完全错误:刚创建InterstitialAd实例就判断IsLoaded(),此时广告必然未加载,导致跳过LoadAd调用,随后直接Show()触发无广告可展示的错误。
  3. 未监听广告生命周期事件:没有设置加载完成、加载失败的回调,无法确认广告状态,也无法排查加载失败的具体原因。
  4. 重复初始化MobileAds:Awake和Start中都调用MobileAds.Initialize,属于冗余操作,且未等待初始化完成就执行后续逻辑。
  5. 空引用风险:Awake和Start中直接调用interstitial.IsLoaded(),此时interstitial未初始化,会触发空引用异常。

解决方案

1. 替换正确的广告单元ID

登录Admob后台创建插屏广告单元,获取对应ID(测试阶段可使用官方测试ID:Android为ca-app-pub-3940256099942544/1033173712,iOS为ca-app-pub-3940256099942544/4411468910)。

2. 重构广告逻辑代码

修正后的代码加入事件监听、正确的加载流程,避免空引用:

using UnityEngine;
using GoogleMobileAds.Api;

public class InterstitialScript : MonoBehaviour
{
    private InterstitialAd interstitial;
    public static InterstitialScript instance;

    #if UNITY_ANDROID
        private string adUnitId = "ca-app-pub-3940256099942544/1033173712";
    #elif UNITY_IPHONE
        private string adUnitId = "ca-app-pub-3940256099942544/4411468910";
    #else
        private string adUnitId = "unexpected_platform";
    #endif

    void Awake()
    {
        instance = this;
        // 仅初始化一次MobileAds,完成后自动加载广告
        MobileAds.Initialize(initStatus => 
        {
            LoadInterstitialAd();
        });
    }

    // 加载插屏广告
    private void LoadInterstitialAd()
    {
        // 销毁旧实例避免内存泄漏
        if (interstitial != null)
        {
            interstitial.Destroy();
            interstitial = null;
        }

        interstitial = new InterstitialAd(adUnitId);

        // 绑定生命周期回调
        interstitial.OnAdLoaded += HandleAdLoaded;
        interstitial.OnAdFailedToLoad += HandleAdFailedToLoad;
        interstitial.OnAdClosed += HandleAdClosed;

        // 构建广告请求,可添加测试设备ID避免触发真实广告
        AdRequest request = new AdRequest.Builder()
            //.AddTestDevice("你的测试设备ID")
            .Build();

        interstitial.LoadAd(request);
    }

    // 广告加载完成回调
    public void HandleAdLoaded(object sender, System.EventArgs args)
    {
        Debug.Log("插屏广告加载完成");
    }

    // 广告加载失败回调,失败后5秒重试
    public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        Debug.Log($"插屏广告加载失败: {args.Message}");
        Invoke(nameof(LoadInterstitialAd), 5f);
    }

    // 广告关闭回调,关闭后自动加载下一条广告
    public void HandleAdClosed(object sender, System.EventArgs args)
    {
        Debug.Log("插屏广告已关闭");
        LoadInterstitialAd();
    }

    // 对外提供的展示广告方法,确保广告状态合法
    public void ShowInterstitialAd()
    {
        if (interstitial != null && interstitial.IsLoaded())
        {
            interstitial.Show();
        }
        else
        {
            Debug.Log("无可用插屏广告,尝试重新加载");
            LoadInterstitialAd();
        }
    }

    void OnDestroy()
    {
        // 销毁广告实例
        if (interstitial != null)
        {
            interstitial.Destroy();
            interstitial = null;
        }
    }
}

3. 修改调用方式

在GameOver.cs的Continue方法中,替换原调用逻辑:

// 替换原InterstitialScript.instance.RequestInterstitial();
InterstitialScript.instance.ShowInterstitialAd();

4. 其他注意事项

  • 添加测试设备ID:在AdRequest.Builder()中调用AddTestDevice,避免开发过程中触发真实广告导致账号风险。
  • 检查网络权限:确保Android项目添加INTERNET权限,iOS默认开启网络权限。
  • 更新SDK版本:使用最新稳定版Admob Unity SDK,避免版本兼容问题。

内容的提问来源于stack exchange,提问作者Vladutzu27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:10:41