尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Google Mobile Ads Unity 插屏广告集成指南:基于 google-mobile-ads-interstitial Skill 的完整实现流程

Google Mobile Ads Unity 插屏广告集成指南:基于 google-mobile-ads-interstitial Skill 的完整实现流程 Google Mobile Ads Unity 插屏广告集成指南基于 google-mobile-ads-interstitial Skill 的完整实现流程【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills导读本指南围绕 google-mobile-ads-interstitial Skill 中的 Unity 平台实现文档 unity-interstitial.md系统讲解如何在 Unity 工程中通过 Google Mobile AdsGMASDK 实现全屏插屏广告从 SDK 依赖安装、App ID 配置、SDK 初始化到插屏广告的加载、事件回调注册、展示与验证的完整工作流。读者学完后可以独立将插屏广告接入 Unity 游戏或应用并正确处理广告生命周期事件与 Unity 主线程调度等关键细节。一、前置准备SDK 集成与初始化在编写插屏广告代码之前需要先完成 GMA SDK 的安装与初始化。这部分流程在 unity-get-started.md 中有完整说明与插屏广告实现直接配套。1.1 添加 SDK 依赖通过Packages/manifest.json安装com.google.ads.mobile包。首先获取最新版本号curl -sS https://api.github.com/repos/googleads/googleads-mobile-unity/releases/latest | jq -r .tag_name返回的 tag去掉v前缀即最新版本然后在Packages/manifest.json中配置 OpenUPM scoped registry{ scopedRegistries: [ { name: OpenUPM, url: https://package.openupm.com, scopes: [ com.google ] } ], dependencies: { // 替换为最新稳定版本 com.google.ads.mobile: 11.2.0 } }1.2 设置应用标识符修改Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset分别设置adMobAndroidAppId与adMobIOSAppId。官方示例 App ID 为Androidca-app-pub-3940256099942544~3347511713iOSca-app-pub-3940256099942544~1458002511⚠️ 发布前必须替换为你自己的 AdMob App ID。仓库中的校验文档 application-id.md 指出Unity 平台对应的键名正是adMobAndroidAppId/adMobIOSAppId位于 Unity 编辑器设置中并且会把仍在使用官方测试 App ID 的情况标记为 Warning。1.3 初始化 SDKSDK 只需初始化一次建议在MonoBehaviour的Start()中调用MobileAds.Initialize()using GoogleMobileAds.Api; using GoogleMobileAds.Common; using UnityEngine; public class GoogleMobileAdsController : MonoBehaviour { public void Start() { // 初始化 Google Mobile Ads SDK全局仅一次。 MobileAds.Initialize((InitializationStatus initStatus) { Debug.Log(Google Mobile Ads SDK initialized.); MobileAdsEventExecutor.ExecuteInUpdate(() { // 在主线程上操作 UnityEngine 对象。 }); }); } }注意不要设置MobileAds.RaiseAdEventsOnUnityMainThread true该属性已废弃。正确做法是使用MobileAdsEventExecutor.ExecuteInUpdate()将回调中与 Unity 对象的交互显式调度到主线程。二、必需命名空间导入实现 Unity 插屏广告需要导入以下四个命名空间using System; using UnityEngine; using GoogleMobileAds.Api; using GoogleMobileAds.Common;其中GoogleMobileAds.Api提供InterstitialAd、AdRequest、LoadAdError等核心类型GoogleMobileAds.Common提供MobileAdsEventExecutor等跨平台辅助设施UnityEngine与System分别提供 Unity 对象操作与Action委托支持。三、加载插屏广告Load3.1 定义测试广告单元 ID使用InterstitialAd的静态方法Load()加载广告需要传入广告单元 ID、AdRequest对象以及完成回调ActionInterstitialAd, LoadAdError。测试广告单元 ID 通过平台条件编译指令区分// 测试广告单元 ID请替换为你自己的广告单元 ID。 #if UNITY_ANDROID string adUnitId ca-app-pub-3940256099942544/1033173712; #elif UNITY_IPHONE string adUnitId ca-app-pub-3940256099942544/4411468910; #else string adUnitId unused; #endif仓库校验文档 ad-units.md 提供了测试广告单元 ID 的判定规则AdMob 广告单元 ID 以ca-app-pub-3940256099942544/开头且合法格式需匹配正则^(ca-app-pub-[a-zA-Z0-9\-])/([a-zA-Z0-9_\-])(/.*)?$。注意测试 ID 即使被 DEBUG 开关保护也会被标记为 Warning发布前务必替换。3.2 执行加载InterstitialAd.Load(adUnitId, new AdRequest(), (InterstitialAd ad, LoadAdError error) { if (error ! null || ad null) { // 处理加载错误。 return; } interstitialAd ad; });回调中通过error ! null || ad null双重判断兜底错误信息由LoadAdError携带而ad null同样意味着加载失败。成功后将返回的InterstitialAd实例保存到成员变量供后续展示。⚠️关键实践在加载新广告之前务必先销毁任何已存在的InterstitialAd对象调用interstitialAd.Destroy()避免内存泄漏与状态冲突。四、注册广告事件回调Register for callbacks订阅InterstitialAd对象上的事件是可选操作具体取决于应用需求。原文档列出的六个事件及典型用途如下事件典型用途OnAdPaid记录预估广告收入AdValue用于展示级广告变现追踪OnAdImpressionRecorded在内部遥测或第三方分析平台中追踪广告展示OnAdClicked记录用户对广告的点击OnAdFullScreenContentOpened广告覆盖屏幕时暂停游戏音频、计时器或游戏循环OnAdFullScreenContentClosed广告关闭时恢复游戏音频或游戏循环同时销毁当前InterstitialAd对象并重新Load()为下一个过渡节点准备好新广告OnAdFullScreenContentFailed广告展示失败时记录展示错误4.1 主线程调度MobileAdsEventExecutor.ExecuteInUpdate()Unity 的 API 不是线程安全的必须从主线程调用。广告回调可能在后台线程触发因此凡是在回调中操作UnityEngine对象都必须通过MobileAdsEventExecutor.ExecuteInUpdate()显式调度到主线程interstitialAd.OnAdFullScreenContentOpened () { MobileAdsEventExecutor.ExecuteInUpdate(() { // 在主线程上操作 UnityEngine 对象。 }); };同样的线程安全要求同样适用于 unity-banner.md 和 unity-rewarded.md 文档属于 Unity 平台广告集成的通用硬性约束。4.2 在 OnAdFullScreenContentClosed 中预加载下一个广告插屏广告是一次性资源展示并关闭后即失效。推荐在OnAdFullScreenContentClosed回调中同时完成销毁与重载形成可持续供给的插屏广告池interstitialAd.OnAdFullScreenContentClosed () { MobileAdsEventExecutor.ExecuteInUpdate(() { // 恢复游戏音频/游戏循环。 Debug.Log(Interstitial ad closed.); // 销毁旧对象为下一个过渡节点预加载新广告。 interstitialAd.Destroy(); LoadInterstitialAd(); }); };五、展示插屏广告Show调用Show()之前必须先通过CanShowAd()确认广告可展示并加入空引用检查以避免异常if (interstitialAd ! null interstitialAd.CanShowAd()) { interstitialAd.Show(); }CanShowAd()会同时验证广告对象已成功加载且当前处于可展示状态null检查则防止在广告尚未加载完成或已销毁时调用Show()触发 NullReferenceException。插屏广告适合放置在应用的自然过渡节点如关卡切换、游戏结束、应用间跳转等场景需要开发者自行选择触发时机。六、验证实现Verify the implementation完成以上步骤后进行编译级验证检查 Unity Console确认没有 C# 脚本编译错误确认不存在缺失的GoogleMobileAds命名空间引用即using GoogleMobileAds.Api;/using GoogleMobileAds.Common;缺失导致的 CS0246 类错误。若采用脚本化验证可参考 unity-banner.md 中的做法直接对 Unity 生成的.csproj执行dotnet build来快速定位 GMA SDK 相关的编译错误。七、完整实现示例将上述步骤整合为一个完整的MonoBehaviour示例SDK 初始化部分来自 unity-get-started.mdusing System; using UnityEngine; using GoogleMobileAds.Api; using GoogleMobileAds.Common; public class InterstitialAdController : MonoBehaviour { private InterstitialAd interstitialAd; // 测试广告单元 ID请替换为你自己的广告单元 ID。 #if UNITY_ANDROID private string adUnitId ca-app-pub-3940256099942544/1033173712; #elif UNITY_IPHONE private string adUnitId ca-app-pub-3940256099942544/4411468910; #else private string adUnitId unused; #endif private void Start() { MobileAds.Initialize((InitializationStatus initStatus) { Debug.Log(Google Mobile Ads SDK initialized.); LoadInterstitialAd(); }); } private void LoadInterstitialAd() { // 加载前销毁旧对象。 if (interstitialAd ! null) { interstitialAd.Destroy(); } InterstitialAd.Load(adUnitId, new AdRequest(), (InterstitialAd ad, LoadAdError error) { if (error ! null || ad null) { Debug.LogError($Interstitial ad failed to load: {error}); return; } interstitialAd ad; RegisterAdEvents(interstitialAd); }); } private void RegisterAdEvents(InterstitialAd ad) { ad.OnAdPaid (AdValue adValue) { MobileAdsEventExecutor.ExecuteInUpdate(() { Debug.Log($Ad paid: {adValue.Value} {adValue.CurrencyCode}); }); }; ad.OnAdImpressionRecorded () { MobileAdsEventExecutor.ExecuteInUpdate(() { Debug.Log(Impression recorded.); }); }; ad.OnAdClicked () { MobileAdsEventExecutor.ExecuteInUpdate(() { Debug.Log(Ad clicked.); }); }; ad.OnAdFullScreenContentOpened () { MobileAdsEventExecutor.ExecuteInUpdate(() { // 暂停游戏音频、计时器或游戏循环。 Debug.Log(Full screen content opened.); }); }; ad.OnAdFullScreenContentClosed () { MobileAdsEventExecutor.ExecuteInUpdate(() { // 恢复游戏音频/游戏循环。 Debug.Log(Full screen content closed.); // 销毁并预加载下一个插屏广告。 interstitialAd.Destroy(); LoadInterstitialAd(); }); }; ad.OnAdFullScreenContentFailed (AdError error) { MobileAdsEventExecutor.ExecuteInUpdate(() { Debug.LogError($Full screen content failed: {error}); }); }; } // 在关卡切换、游戏结束等自然过渡节点调用。 public void ShowInterstitialAd() { if (interstitialAd ! null interstitialAd.CanShowAd()) { interstitialAd.Show(); } } }八、总结与使用场景Unity 插屏广告的集成遵循加载 → 注册回调 → 展示 → 验证的四步工作流与 google-mobile-ads-interstitial Skill 定义的全局流程一致。三个关键记忆点加载与销毁配对新广告加载前先Destroy()旧对象广告关闭后在OnAdFullScreenContentClosed中立即重载保证每个过渡节点都有可用广告主线程调度所有涉及UnityEngine对象的回调逻辑一律用MobileAdsEventExecutor.ExecuteInUpdate()包裹展示前校验null检查 CanShowAd()双保险后再调用Show()。该 Skill 还提供 Androidandroid-interstitial.md与 iOSios-interstitial.md平台的并行实现文档若目标是激励视频广告而非插屏可参考 unity-rewarded.md。注意本 Skill 明确说明不适用于激励型插屏rewarded interstitial广告集成前请确认广告格式。【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表