Unity集成AdMob原生广告:初始化转换与空引用异常问题
问题解决:Google AdMob原生广告定向区域时的CS1503与空引用异常
1. 解决CS1503错误:无法将string转换为System.Action<GoogleMobileAds.Api.InitializationStatus>
错误原因
新版Google Mobile Ads SDK已移除MobileAds.Initialize(string appId)重载方法,当前初始化要求传入Action<InitializationStatus>回调参数,直接传入App ID字符串会触发类型不匹配错误。
修复代码
替换原初始化代码:
// 错误写法 MobileAds.Initialize(idApp);
为带回调的正确写法:
// 正确写法 MobileAds.Initialize(initStatus => { Debug.Log("AdMob初始化完成"); LoadNativeAd(); // 初始化完成后触发广告加载 });
注意:App ID需在Unity的Google Mobile Ads设置面板中配置(对应你提供的设置截图),无需在Initialize方法中传入。
2. 解决NullReferenceException空引用异常
错误原因
Update方法中访问adNative属性时,对象未完成初始化或加载失败导致为null,常见场景包括:
- 广告未加载完成就进入Update循环访问属性
- 广告加载失败未处理,
adNative保持null状态 - 初始化逻辑顺序错误,未在AdMob初始化完成后触发广告加载
修复方案
方案1:Update中先判空
在访问adNative属性前添加null检查:
void Update() { if (adNative == null) return; // 原访问adNative属性的代码 }
方案2:加载成功后再处理UI
在广告加载成功的回调中直接配置UI,避免在Update中频繁检查:
private void OnNativeAdLoaded(object sender, NativeAdLoadedEventArgs args) { adNative = args.NativeAd; // 直接在这里设置广告UI // titleText.text = adNative.GetHeadline(); // bodyText.text = adNative.GetBodyText(); }
方案3:规范广告加载逻辑
确保在AdMob初始化完成后调用加载方法,同时处理加载失败情况:
private void LoadNativeAd() { if (nativeAdLoader == null) { NativeAdLoader.Builder builder = new NativeAdLoader.Builder(adUnitId); builder.SetNativeAdOptions(new NativeAdOptions.Builder().Build()); nativeAdLoader = builder.Build(); } // 添加区域定向参数 AdRequest request = new AdRequest.Builder() .AddKeyword("US") // 定向示例:美国区域 .Build(); nativeAdLoader.LoadAd(request); nativeAdLoader.OnNativeAdLoaded += OnNativeAdLoaded; nativeAdLoader.OnNativeAdFailedToLoad += OnNativeAdFailedToLoad; } private void OnNativeAdFailedToLoad(object sender, NativeAdFailedToLoadEventArgs args) { Debug.LogError("原生广告加载失败: " + args.Message); adNative = null; }
完整修复后的示例代码
using UnityEngine; using GoogleMobileAds.Api; public class NativeAdManager : MonoBehaviour { private string adUnitId = "ca-app-pub-3940256099942544/2247696110"; // 测试用广告单元ID private NativeAdLoader nativeAdLoader; private NativeAd adNative; void Start() { // 标准初始化流程 MobileAds.Initialize(initStatus => { Debug.Log("AdMob初始化完成"); LoadNativeAd(); }); } private void LoadNativeAd() { if (nativeAdLoader == null) { NativeAdLoader.Builder builder = new NativeAdLoader.Builder(adUnitId); builder.SetNativeAdOptions(new NativeAdOptions.Builder().Build()); nativeAdLoader = builder.Build(); } // 区域定向配置 AdRequest request = new AdRequest.Builder() .AddKeyword("US") .Build(); nativeAdLoader.LoadAd(request); nativeAdLoader.OnNativeAdLoaded += OnNativeAdLoaded; nativeAdLoader.OnNativeAdFailedToLoad += OnNativeAdFailedToLoad; } private void OnNativeAdLoaded(object sender, NativeAdLoadedEventArgs args) { adNative = args.NativeAd; Debug.Log("原生广告加载成功"); // 绑定广告内容到UI(需自行关联场景中的UI组件) if (adNative != null) { // titleText.text = adNative.GetHeadline(); // bodyText.text = adNative.GetBodyText(); // iconImage.sprite = Sprite.Create(adNative.GetIcon().Texture2D, new Rect(0,0,adNative.GetIcon().Texture2D.width, adNative.GetIcon().Texture2D.height), new Vector2(0.5f, 0.5f)); } } private void OnNativeAdFailedToLoad(object sender, NativeAdFailedToLoadEventArgs args) { Debug.LogError("原生广告加载失败: " + args.Message); adNative = null; } void Update() { if (adNative == null) return; // 其他需在Update中处理的逻辑 } void OnDestroy() { // 销毁广告资源,避免内存泄漏 if (adNative != null) { adNative.Destroy(); } } }
Unity设置验证
确认以下配置正确:
- Google Mobile Ads设置面板中已填写正确的App ID
- 代码中的广告单元ID与后台配置一致
- 已启用原生广告格式
内容的提问来源于stack exchange,提问作者Support
相关产品推荐
相关产品推荐

