Unity安卓平台Admob原生广告点击无响应问题求助
我在Unity游戏中集成了Admob原生广告,广告内容显示正常,但点击无响应。手动添加了Box Collider且能检测到点击,但广告仍无法跳转至链接,目前使用测试ID。
已尝试的无效方案
- 禁用原生广告所有对象的Raycast Target
- 为每个对象手动添加Box Collider
- 在AndroidManifest.xml的UnityPlayerActivity的Activity块中添加代码:
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" /> - 尝试使用UnifiedNativeAdView,但提示不存在错误
实现代码
using UnityEngine; using UnityEngine.UI; using GoogleMobileAds.Api; using System; //Banner ad public class Admob : MonoBehaviour { private BannerView adBanner; private NativeAd adNative; private bool nativeLoaded = false; private string idApp, idBanner, idNative; [SerializeField] GameObject adNativePanel; [SerializeField] RawImage adIcon; [SerializeField] RawImage adChoices; [SerializeField] Text adHeadline; [SerializeField] Text adCallToAction; [SerializeField] Text adAdvertiser; void Awake () { adNativePanel.SetActive (false); //hide ad panel } void Start () { idApp = "ca-app-pub-3940256099942544~3347511713"; idBanner = "ca-app-pub-3940256099942544/6300978111"; idNative = "ca-app-pub-3940256099942544/2247696110"; MobileAds.Initialize (idApp); RequestBannerAd (); RequestNativeAd (); } void Update () { if (nativeLoaded) { nativeLoaded = false; Texture2D iconTexture = this.adNative.GetIconTexture (); Texture2D iconAdChoices = this.adNative.GetAdChoicesLogoTexture (); string headline = this.adNative.GetHeadlineText (); string cta = this.adNative.GetCallToActionText (); string advertiser = this.adNative.GetAdvertiserText (); adIcon.texture = iconTexture; adChoices.texture = iconAdChoices; adHeadline.text = headline; adAdvertiser.text = advertiser; adCallToAction.text = cta; //register gameobjects adNative.RegisterIconImageGameObject (adIcon.gameObject); adNative.RegisterAdChoicesLogoGameObject (adChoices.gameObject); adNative.RegisterHeadlineTextGameObject (adHeadline.gameObject); adNative.RegisterCallToActionGameObject (adCallToAction.gameObject); adNative.RegisterAdvertiserTextGameObject (adAdvertiser.gameObject); adNativePanel.SetActive (true); //show ad panel } } #region Banner Methods -------------------------------------------------- public void RequestBannerAd () { adBanner = new BannerView (idBanner, AdSize.Banner, AdPosition.Bottom); AdRequest request = AdRequestBuild (); adBanner.LoadAd (request); } public void DestroyBannerAd () { if (adBanner != null) adBanner.Destroy (); } #endregion #region Native Ad Mehods ------------------------------------------------ private void RequestNativeAd () { AdLoader adLoader = new AdLoader.Builder (idNative).ForNativeAd ().Build (); adLoader.OnNativeAdLoaded += this.HandleOnNativeAdLoaded; adLoader.LoadAd (AdRequestBuild ()); } //events private void HandleOnNativeAdLoaded (object sender, NativeAdEventArgs args) { this.adNative = args.nativeAd; nativeLoaded = true; } #endregion //------------------------------------------------------------------------ AdRequest AdRequestBuild () { return new AdRequest.Builder ().Build (); } void OnDestroy () { DestroyBannerAd (); } }
解决方案
移除自定义点击干扰
手动添加的Box Collider和自定义点击检测会覆盖Admob SDK的原生点击处理逻辑,必须移除这些元素,让SDK直接接管广告点击事件。适配新版SDK替换NativeAd为UnifiedNativeAd
提示UnifiedNativeAdView不存在说明你用的是新版Admob SDK,旧版NativeAd已被废弃,需调整代码:- 替换变量类型:
private UnifiedNativeAd adNative; - 修改广告加载逻辑:
private void RequestNativeAd () { AdLoader adLoader = new AdLoader.Builder(idNative).ForUnifiedNativeAd().Build(); adLoader.OnUnifiedNativeAdLoaded += this.HandleOnUnifiedNativeAdLoaded; adLoader.LoadAd(AdRequestBuild()); } private void HandleOnUnifiedNativeAdLoaded(object sender, UnifiedNativeAdEventArgs args) { this.adNative = args.nativeAd; nativeLoaded = true; }
注册UI元素的方法保持不变,新版SDK兼容原有注册逻辑。
- 替换变量类型:
确认事件转发配置有效性
检查AndroidManifest.xml中ForwardNativeEventsToDalvik的meta-data是否正确放置在UnityPlayerActivity的<activity>标签内;同时在Unity Player Settings的Android选项中,开启Allow External Events(路径:Player Settings > Android > Other Settings)。调整UI注册时机
将UI元素的注册逻辑移至广告面板激活之后,确保注册时所有UI对象处于活跃状态,避免SDK无法绑定点击事件:if (nativeLoaded) { nativeLoaded = false; // 先赋值UI内容 adIcon.texture = this.adNative.GetIconTexture(); // ...其他UI赋值逻辑 // 先激活面板 adNativePanel.SetActive(true); // 再注册所有UI元素 adNative.RegisterIconImageGameObject(adIcon.gameObject); // ...其他注册逻辑 }更新SDK版本
确保使用的Google Mobile Ads Unity插件为最新稳定版,旧版本可能存在原生广告点击的兼容性bug,同时确认Android构建的compileSdkVersion、targetSdkVersion符合插件要求。
内容的提问来源于stack exchange,提问作者dayna chandera

