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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:37:33