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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:05:26