自己做的小游戏需要接广告,之前尝试过UnityAds和AdMob,但是都有点小问题。UnityAds对国内本土支持不好,Banner广告经常没有内容。Admob基本上都要对接到googlePlay,国内没办法。然后找了国内的广告SDK。
研究了好久,网上的教程都比较老,而且我在AndroidStudio方面完全是小白(本篇教程写于2020年9月,使用的SDK版本为V3.0)。
为什么选Unity插件不用原生?很简单,我不会安卓和IOS开发
两个都导进来
勾选Export Project,然后点Export就好了
ProjectSetting相应的打包设置不会的请百度
弹出这个选择OK就行,然后等syncing(可能会比较慢)
完成之后的结构
完成之后的结构
layoutParams.gravity = Gravity.CENTER | Gravity.BOTTOM; //Banner位于应用底部中间
layoutParams.gravity = Gravity.CENTER | Gravity.TOP;//Banner位于应用顶部中间
记住,在Unity中修改,然后导出包,不要先导出包再在AndroidStudio中修改(原因我也不知道,反正这都是我试了之后的)
public void ShowExpressBannerAd()
{
#if UNITY_IOS
if (iExpressBannerAd == null)
{
Debug.LogError("请先加载广告");
return;
}
//坐标的基点是Banner广告的左上角顶点,所以(0,0)就是位于屏幕最顶端
//如果load的时候设置的广告尺寸宽度与屏幕宽度不相等的话,就需要自己计算x坐标
int x = 0;
int y = Screen.height - (Screen.width / 640 * 100);
// 如果Banner位于应用顶部,可以加一些宏,如果是有刘海的iphone,让 y=100,避免被刘海遮挡,我的banner是在屏幕底部,所以就不用了
//if (y == 0)
//{
// y = 100; // 防止Demo里刘海遮挡
//}
iExpressBannerAd.ShowExpressAd(x, y);
#else
//安卓的显示代码
#endif
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.product">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<application
android:name="com.bytedance.android.UnionApplication"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:theme="@style/UnityThemeSelector"
android:allowBackup="true"
android:debuggable="true"
android:supportsRtl="true">
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
<meta-data android:name="android.app.lib_name" android:value="unity"/>
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false"/>
activity>
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
application>
manifest>
苹果打包编译真机调试报错
可以看到是LoadExpressRewardAd()方法中出现的,只需要把AdSlot中所有需要的参数都填上内容即可
安卓设备,激励视频广告在播放的中途切换后台再切回来,广告直接消失了。
解决方法:在导出的AndroidStudio项目中修改AndroidManifest.xml,找到activity的launchMode,默认是"singleTask",改成"singleTop"就可以了,只能在AndroidStudio中设置,Unity中改了也不生效,unity强制设置成了singleTask
使用unity插件升级最近的android和ios SDK时,直接在官方下载最新的对应SDK,安卓把Plugins/Android/open_ad_sdk.aar替换成安卓SDK里的open_ad_sdk.aar,IOS把Plugins/IOS目录下的BUAdSDK.bundle,BUAdSDK.framework,BUFoundation.framework替换成IOS SDK里Frameworks里的。
升级之后直接打包的话,原先的FullScreenVideoAD和RewardVideoAD会加载不了,需要在加载这两种广告的方法中,adSlot添加上.SetExpressViewAcceptedSize(400, 80)参数,只要参数不为0即可。
void UnionPlatform_ExpressBannersAd_Load(
const char* slotID,
float width,
float height,
BOOL isSupportDeepLink,
ExpressAd_OnLoad onLoad,
ExpressAd_OnLoadError onLoadError,
int context) {
ExpressBannerAd *instance = [[ExpressBannerAd alloc] init];
CGFloat newWidth = width/[UIScreen mainScreen].scale;
CGFloat newHeight = height/[UIScreen mainScreen].scale;
//重新为newWidth赋值为当前屏幕宽度,赋值后banner广告的宽度固定为当前屏幕宽度
newWidth = [UIScreen mainScreen].bounds.size.width;
newHeight = newWidth / 640 * 100;
if (0) {
instance.bannerView = [[BUNativeExpressBannerView alloc] initWithSlotID:[[NSString alloc] initWithUTF8String:slotID] rootViewController:GetAppController().rootViewController adSize:CGSizeMake(newWidth, newHeight) IsSupportDeepLink:YES interval:30];
} else {
instance.bannerView = [[BUNativeExpressBannerView alloc] initWithSlotID:[[NSString alloc] initWithUTF8String:slotID] rootViewController:GetAppController().rootViewController adSize:CGSizeMake(newWidth, newHeight) IsSupportDeepLink:YES];
}
instance.bannerView.frame = CGRectMake(0, CGRectGetHeight([UIScreen mainScreen].bounds)-newHeight, newWidth, newHeight);
instance.bannerView.delegate = instance;
instance.onLoad = onLoad;
instance.onLoadError = onLoadError;
instance.loadContext = context;
[instance.bannerView loadAdData];
// 强持有,是引用加+1
[[BUToUnityAdManager sharedInstance] addAdManager:instance];
(__bridge_retained void*)instance;
}
void UnionPlatform_ExpressBannersAd_Show(void* expressAdPtr, float originX, float originY) {
ExpressBannerAd *expressBannerAd = (__bridge ExpressBannerAd*)expressAdPtr;
CGFloat newX = originX/[UIScreen mainScreen].scale;
CGFloat newY = originY/[UIScreen mainScreen].scale;
//重新计算banner广告的位置
//底部:
newX = 0;
newY = [UIScreen mainScreen].bounds.size.height - expressBannerAd.bannerView.frame.size.height;
expressBannerAd.bannerView.frame = CGRectMake(newX, newY, expressBannerAd.bannerView.frame.size.width, expressBannerAd.bannerView.frame.size.height);
[GetAppController().rootViewController.view addSubview:expressBannerAd.bannerView];
}
或者unity2019以上的,也可以直接在unity中找到相应的脚本,修改再编译。