Unity集成Google Mobile Ads遇多类API错误,求解决方案
Unity Google Mobile Ads 集成错误修复方案
你的脚本是基于旧版Google Mobile Ads SDK编写的,当前使用的SDK版本(20.0.0+)已更新核心API,导致代码不兼容。以下是针对每个错误的修复说明及完整修正后的代码:
错误原因与修复细节
错误1:MobileAds.Initialize参数类型不匹配
新版SDK中MobileAds.Initialize不再接收字符串类型的AppId,而是需要传入初始化完成的回调方法。AppId需在Unity编辑器的Project Settings > Google Mobile Ads面板中配置,无需在代码中传递。
修复示例:MobileAds.Initialize(initStatus => { Debug.Log("广告SDK初始化完成"); });错误2:AdRequest.Builder不存在
新版SDK中AdRequest.Builder仍可使用,若报错可检查SDK版本是否正确,修复后的请求创建方法如下:private AdRequest CreateRequest() { var requestBuilder = new AdRequest.Builder(); if (testDevice) { requestBuilder.AddTestDevice(SystemInfo.deviceUniqueIdentifier); } return requestBuilder.Build(); }错误3、4:InterstitialAd无LoadAd、IsLoaded方法
新版插屏广告改为异步静态加载模式,不再通过实例调用LoadAd,也移除了IsLoaded属性,需通过加载回调处理广告状态:- 用静态方法
InterstitialAd.Load异步加载广告 - 用
CanShowAd()判断广告是否可展示 - 广告关闭后自动销毁并加载下一条
- 用静态方法
完整修正后的AdManager脚本
using UnityEngine; using GoogleMobileAds.Api; public class AdManager : MonoBehaviour { public string adBannerId; public string adInterstitialId; public AdPosition bannerPosition; public bool testDevice = false; private BannerView _bannerView; private InterstitialAd _interstitial; public static AdManager Instance; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { // 初始化广告SDK,AppId在Project Settings中配置 MobileAds.Initialize(initStatus => { Debug.Log("Google Mobile Ads SDK初始化完成"); // 初始化完成后加载广告 CreateBanner(); LoadInterstitialAd(); }); } private AdRequest CreateRequest() { var requestBuilder = new AdRequest.Builder(); if (testDevice) { // 添加当前设备为测试设备,避免真实广告请求 requestBuilder.AddTestDevice(SystemInfo.deviceUniqueIdentifier); } return requestBuilder.Build(); } // 异步加载插屏广告 public void LoadInterstitialAd() { if (_interstitial != null) { _interstitial.Destroy(); _interstitial = null; } InterstitialAd.Load(adInterstitialId, CreateRequest(), (interstitial, error) => { if (error != null) { Debug.LogError($"插屏广告加载失败: {error.Message}"); return; } _interstitial = interstitial; Debug.Log("插屏广告加载成功"); // 广告关闭后自动加载下一条 _interstitial.OnAdClosed += () => { _interstitial.Destroy(); LoadInterstitialAd(); }; }); } // 展示插屏广告 public void ShowInterstitialAd() { if (_interstitial != null && _interstitial.CanShowAd()) { _interstitial.Show(); } else { Debug.LogWarning("插屏广告未加载完成,无法展示"); LoadInterstitialAd(); } } // 创建并加载横幅广告 public void CreateBanner() { if (_bannerView != null) { _bannerView.Destroy(); } _bannerView = new BannerView(adBannerId, AdSize.SmartBanner, bannerPosition); _bannerView.LoadAd(CreateRequest()); HideBanner(); // 可选:添加广告状态回调 _bannerView.OnAdLoaded += () => Debug.Log("横幅广告加载成功"); _bannerView.OnAdFailedToLoad += (error) => Debug.LogError($"横幅广告加载失败: {error.Message}"); } public void HideBanner() { _bannerView?.Hide(); } public void ShowBanner() { _bannerView?.Show(); } private void OnDestroy() { // 销毁广告资源,避免内存泄漏 _bannerView?.Destroy(); _interstitial?.Destroy(); } }
注意事项
- SDK版本:确保使用最新版Google Mobile Ads Unity SDK,可通过Unity Package Manager更新。
- AppId配置:在
Edit > Project Settings > Google Mobile Ads中填入对应平台的AppId。 - 测试广告:测试阶段使用官方提供的测试广告单元ID,开启
testDevice避免触发平台限制。 - 资源清理:在脚本销毁时调用
Destroy()方法清理广告实例,防止内存泄漏。
内容的提问来源于stack exchange,提问作者JHay JHay
相关产品推荐
相关产品推荐

