接入完全指南)
Unity 平台 Google Mobile Ads 激励视频广告Rewarded Ads接入完全指南【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills导读本文基于 Google Mobile Ads SDK 在 Unity 平台的接入文档unity-rewarded.md整理面向需要在 Unity 项目中实现激励视频广告Rewarded Ads的开发者用户主动点击观看全屏广告后获得游戏内道具、金币或解锁内容等奖励。读完本文你将掌握从导入依赖、加载广告、注册事件回调、挂接 UI 触发按钮到展示广告并发放奖励的完整实现流程同时理解 Unity 主线程调度等关键陷阱可直接复制代码投入实战。适用前提本文代码基于GoogleMobileAds.Api命名空间的 Unity GMA SDK。若你尚未完成 SDK 安装与初始化请先参考 unity-get-started.md 完成环境搭建见本文最后一部分。一、必需命名空间导入在实现激励视频广告的脚本中需要引入以下四个命名空间using System; using UnityEngine; using GoogleMobileAds.Api; using GoogleMobileAds.Common;System提供ActionT委托类型RewardedAd.Load()与RewardedAd.Show()的回调均基于它定义UnityEngine访问Debug.Log、MonoBehaviour等 Unity 运行时对象GoogleMobileAds.Api核心广告 API包含RewardedAd、AdRequest、LoadAdError、Reward等类型GoogleMobileAds.Common提供MobileAdsEventExecutor用于把后台线程的广告回调安全地调度到 Unity 主线程执行。二、激励视频广告五步工作流从仓库中的 SKILL.md 可以看到接入流程被标准化为五个步骤需要严格按顺序执行加载广告 → 注册事件回调 → 添加触发 UI 元素 → 展示广告 → 验证实现。下面逐一展开。步骤 1加载广告使用静态方法RewardedAd.Load()传入广告单元 ID、AdRequest对象以及完成回调ActionRewardedAd, LoadAdError// Test ad unit IDs. Replace with your own ad unit IDs. #if UNITY_ANDROID string adUnitId ca-app-pub-3940256099942544/5224354917; #elif UNITY_IPHONE string adUnitId ca-app-pub-3940256099942544/1712485313; #else string adUnitId unused; #endifRewardedAd.Load(adUnitId, new AdRequest(), (RewardedAd ad, LoadAdError error) { if (error ! null || ad null) { // Handle the error. return; } rewardedAd ad; });要点说明测试广告单元 ID上例中的两个 ID 分别为 Android5224354917与 iOS1712485313平台的官方测试广告单元可在开发调试阶段稳定返回测试填充上线前必须替换为你自己在 AdMob 后台创建的正式广告单元 ID。#if UNITY_ANDROID / #elif UNITY_IPHONE / #else是 Unity 平台条件编译指令保证不同目标平台使用各自的 ID其他平台如编辑器内使用unused占位。回调签名ActionRewardedAd, LoadAdError中两个参数只会有一个非空——加载成功时ad非空、error为 null加载失败时error非空。回调内必须同时判空二者避免解引用空引用导致异常。加载前销毁旧实例在调用RewardedAd.Load()之前必须销毁任何已存在的RewardedAd对象调用Destroy()否则可能触发广告单元已被使用类错误。步骤 2注册广告事件回调订阅RewardedAd对象上的事件是可选的取决于应用需求。官方文档给出的事件及其典型用途如下事件典型用途OnAdPaid记录估算广告收入AdValue用于曝光级广告变现追踪OnAdImpressionRecorded在内部遥测或第三方分析平台中记录广告曝光OnAdClicked记录用户对广告的点击OnAdFullScreenContentOpened广告全屏覆盖时暂停游戏音频、计时器或游戏循环OnAdFullScreenContentClosed广告关闭后恢复游戏音频与游戏循环同时销毁RewardedAd对象并重新Load()为下一个奖励节点备好新广告OnAdFullScreenContentFailed广告展示失败时记录展示错误日志一个订阅示例如下rewardedAd.OnAdFullScreenContentOpened () { // 这里应同步实现暂停游戏音频、计时器等逻辑 };线程安全必须用 MobileAdsEventExecutor 调度到主线程关键陷阱Unity API 不是线程安全的必须只在主线程调用。而 GMA SDK 的广告事件回调可能在后台线程触发。因此凡是在回调中要操作UnityEngine对象都必须显式通过MobileAdsEventExecutor.ExecuteInUpdate()调度到主线程执行rewardedAd.OnAdFullScreenContentOpened () { MobileAdsEventExecutor.ExecuteInUpdate(() { // Interact with UnityEngine objects on the main thread here. }); };这一要求在仓库内所有 Unity 广告格式文档中都被反复强调——unity-banner.md 中甚至标注为CRITICAL凡是在提供 Unity 广告代码或指令时必须明确说明后台广告回调需通过ExecuteInUpdate()调度到主线程。跳过此步骤会导致难以定位的崩溃或运行时异常。步骤 3添加查看广告的 UI 元素强制要求MANDATORY你必须明确展示或说明添加一个可交互的 UI 元素如 Button来触发ShowRewardedAd()。激励视频广告绝不允许自动弹出用户必须明确选择opt-in观看广告这是激励视频与插屏广告Interstitial的核心差异之一。在 Unity 中你需要在场景中创建 UI → Button编写一个公开方法ShowRewardedAd()在按钮的onClick事件中绑定它。步骤 4展示广告并发放奖励在展示前检查CanShowAd()并通过Show()方法传入ActionReward回调同时做空值判断避免异常// Call this method from a UI Button click event: public void ShowRewardedAd() { if (rewardedAd ! null rewardedAd.CanShowAd()) { rewardedAd.Show((Reward reward) { // Reward the user. Debug.Log($Rewarded! Amount: {reward.Amount}, Type: {reward.Type}); }); } }要点说明CanShowAd()用于确认广告已加载完成且可以展示避免在广告尚未就绪时调用Show()引发错误ActionReward回调在用户完整观看完视频广告后才触发此时应发放奖励Reward对象携带Amount奖励数量与Type奖励类型如金币、道具名可作为发放逻辑的依据也可仅用于日志验证当rewardedAd为 null尚未加载成功或CanShowAd()返回 false 时方法应静默返回或提示用户稍后再试而不是直接崩溃。奖励发放的完整闭环结合步骤 2 中的OnAdFullScreenContentClosed用户观看完广告 → 收到奖励 → 广告关闭 → 销毁当前RewardedAd实例并重新Load()预加载下一条广告从而保证下一个奖励节点如用户再次点击按钮时广告已就绪。这是激励视频循环的推荐实现模式。步骤 5验证实现完成以上步骤后检查以下事项Unity Console 中没有任何 C# 脚本编译错误没有缺失GoogleMobileAds命名空间引用通常表现为 The type or namespace name GoogleMobileAds could not be found 之类错误。若出现命名空间缺失错误请回到 unity-get-started.md 确认 SDK 依赖是否正确安装见下文第五部分。三、深入理解AdRequest 与广告单元配置new AdRequest()创建的是基础请求对象。对于更精细的控制可在构造时链式设置请求配置AdRequest request new AdRequest { // 例如通过 RequestConfiguration 设置儿童方向、测试设备等 };需要说明的是加载激励视频广告使用的是基础AdRequest无需像横幅广告那样额外指定尺寸与位置因为激励视频是全屏广告格式。若你的工程同时集成了横幅或插屏广告可对照 unity-banner.md横幅需指定AdSize与AdPosition与 unity-interstitial.md 理解各格式的 API 差异。四、与其他平台实现的对照供迁移参考仓库同目录还提供了 Android 与 iOS 平台的激励视频接入说明对照阅读可加深理解AndroidNext-Gen SDKandroid-rewarded.md 使用RewardedAd.load(AdRequest, AdLoadCallbackRewardedAd)其中AdRequest.Builder(adUnitId).build()在构造时即传入广告单元 ID与 Unity 的Load(adUnitId, ...)签名不同同时强制要求回调中的 UI 操作包裹在runOnUiThread {}或Dispatchers.Main.launch {}中否则应用会崩溃——这与 Unity 平台强制使用MobileAdsEventExecutor.ExecuteInUpdate()是同一线程安全原则在不同平台的具体体现。GMA Next-Gen SDK 的完整迁移映射可参考 android-migrate-to-next-gen/SKILL.md。iOSios-rewarded.md 建议 Swift 代码使用async/await替代 completion handler并通过fullScreenContentDelegate注册展示生命周期回调present(from:)的rootViewController参数可选可传nil并需传入UserDidEarnRewardHandler处理奖励。三个平台共享同一套产品逻辑先加载、注册回调、提供显式 UI 触发、展示并发放奖励、关闭后销毁并预加载下一条。五、前置条件SDK 安装与初始化激励视频广告依赖 GMA SDK 的正常集成。根据 unity-get-started.md完成以下三件事后本文代码即可运行安装依赖在Packages/manifest.json中通过 OpenUPM scoped registry 引入com.google.ads.mobile按最新稳定版本号填写配置应用 ID修改Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset设置adMobAndroidAppId与adMobIOSAppId开发阶段可用官方示例 App ID发布前替换为真实 ID初始化 SDK在Start()中调用一次MobileAds.Initialize(...)且不要将MobileAds.RaiseAdEventsOnUnityMainThread设为true该属性已废弃这正是本文强调必须手动使用ExecuteInUpdate()调度的原因。结语激励视频广告的 Unity 接入并不复杂但存在三个必须遵守的硬性约束加载前销毁旧实例、广告必须由用户显式触发而非自动弹出、所有回调中的 Unity 对象操作必须调度到主线程。遵循本文的五步工作流配合仓库中对应的 SKILL.md 清单逐项勾选即可在 Unity 工程中稳定地接入激励视频广告并在每个奖励节点为用户提供流畅的奖励体验。【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考