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

