1. 项目概述:为什么Unity游戏必须搞定穿山甲广告SDK?
做Unity独立开发或者小团队的朋友,对“广告变现”这四个字一定不陌生。辛辛苦苦把游戏做出来,上线后怎么赚钱?内购当然是一条路,但对于大量休闲、超休闲或者中小体量的游戏来说,广告变现,尤其是激励视频广告,是支撑项目活下去、甚至活得很好的关键现金流。而在国内移动广告平台里,穿山甲(Pangle)凭借其背靠的庞大流量池和相对成熟的生态,成为了许多开发者的首选。
但“接入”这两个字,听起来简单,做起来全是坑。我见过太多团队,游戏本身质量不错,一到接入SDK就卡壳:Unity编辑器里跑得好好的,一打包到Android就黑屏崩溃;广告加载不出来,收益报表天天挂零;或者更头疼的,好不容易接上了,却因为一个配置疏忽,导致应用商店审核被拒。这些问题,轻则耽误几天上线时间,重则直接影响项目收入,甚至导致项目失败。
所以,今天我想结合自己趟过的无数个坑,和你从头到尾、事无巨细地走一遍Unity游戏接入穿山甲广告SDK的全过程。这不是一份照搬官方文档的说明书,而是一份融合了实战经验、避坑指南和原理剖析的“生存手册”。我们的目标很明确:让你能避开我踩过的所有雷,用最高效、最稳定的方式,把穿山甲广告SDK稳稳地集成到你的Unity项目中,顺利上线并开始赚钱。
2. 接入前的核心准备:环境、账号与SDK选型
在动手写一行代码之前,充分的准备工作能帮你省去后面80%的麻烦。这个阶段的核心是:搭好环境、搞清权限、选对版本。
2.1 开发环境与Unity工程配置
首先,确保你的“武器库”是齐全且兼容的。根据穿山甲最新的要求(从6.8.0.7版本起),SDK仅支持minSdkVersion为24,即Android 7.0及以上系统。这意味着你的Unity项目配置必须与之匹配。
- Unity版本选择:理论上,2018.4 LTS及以上的版本都支持。但我个人强烈推荐使用最新的LTS(长期支持)版本,例如2022.3 LTS。新版本对Android构建管线的支持更好,能避免很多陈旧的兼容性问题。如果你遇到了“Unity程序打开黑屏无响应”的问题,首先就应该检查Unity版本是否过旧或存在已知Bug。
- Android SDK与JDK配置:这是新手最容易栽跟头的地方。
- JDK:Unity从某个版本开始,对JDK版本有了更严格的要求。比如,如果你遇到提示“需要JDK<11.0.14.1,下载不到怎么办”,这通常意味着Unity Hub或项目设置指向的JDK版本过高或不兼容。解决方案是使用Unity官方推荐的JDK 8。你可以通过Unity Hub安装Android模块时自动安装,或者手动下载Oracle JDK 8或OpenJDK 8,并在
Preferences -> External Tools中正确设置路径。 - Android SDK/NDK:同样在Unity Hub中安装即可。确保安装了必要的SDK Platform(API Level 24及以上)和Build-Tools。
- 关键检查点:在Unity中打开
File -> Build Settings -> Player Settings...,切换到Android平台,查看Other Settings:Minimum API Level:设置为24 (Android 7.0)或更高。Target API Level:建议设置为你能测试到的最高版本(如33/34),这对应用商店上架和权限管理有好处。Scripting Backend:对于新项目,建议使用IL2CPP,它性能更好,且是64位应用的强制要求(如Google Play)。Target Architectures:勾选ARMv7和ARM64。穿山甲SDK从某个版本起默认只提供这两种架构的库,全选可以覆盖绝大多数设备。
- JDK:Unity从某个版本开始,对JDK版本有了更严格的要求。比如,如果你遇到提示“需要JDK<11.0.14.1,下载不到怎么办”,这通常意味着Unity Hub或项目设置指向的JDK版本过高或不兼容。解决方案是使用Unity官方推荐的JDK 8。你可以通过Unity Hub安装Android模块时自动安装,或者手动下载Oracle JDK 8或OpenJDK 8,并在
2.2 穿山甲媒体平台账号与应用创建
没有账号,一切免谈。你需要前往穿山甲媒体平台注册一个开发者账号。这个过程不复杂,但有几个细节需要注意:
- 应用创建:在媒体平台创建你的游戏应用。应用包名(Package Name)必须与你Unity项目中
Player Settings里的Bundle Identifier完全一致,一个字符都不能差。这是广告请求和收益归属的基石。 - 广告位(代码位)申请:你需要为不同类型的广告创建不同的广告位ID(也叫代码位/Ad Slot ID)。通常至少需要:
- 开屏广告:App启动时展示。
- 激励视频广告:用户观看完整视频后获得游戏内奖励(如复活、金币、道具)。这是收益的核心来源。
- 插屏广告:游戏自然中断点(如关卡结束、返回主菜单)展示。
- 信息流/Banner广告:在游戏UI的固定位置持续展示。实操心得:在测试阶段,务必为每种广告类型申请测试专用的广告位ID。穿山甲平台提供了测试ID,使用它们可以避免在开发过程中因填充率不足或广告内容不合适而影响调试。正式上线前再替换为正式的广告位ID。
2.3 SDK下载与版本选择策略
去穿山甲开发者中心下载最新的Unity SDK插件包(通常是一个.unitypackage文件)。这里有一个至关重要的策略问题:应该用最新版还是某个稳定版?
查看官方冗长的版本记录(就像你提供的资料那样),你会发现SDK迭代非常快,每个版本都有修复、优化和**“重要变更”**。我的建议是:
不要盲目追求最新版,而是选择上一个“次要版本”的最新修订版。
例如,当前最新版是7.6.x,你可以选择7.5.x的最新版(如7.5.1.7)。原因如下:
- 稳定性:新版本的大功能刚推出,可能隐藏未知Bug。上一个次要版本已经过一段时间的市场检验,相对更稳。
- 维护周期:穿山甲SDK的版本维护时间约为10个月。选择一个仍在维护期内的版本,既能获得稳定性修复,又不会因为版本太老而失去支持。
- 文档与社区:稍旧一点的版本,遇到的坑通常在网上能找到更多的讨论和解决方案。
注意事项:下载SDK时,注意区分“普通版”和“GroMore聚合版”。如果你是单一接入穿山甲,用普通版即可;如果你未来考虑聚合多家广告平台(如腾讯优量汇、快手联盟),可以一开始就使用GroMore版本,但接入复杂度会稍高。
3. SDK集成详解:从导入到初始化
拿到SDK的.unitypackage文件后,真正的集成工作开始了。这一步的目标是让SDK在你的Unity工程里安家落户,并成功完成初始化。
3.1 插件导入与基础配置
- 导入Package:在Unity中,
Assets -> Import Package -> Custom Package...,选择下载的.unitypackage文件。导入时,建议全选所有文件。导入后,你的Assets目录下通常会生成一个Pangle或CSJ(穿山甲缩写)的文件夹,里面包含了SDK的核心文件、示例场景和脚本。 - 配置AndroidManifest与Gradle:这是Unity接入任何Android SDK的通用难点。穿山甲SDK通常已经帮你处理了大部分,但你需要检查:
- MainTemplate.gradle:Unity 2019.3+版本使用了Gradle构建系统,你需要在
Assets/Plugins/Android目录下找到或创建mainTemplate.gradle文件。穿山甲插件可能会自动修改它,添加必要的仓库和依赖。你需要确保其中包含了对穿山甲Android SDK的依赖,例如:dependencies { implementation 'com.bytedance.sdk:pangolin:7.5.1.7' // 版本号需与你导入的Unity插件匹配 } - 权限与组件:SDK会自动在合并后的AndroidManifest中添加必要的权限(如网络、存储权限)和Activity组件。你需要确保你的项目没有因为其他插件或设置而覆盖或禁用了这些配置。一个常见的检查方法是使用
Assets/External Dependency Manager(如果SDK包里有)来解析Android依赖。
- MainTemplate.gradle:Unity 2019.3+版本使用了Gradle构建系统,你需要在
3.2 SDK初始化:时机、线程与回调
初始化是广告系统的“点火开关”,必须在任何广告请求之前完成,且只应执行一次。
- 初始化代码位置:最佳实践是在游戏启动后最早的可执行点进行。通常放在一个永不销毁的GameObject的
Start()或Awake()方法中。例如,创建一个AdManager的单例对象。using UnityEngine; using Pangle; // 或具体的命名空间,根据SDK版本而定 public class AdManager : MonoBehaviour { public static AdManager Instance; private bool isSDKInitialized = false; void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); InitPangleSDK(); } else { Destroy(gameObject); } } void InitPangleSDK() { // 1. 构建配置 var config = new PangleConfig.Builder() .AppId("你的应用App ID") // 从穿山甲平台获取 .UseTextureView(true) // 根据需求,某些广告类型使用TextureView表现更好 .AllowShowNotify(true) // 是否允许通知,如下载完成通知 .Debug(true) // 测试阶段开启,输出详细日志 .Build(); // 2. 异步初始化(必须主线程) PangleSDK.Init(config, new InitCallback()); } // 初始化回调类 class InitCallback : IPangleInitCallback { public void OnInitSuccess() { Debug.Log("穿山甲SDK初始化成功!"); AdManager.Instance.isSDKInitialized = true; // 可以在这里开始预加载广告 } public void OnInitFail(int code, string message) { Debug.LogError($"穿山甲SDK初始化失败!code:{code}, msg:{message}"); // 需要处理初始化失败,可能是网络或AppId错误 } } } - 关键注意事项:
- 主线程要求:从SDK 3.4.5.1版本开始,初始化必须在主线程(Unity主线程)调用。Unity的
Awake()/Start()本身就在主线程,所以放在这里是安全的。但如果你在其他线程(如网络回调线程)中调用,会导致崩溃或初始化失败。 - 异步初始化:
PangleSDK.Init是异步的。你不能在调用Init后立即请求广告,必须等待OnInitSuccess回调。我习惯在成功回调里设置一个标志位(如isSDKInitialized),所有广告请求前都检查这个标志。 - AppId有效性:确保填入的AppId来自穿山甲平台,且与应用包名绑定。测试阶段可以使用穿山甲提供的通用测试AppId,但上线前务必换成自己的。
- 主线程要求:从SDK 3.4.5.1版本开始,初始化必须在主线程(Unity主线程)调用。Unity的
3.3 权限与隐私合规配置
近年来,国内对用户隐私保护的要求越来越严格。穿山甲SDK需要获取一些设备信息用于广告投放和效果追踪,这要求我们必须妥善处理隐私合规。
- 必要权限声明:在
Player Settings -> Android -> Manifest中,或直接在你的AndroidManifest.xml文件里,确保声明了必要的权限。常见的包括:<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />(可选,用于优化网络判断)- 如果涉及下载安装,可能还需要
WRITE_EXTERNAL_STORAGE和REQUEST_INSTALL_PACKAGES权限,但务必遵循Android分区存储和权限动态申请的最佳实践。
- 隐私协议与用户授权:这是重中之重,直接关系到应用能否过审。
- 时机:必须在初始化SDK之前,获取用户的同意。通常是在游戏启动后,第一个界面弹出你自己的《隐私政策》和《用户协议》弹窗。
- 设置接口:穿山甲SDK提供了设置隐私配置的接口(如
PangleSDK.SetPrivacyConfig)。你需要在用户点击“同意”后,调用这些接口,告知SDK用户已授权。 - 关键配置:
// 在用户同意隐私政策后调用,在Init之前 PangleSDK.SetPrivacyConfig(new PrivacyConfig.Builder() .LimitPersonalAds(false) // 是否限制个性化广告,根据用户选择设置 .CanUsePhoneState(false) // 是否允许读取设备状态(如IMEI) .CanUseWifiState(false) // 是否允许使用WIFI状态 .CanUseOaid(true) // 是否允许使用OAID(中国移动安全联盟推出的设备标识) .Build()); - 实操心得:很多审核被拒,问题都出在这里。务必确保你的应用有清晰、可点击的隐私政策链接,并且“同意”和“拒绝”按钮功能明确。如果用户拒绝,你应该限制SDK的某些数据收集行为,并可能影响广告填充和收益,这是合规的必要代价。
4. 各类型广告接入实战与避坑指南
SDK初始化成功后,就可以开始接入具体的广告了。我们以最核心的激励视频、开屏和插屏广告为例,拆解每一步。
4.1 激励视频广告:收益的生命线
激励视频是用户体验和开发者收益平衡得最好的一种形式。接入流程可以概括为:加载 -> 监听 -> 展示 -> 发奖。
广告位配置与加载:
public void LoadRewardedVideoAd() { if (!isSDKInitialized) return; // 1. 创建广告请求配置 var adSlot = new AdSlot.Builder() .SetCodeId("你的激励视频广告位ID") // 测试或正式ID .SetOrientation(AdOrientation.Vertical) // 方向,通常竖屏 .SetExpressViewAcceptedSize(屏幕宽, 屏幕高) // 期望的广告视图大小 .SetSupportDeepLink(true) .SetRewardName("金币") // 奖励名称,需与平台配置一致 .SetRewardAmount(100) // 奖励数量 .SetUserID("optional_user_id") // 可选,用于服务端回调验证 .SetMediaExtra("optional_extra") // 可选,自定义透传信息 .Build(); // 2. 创建广告请求对象 var adNative = PangleSDK.CreateAdNative(); // 3. 加载广告 adNative.LoadRewardVideoAd(adSlot, new RewardVideoAdListener()); }避坑指南:
SetRewardName和SetRewardAmount:这里设置的内容必须与你在穿山甲媒体平台该广告位后台配置的奖励信息完全一致。否则可能导致奖励验证失败,用户看了广告却拿不到奖励,体验极差。SetUserID:如果你有用户系统,强烈建议传入。当广告播放完成并验证后,穿山甲服务器会向你的服务器发送一个回调(需配置),其中包含这个UserID和奖励信息,你可以用它来安全地给用户发放奖励,防止本地作弊。
广告监听器实现:这是逻辑最复杂的部分,需要处理广告生命周期的所有回调。
class RewardVideoAdListener : IRewardVideoAdListener { private IRewardVideoAd rewardAd; // 广告加载成功 public void OnRewardVideoAdLoad(IRewardVideoAd ad) { this.rewardAd = ad; Debug.Log("激励视频广告加载成功,可以展示了"); // 可以在这里更新UI,比如点亮“看广告得奖励”的按钮 } // 广告加载失败 public void OnRewardVideoError(int code, string message) { Debug.LogError($"激励视频加载失败: {code}, {message}"); // 可以在这里进行重试逻辑,但注意频率控制 } // 广告素材缓存成功(视频下载完成) public void OnRewardVideoCached() { Debug.Log("激励视频素材已缓存,展示将更流畅"); } // 广告展示 public void OnRewardVideoAdShow() { Debug.Log("激励视频开始展示"); // 可以在这里暂停游戏音乐、计时器等 } // 广告被点击 public void OnRewardVideoAdClick() { Debug.Log("激励视频被点击"); } // 广告播放完成(用户看到了最后) // 注意:播放完成不等于应该发奖!发奖依据是OnRewardVerify public void OnRewardVideoComplete() { Debug.Log("激励视频播放完成"); } // 广告关闭 public void OnRewardVideoAdClose() { Debug.Log("激励视频关闭"); // 在这里恢复游戏音乐、计时器等 // 同时,可以开始预加载下一个激励视频广告 } // **最关键的回调:奖励验证** public void OnRewardVerify(bool rewardVerify, int rewardAmount, string rewardName, int code, string message) { if (rewardVerify && code == 0) { Debug.Log($"奖励验证成功!发放{rewardAmount}个{rewardName}"); // !!!在这里给玩家发放游戏内奖励!!! GameManager.Instance.AddCoins(rewardAmount); } else { Debug.LogWarning($"奖励验证未通过: {code}, {message}"); // 可以给用户一个提示,但不要发放奖励 } } // 视频播放出错 public void OnRewardVideoError(int code, string message, IRewardVideoAd ad) { Debug.LogError($"激励视频播放出错: {code}, {message}"); } }致命陷阱:绝对不要在
OnRewardVideoComplete里发奖!必须只在OnRewardVerify回调且rewardVerify为true、code为0时发奖。因为用户可能中途关闭广告,或者广告平台验证认为此次观看无效。在此回调发奖是唯一安全的方式。展示广告:当广告加载成功(
OnRewardVideoAdLoad回调后),并且玩家点击了某个按钮触发观看时,调用展示方法。public void ShowRewardedVideoAd() { if (rewardAd != null) { // 展示前,务必设置交互监听器(新版本强制要求) rewardAd.SetRewardAdInteractionListener(new RewardAdInteractionListenerImpl()); // 展示广告 rewardAd.ShowRewardVideoAd(); } else { Debug.Log("广告未就绪,请先加载"); // 可以给用户一个“广告加载中,请稍候”的提示 } }
4.2 开屏广告:第一印象与冷启动收益
开屏广告在应用启动后立即展示,是重要的收益补充和品牌曝光渠道。它的接入有特殊要求。
- 特殊配置:开屏广告需要指定一个
Activity作为容器。在Unity中,这个Activity就是你的主Activity。你需要在AndroidManifest.xml中确保你的主Activity配置了正确的android:configChanges和android:windowSoftInputMode属性(Unity默认会配置)。穿山甲SDK通常会自动合并必要的配置。 - 代码接入:
public void LoadAndShowSplashAd() { var adSlot = new AdSlot.Builder() .SetCodeId("你的开屏广告位ID") .SetImageAcceptedSize(屏幕宽, 屏幕高) // 开屏广告尺寸 .SetExpressViewAcceptedSize(屏幕宽, 屏幕高) // 模板广告尺寸 .Build(); var adNative = PangleSDK.CreateAdNative(); // 注意:开屏广告的Load方法通常需要传入一个Activity(UnityPlayer.CurrentActivity) adNative.LoadSplashAd(adSlot, new MySplashAdListener(), 超时时间(毫秒)); } class MySplashAdListener : ISplashAdListener { public void OnSplashAdLoad(ISplashAd ad) { // 加载成功,通常立即展示 ad.ShowSplashAd(GetUnityActivity()); } // ... 其他回调如OnSplashAdShow, OnSplashAdClick, OnSplashAdClose等 } // 获取Unity的当前Activity private static AndroidJavaObject GetUnityActivity() { using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { return jc.GetStatic<AndroidJavaObject>("currentActivity"); } } - 避坑指南:
- 超时处理:开屏广告加载必须设置超时(如3000ms)。如果超时未加载成功,应该跳过广告直接进入游戏主界面,避免让用户长时间等待白屏。
- 跳过按钮:SDK会自带一个“跳过”按钮。你需要确保你的游戏启动图或首个场景的背景与开屏广告协调,避免UI重叠或视觉冲突。
- 冷启动优化:开屏广告的加载和展示会延长App的冷启动时间。可以考虑在
Application.launching事件中尽早初始化SDK并预加载开屏广告,或者使用占位图+异步加载的方式来优化体验。
4.3 插屏广告与信息流广告
插屏广告的接入方式与激励视频类似,有对应的LoadInterstitialAd和ShowInterstitialAd方法。关键点在于选择合理的展示时机,如游戏暂停、关卡切换、商店弹出前后,避免打断核心玩法。
信息流/Banner广告需要你提供一个ViewGroup容器(在Unity中通常是一个AndroidWidget或通过AndroidJavaObject创建的布局)来承载广告视图。接入相对复杂,需要处理Android原生视图与Unity的交互。通常步骤是:
- 在Unity中创建一个
AndroidJavaObject代表一个FrameLayout。 - 请求广告(
LoadBannerAd)。 - 在加载成功的回调中,将广告视图(
AdView)添加到之前创建的FrameLayout中。 - 通过JNI或插件,将这个原生视图覆盖到Unity的某个
UIRect区域上。
通用避坑点:
- 内存管理:广告对象(如
IRewardVideoAd,ISplashAd)在展示完毕后,应及时置空或销毁,避免内存泄漏。特别是信息流广告,在场景切换时要记得从视图层级中移除。 - 加载频率与策略:不要无节制地频繁请求广告,这可能导致请求限制或浪费流量。合理的策略是:在广告关闭后立即预加载下一个;对于激励视频,可以在玩家接近可能触发广告的点(如角色死亡前)提前加载。
- 横竖屏适配:在
AdSlot中正确设置SetOrientation。如果你的游戏支持横竖屏切换,需要处理广告视图的重建。
5. 打包、测试与上线前终极校验
代码写完了,在Editor里也能跑通回调,但这离真正上线还差最关键的一步:打包到真机测试,并解决那些只有真机上才会出现的问题。
5.1 Android打包配置与疑难杂症
- 构建设置:在
Build Settings中,确保选择了正确的场景,输出格式为Android。点击Player Settings进行最后检查:Other Settings:Package Name: 确认与穿山甲后台一致。Version&Bundle Version Code: 设置好版本号。Scripting Define Symbols: 可以添加PANGLE_AD之类的宏,方便代码中做条件编译。
Publishing Settings:Keystore: 使用一个正式的或测试的Keystore文件。记住,不同Keystore签名的APK,在穿山甲后台被视为不同的应用。测试和上线务必使用同一个,或者在后台上传对应的签名信息。
- 常见打包问题:
- “Unable to merge android manifests”:通常是因为多个插件(包括穿山甲SDK)提供的
AndroidManifest.xml中有冲突的配置。需要手动合并或使用Assets/Plugins/Android下的mainTemplate.gradle和baseProjectTemplate.gradle进行精细控制。 - “Failed to update Unity WebPlayer” / “Unity Launch Error”:这些通常与Unity版本或项目损坏有关,与广告SDK关系不大。尝试新建一个空白项目,只导入穿山甲SDK测试,以排除项目本身的问题。
- “JDK not found”:回到第一部分的环境配置,确保Unity首选项中JDK路径指向有效的JDK 8安装目录。
- “Unable to merge android manifests”:通常是因为多个插件(包括穿山甲SDK)提供的
5.2 真机测试与日志抓取
永远不要只相信Unity编辑器的模拟结果!必须在真机上进行全面测试。
- 连接手机调试:用USB连接Android手机,开启开发者选项和USB调试。在Unity中
Build And Run。 - 查看日志:使用
adb logcat命令或Unity的Android Logcat包来查看设备日志。过滤标签Pangle或CSJ,可以看到SDK详细的运行日志,包括初始化、广告请求、展示、错误等信息。 - 测试广告位ID:务必使用穿山甲提供的测试广告位ID进行测试。测试广告能保证100%填充,且内容固定,方便调试样式和交互。正式ID在测试环境下可能无填充。
- 测试点清单:
- [ ] 应用启动,开屏广告正常展示和关闭。
- [ ] 激励视频广告能加载、展示、播放完毕,并正确触发
OnRewardVerify回调。 - [ ] 点击激励视频广告的“关闭”按钮后,游戏场景和状态恢复正常。
- [ ] 在网络切换(Wi-Fi -> 4G)、中断的情况下,广告行为符合预期(如加载失败有提示)。
- [ ] 游戏切换到后台再回来,广告音频/视频不会异常继续播放。
- [ ] 多次连续请求广告,没有崩溃或内存泄漏。
- [ ] 检查Logcat,没有持续的、严重的错误或警告。
5.3 上线前终极检查清单
在提交商店审核前,逐项核对以下列表:
- 配置类:
- [ ] 包名、AppId、广告位ID均已从测试环境切换为正式环境。
- [ ]
Player Settings中的版本号已更新。 - [ ] 所有SDK初始化配置(如Debug模式)已关闭。
- [ ] 隐私协议弹窗及用户授权逻辑已完整实现,并与SDK隐私配置正确联动。
- [ ] AndroidManifest中的权限声明合理且必要,敏感权限(如电话、存储)已做好动态申请或解释。
- 代码类:
- [ ] 所有广告回调(尤其是奖励发放)逻辑正确,没有在错误的位置发奖。
- [ ] 正确处理了广告加载失败、展示失败等各种异常情况,有降级处理(如加载失败不显示按钮)。
- [ ] 内存管理得当,没有明显的对象泄漏(可借助Profiler在真机上监测)。
- [ ] 游戏逻辑与广告展示逻辑解耦良好,广告的加载、展示不影响核心游戏循环的流畅性。
- 商店合规:
- [ ] 应用描述和截图已更新,包含广告说明(如“包含广告”)。
- [ ] 隐私政策链接有效,内容详尽,明确说明了穿山甲SDK收集和使用数据的情况。
- [ ] 确保广告内容与游戏分级(如年龄分级)相符。
6. 上线后监控、优化与问题排查
游戏上线,接入工作并未结束,而是进入了新的阶段:监控和优化。
6.1 数据监控与收益分析
每天登录穿山甲媒体平台,关注核心数据:
- 展示量和点击量:判断广告填充率和用户互动情况。
- eCPM(千次展示收益):这是衡量广告价值的核心指标。eCPM波动受广告主预算、用户质量、广告格式等多种因素影响。
- 填充率:广告请求的成功率。填充率过低(如低于70%)需要排查原因,是广告位配置问题、用户地域问题,还是SDK集成有误。
- 点击率(CTR):点击次数/展示次数。CTR过低可能意味着广告展示位置不佳或用户对当前广告内容不感兴趣。
优化方向:
- 广告位调整:尝试不同的广告形式、尺寸和位置。例如,激励视频的触发按钮是否足够明显?插屏广告的弹出时机是否过于频繁惹人厌?
- 瀑布流优化:如果你使用GroMore聚合,可以调整各广告源的底价和排序。
- 用户分层:考虑对高价值用户(付费用户)减少广告展示频率,对免费用户设计更合理的广告激励点。
6.2 常见线上问题排查
即使测试充分,线上仍可能出问题。以下是几个典型场景的排查思路:
“广告加载不出来”(低填充率):
- 检查网络:确保用户设备网络正常。可以集成网络状态检测,在网络差时不展示广告入口。
- 检查配置:确认正式广告位ID已正确配置,且在穿山甲后台处于“启用”状态。
- 检查地区:某些广告活动有地域限制。如果你的用户主要在海外,而你的广告位只接了国内源,填充率自然会低。
- 查看SDK日志:联系穿山甲技术支持,提供用户的设备ID、时间戳和广告位ID,他们可以查询后台请求日志,看具体错误码是什么(如40025表示请求参数错误)。
“用户说看了广告没给奖励”:
- 验证回调:首先确认你的服务器是否收到了穿山甲的服务端奖励验证回调(如果你配置了)。这是最可靠的证据。
- 检查客户端逻辑:回顾代码,确认发奖逻辑只在
OnRewardVerify成功回调中触发。 - 检查奖励配置:确认代码中
SetRewardName和SetRewardAmount与平台配置一字不差。 - 用户操作:是否用户提前关闭了广告?SDK的奖励验证规则可能判定为无效观看。
“游戏偶尔崩溃,日志指向穿山甲SDK”:
- 收集信息:尽可能获取崩溃堆栈信息、设备型号、系统版本、SDK版本。
- 线程问题:SDK的很多回调可能在非Unity主线程。确保在回调中更新Unity对象或场景时,使用
MainThreadDispatcher或UnityEngine.Threading.Dispatcher切换到主线程。 - 内存问题:在低内存设备上,加载高清视频广告可能引发OOM。可以考虑在低端机策略性降低广告预加载数量或清晰度(如果SDK支持)。
- 版本问题:检查是否使用了已知有严重Bug的SDK版本。回顾官方更新日志,考虑升级到一个更稳定的版本。
6.3 SDK版本升级策略
穿山甲SDK更新频繁。升级时务必谨慎:
- 阅读更新日志:仔细阅读你提供的那个冗长的版本记录,关注“重要通知”、“废弃”、“变更”等内容。例如,从某个版本开始初始化API变了,或者某个回调接口下线了。
- 在测试分支操作:永远不要直接在线上版本的主分支上更新SDK。新建一个分支,导入新SDK,解决所有编译错误和API变更警告。
- 全面回归测试:用测试广告位ID,对所有的广告功能进行一轮完整的测试,尤其是之前提到的测试点清单。
- 灰度发布:如果条件允许,先向小部分用户(如1%)推送带有新SDK的版本,观察崩溃率和广告收益数据,稳定后再全量。
接入广告SDK是一项细致且需要持续维护的工作。它不仅仅是技术集成,更涉及到产品设计、用户体验和商业策略的平衡。希望这份从环境准备到线上运维的完整指南,能帮你扫清Unity游戏接入穿山甲SDK道路上的大多数障碍。记住,耐心和细致是避免踩坑的最好武器。当你看到后台的收益曲线开始稳步上升时,这一切的努力都是值得的。如果在实际操作中遇到上面没覆盖的奇怪问题,多查官方文档,多利用开发者社区的搜索功能,你遇到的问题,很可能别人已经解决过了。