Unity中Google AdMob脚本报错:无法将string转为指定Action类型
Google AdMob Unity脚本编译错误解决
错误信息
Argument 1: cannot convert from 'string' to 'System.Action<GoogleMobileAds.Api.InitializationStatus>'.
错误标记在Start()函数的MobileAds.Initialize(appID)代码行。
原脚本代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using GoogleMobileAds; using System; public class addmanager_script : MonoBehaviour { public BannerView bannerview; public InterstitialAd regularad; private string appID="ca-app-pub-5133215721502784~7588202759"; private string regularID="ca-app-pub-5133215721502784/3265814366"; // Use this for initialization void Start () { MobileAds.Initialize (appID); //RequestAd (); RequestBanner (); } // Update is called once per frame void Update () { } public void OnClickShowBanner() { this.RequestBanner (); } public void OnClickShowAd() { this.RequestAd (); } private void RequestAd() { regularad = new InterstitialAd (regularID); AdRequest request = new AdRequest.Builder ().Build (); regularad.LoadAd (request); } private void RequestBanner() { #if UNITY_ANDROID string bannerID = "ca-app-pub-5133215721502784/6909545908"; #elif UNITY_IPHONE string adUnitId = bannerID; #else string bannerID ="ca-app-pub-5133215721502784/6909545908"; #endif bannerview = new BannerView (bannerID, AdSize.Banner, AdPosition.Bottom); AdRequest request = new AdRequest.Builder ().Build (); bannerview.LoadAd (request); bannerview.Show (); //bannerview.OnAdLoaded += HandleOnAdLoaded; } void HandleOnAdLoaded(object a, EventArgs args) { print ("loaded"); bannerview.Show (); } public void Show() { if (regularad.IsLoaded ()) { regularad.Show (); } } }
解决方案
这个错误是因为新版Google AdMob Unity SDK修改了MobileAds.Initialize方法的参数规则:旧版本允许直接传入appID字符串,新版本该方法需要传入一个初始化完成的回调委托(Action<InitializationStatus>),appID需要单独通过平台专属方法设置。
修改步骤
- 移除
Start()中直接传appID的初始化方式,先根据运行平台设置对应的appID - 调用
MobileAds.Initialize时传入回调委托,可在回调内处理初始化完成后的逻辑(比如请求广告)
修改后的核心代码
void Start () { // 根据平台设置App ID #if UNITY_ANDROID MobileAds.SetAndroidAppId(appID); #elif UNITY_IPHONE MobileAds.SetiOSAppId(appID); #endif // 初始化AdMob并传入回调 MobileAds.Initialize(initStatus => { Debug.Log("AdMob初始化完成"); RequestBanner(); // RequestAd(); }); }
额外修复点
- 原
RequestBanner()方法的UNITY_IPHONE分支存在未定义变量错误,需补充iOS专属的Banner广告单元ID:
private void RequestBanner() { string bannerID; #if UNITY_ANDROID bannerID = "ca-app-pub-5133215721502784/6909545908"; #elif UNITY_IPHONE bannerID = "你的iOS Banner广告单元ID"; // 替换为实际ID #else bannerID = "ca-app-pub-5133215721502784/6909545908"; #endif // 剩余代码不变 }
完整修改后脚本示例
using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System; public class addmanager_script : MonoBehaviour { public BannerView bannerview; public InterstitialAd regularad; private string appID="ca-app-pub-5133215721502784~7588202759"; private string regularID="ca-app-pub-5133215721502784/3265814366"; private string iosBannerID = "你的iOS Banner广告单元ID"; void Start () { // 平台区分设置App ID #if UNITY_ANDROID MobileAds.SetAndroidAppId(appID); #elif UNITY_IPHONE MobileAds.SetiOSAppId(appID); #endif // 初始化并处理回调 MobileAds.Initialize(initStatus => { Debug.Log("AdMob初始化完成"); RequestBanner(); // RequestAd(); }); } void Update () { } public void OnClickShowBanner() { RequestBanner(); } public void OnClickShowAd() { RequestAd(); } private void RequestAd() { regularad = new InterstitialAd(regularID); AdRequest request = new AdRequest.Builder().Build(); regularad.LoadAd(request); } private void RequestBanner() { string bannerID; #if UNITY_ANDROID bannerID = "ca-app-pub-5133215721502784/6909545908"; #elif UNITY_IPHONE bannerID = iosBannerID; #else bannerID = "ca-app-pub-5133215721502784/6909545908"; #endif bannerview = new BannerView(bannerID, AdSize.Banner, AdPosition.Bottom); AdRequest request = new AdRequest.Builder().Build(); bannerview.LoadAd(request); bannerview.Show(); // bannerview.OnAdLoaded += HandleOnAdLoaded; } void HandleOnAdLoaded(object a, EventArgs args) { print("Banner广告加载完成"); bannerview.Show(); } public void ShowInterstitial() { if (regularad != null && regularad.IsLoaded()) { regularad.Show(); } } }
内容的提问来源于stack exchange,提问作者I K
相关产品推荐
相关产品推荐

