这里只总结前端接入流程和注意事项,后台配置请参考官方详细文档
mopub广告有以下类型
Bananer(横幅)
Interstitial(插屏)
Rewarded Video(激励视频)
Rewarded Playable(互动式激励 MRAID)
Native(原生)
1:下载mopub-unity-sdk
这里下载最新的unity package
2:设置支持的广告平台
推荐使用插件提供的MoPub SDK Manager来管理
需要注意的是,每次升级或者安装或者删除(删除一般只需要在Assets/MoPub/Mediation目录下删除对应目录即可)某个广告平台后,建议用External Dependency Manager工具重新设置一下jar和aar依赖。
另外在网络不好的情况下,使用External Dependency Manager会存在所需依赖拉不下来的情况,那么就需要手动把需要的依赖放到Plugins/Android目录下
这部分集成可以参考官方文档:Integrate the MoPub SDK for Unity
3:SDK接入
3.1初始化
首先根据集成的广告类型,从后台获得对应的广告id
插件中提供了Prefab来进行初始化,同时我们也可以选择使用底层代码进行初始化。笔者使用了后者。
3.1.1 预定义一些参数
//ios端旗帜式广告
public string iOSBannerID;
//ios插页式广告
public string iOSInterstitialID;
//ios激励视频广告
public string iOSVideoID;
//安卓旗帜式广告
public string AndroidBannerID;
//安卓插页式广告
public string AndroidInterstitialID;
//安卓激励视频广告
public string AndroidVideoID;
//请求广告的函数的参数是string数组,用来装上面的广告ID
private string[] _bannerAdUnits;
private string[] _interstitialAdUnits;
private string[] _rewardedVideoAdUnits;
MPRewardedVideoListener mpRewardedVideoListener = null;
DateTime lastAdTime = new DateTime(2020, 1, 1);
3.1.2 初始化
#if UNITY_IOS
_bannerAdUnits = new string[] { iOSBannerID };
_interstitialAdUnits = new string[] { iOSInterstitialID };
_rewardedVideoAdUnits = new string[] { iOSVideoID };
#elif UNITY_ANDROID
_bannerAdUnits = new string[] { AndroidBannerID };
_interstitialAdUnits = new string[] { AndroidInterstitialID };
_rewardedVideoAdUnits = new string[] { AndroidVideoID };
#endif
var anyAdUnitId = _rewardedVideoAdUnits[0];
MoPub.InitializeSdk(new MoPub.SdkConfiguration
{
//设置一个任意有效的广告Id
AdUnitId = anyAdUnitId,
LogLevel = MoPub.LogLevel.Debug,
MediatedNetworks = new MoPub.MediatedNetwork[] {
},
});
3.1.3 设置广告插件
根据项目中需要集成的广告类型,设置对应的广告插件
//加载激励视频的插件
MoPub.LoadRewardedVideoPluginsForAdUnits(_rewardedVideoAdUnits);
//初始化各种广告,现在还没有使用好几个id的需求,所以每个广告类型先都用一个id,所以都取[0]。
//按着官方用例,如果有多种id的话可以写一个for循环直接遍历创造就好
其它类型api
MoPub.LoadBannerPluginsForAdUnits(_bannerAdUnits);
MoPub.LoadInterstitialPluginsForAdUnits(_interstitialAdUnits);
MoPub.LoadRewardedVideoPluginsForAdUnits(_rewardedVideoAdUnits);
MoPub.LoadRewardedVideoPluginsForAdUnits(_rewardedRichMediaAdUnits);
3.1.4 根据广告类型具体集成
官网提供了Banner,Interstitial,Rewarded Video三种类型广告的集成教程,笔者这边只集成了激励视频,故后文以激励视频为例继续展开(需要注意的是激励视频教程中提到的后台要设置Callback Server)。
step1:在SDK初始化成功的回调中,先预加载激励视频。 step2:播放激励视频前先调用MoPub.HasRewardedVideo(adUnitId);检测视频是否准备好 step3:调用MoPub.ShowRewardedVideo(adUnitId);播放视频 step4:处理各种回调
mpRewardedVideoListener = new MPRewardedVideoListener();
// 绑定初始化回调
MoPubManager.OnSdkInitializedEvent += OnSdkInitializedEvent;
//激励视频广告回调
//激励视频预加载成功
MoPubManager.OnRewardedVideoLoadedEvent += mpRewardedVideoListener.OnRewardedVideoLoadedEvent;
//激励视频预加载失败
MoPubManager.OnRewardedVideoFailedEvent += mpRewardedVideoListener.OnRewardedVideoFailedEvent;
//激励视频加载Expired
MoPubManager.OnRewardedVideoExpiredEvent += mpRewardedVideoListener.OnRewardedVideoExpiredEvent;
//激励视频广告播放完(在播放完,用户点了关闭按钮后触发)
MoPubManager.OnRewardedVideoShownEvent += mpRewardedVideoListener.OnRewardedVideoAdShowed;
//激励视频播放失败
MoPubManager.OnRewardedVideoFailedToPlayEvent += mpRewardedVideoListener.OnRewardedVideoAdShowFailed; ;
//激励视频播放关闭
MoPubManager.OnRewardedVideoClosedEvent += mpRewardedVideoListener.OnRewardedVideoAdClosed;
private void OnSdkInitializedEvent(string adUnitId)
{
Debug.LogError("mopub SDK初始化成功, adUnitId:" + adUnitId);
#if UNITY_IOS
MoPub.RequestInterstitialAd (iOSInterstitialID);
MoPub.RequestRewardedVideo (iOSVideoID);
#elif UNITY_ANDROID
//MoPub.RequestInterstitialAd(AndroidInterstitialID);
Debug.LogError("Pre-fetch the rewarded video ad");
MoPub.RequestRewardedVideo(AndroidVideoID);//请求预加载
#endif
}
class MPRewardedVideoListener
{
public Action onReward = null;
public Action onRewardClose = null;
public Action onRewardError = null;
bool rewardSuccess = false;
public void OnRewardedVideoLoadedEvent(string adUnitId)
{
Debug.LogError("激励视频预加载成功 :" + adUnitId);
}
public void OnRewardedVideoFailedEvent(string adUnitId, string errorMsg)
{
Debug.LogError("激励视频预加载失败:" + adUnitId + ", msg:" + errorMsg);
}
public void OnRewardedVideoExpiredEvent(string adUnitId)
{
Debug.LogError("激励视频加载Expired:" + adUnitId);
AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_ShowFail);
rewardSuccess = false;
var act = onRewardError;
onRewardError = null;
if (act != null)
{
act();
}
}
public void OnRewardedVideoAdShowed(string adUnitId)
{
Debug.LogError("激励视频广告播放完");
AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_ShowSuccess);
rewardSuccess = true;
}
public void OnRewardedVideoAdShowFailed(string adUnitId, string errorMsg)
{
Debug.LogError("激励视频播放失败 :" + adUnitId + ", msg:" + errorMsg);
AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_ShowFail);
rewardSuccess = false;
var act = onRewardError;
onRewardError = null;
if (act != null)
{
act();
}
}
public void OnRewardedVideoAdClicked(string scene)
{
AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_Click);
}
public void OnRewardedVideoAdClosed(string adUnitId)
{
Debug.LogError("激励视频播放关闭 :" + adUnitId);
if (rewardSuccess)
{
var act = onReward;
var act1 = onRewardClose;
onRewardClose = null;
onRewardError = null;
onReward = null;
if (act != null)
{
act();
}
if (act1 != null)
{
act1();
}
}
else
{
var act = onRewardError;
var act1 = onRewardClose;
onRewardClose = null;
onRewardError = null;
onReward = null;
if (act != null)
{
act();
}
if (act1 != null)
{
act1();
}
}
rewardSuccess = false;
}
}
4:测试
官方Test文档中有提供100%填充的广告id,可以先用这些id来测试流程。没问题后再切换到正式id。同时也可以根据这个来很快定位是后台配置还是前端的问题。 另外最好挂V.P.N来测试广告~
5:注意事项
5.1 广告填充率低下的问题
笔者使用聚合平台集成了MoPub、Applovin、IronSource、UnityAds。通过后台控制只开启某个广告平台,发现MoPub和Applovin的填充率很低,Applovin是展示几个后就再也拉不到了,MoPub是自始至终一次都没有填充。另两个没有问题。目前还没有找到原因
5.2 各广告平台额外的配置项
上文中写到了这段代码:
MediatedNetworks = new MoPub.MediatedNetwork[] {
},
这里即按照广告平台来具体设置一些信息,但是各个广告平台需要设置哪些信息呢。可以参考AppLovin,IronSource(在这些页面左侧可以很方便导航到其它广告平台)。根据文档可以看到还需要配置一些信息,最终代码如下:
MediatedNetworks = new MoPub.MediatedNetwork[] {
//AppLovin
new MoPub.SupportedNetwork.AppLovin{
NetworkConfiguration=new Dictionary<string, string>(){
{ "sdk_key","xxxxxxxxx"},
},
},
//IronSource
new MoPub.SupportedNetwork.IronSource
{
NetworkConfiguration=new Dictionary<string, string>()
{
{ "appKey","xxxxxxxxx"},
}
}
},
至于在unity中上述sdk_key和appKey这些字符串是哪里来的,可以通过各个广告平台在Unity这边的XXXXNetworkConfig.cs脚本中获得。比如AppLovinNetworkConfig.cs的内容为:
可以很快定位关键字为:sdk_key
事实上Applovin的这个配置就是AndroidManifest中的(有些聚合SDK是把参数配置到AndroidManifest.xml中):
<meta-data android:name="applovin.sdk.key" android:value="xxxxxx" />
5.3 激励视频预加载
不知道从哪里看过一眼,说MoPub的激励视频是自己处理了预加载的。但是笔者项目中发现第一次预加载成功,顺利播放视频后。后续调用MoPub.HasRewardedVideo(adUnitId)总是返回false
无奈只有自己处理,主要做了以下工作:
- 定义bool flag来指定当前是否正在预加载视频,来规避重复的预加载。即只能在flag==false的情况下调用MoPub.RequestRewardedVideo(adUnitId);进行视频预加载,且在调用的同时,设置flag=true
- 用户在成功播放视频的onclose回调中,再次预加载视频
- 预加载成功或者失败的回调中,设置flag为false
6:官方unity sdk demo
mopub unity sdk
7:参考文档
unity导入Mopub Sdk 并导出安卓和iOS包