Unity
ADOP的AdKit:Unity¶
ADOP的AdKit(以下简称ADOP的AdKit)是一个广告模块,使用ADOP的API并遵循ADOP的指导方针进行开发。使用AdKit与Hive SDK,日志数据将发送到分析服务器,以便您可以跳过对广告的分析。
本指南解释了如何实现 AdKit,并通过修复在集成 Unity 包时发生的错误来简化这一过程。请阅读此页面以了解如何使用 AdKit 以及支持 SDK。
安装¶
- 在此下载并安装最新版本的 AdKit for ADOP。
-
在 Unity 工具栏中,选择.unitypackage 文件,路径为 Assets > Import Package > Custom Package...,然后点击 Import。
- 在 这里 下载并安装最新版本的 EDM4U。
- 如果您使用的是 Hive SDK v4,其中包含 EDM4U,则可以跳过此步骤。
Warning
在开发期间测试 AdKit 时,您必须应用 test 广告密钥。
更新¶
卸载您正在使用的AdKit,并安装最新版本以进行更新。
设置¶
请按照以下每个平台的指南配置 AdKit。
安卓¶
将格式为 ca-app-pub-XXXXX~YYYYY 的 AdMobId 添加到在 Unity 项目中生成的 Assets/Plugins/Android/AndroidManifest.xml 文件中。
<application>
<!-- AdKit -->
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-XXXXX~YYYYY"/>
<meta-data android:name="com.google.android.gms.ads.AD_MANAGER_APP" android:value="true" />
<!-- AdKit -->
</application>
iOS¶
将 GADApplicationIdentifier
添加到 Unity 构建生成的 Xcode 项目的 Info.plist 中,并将格式为 ca-app-pub-XXXXX~YYYYY 的 AdMobId 作为字符串类型输入。
在iOS 14及更高版本中,将SKAdNetworkItems添加到Info.plist中。(使用Assets/Bidmad/Editor/BidmadPostProcessBuild.cs文件进行构建时,SKAdNetworkIdentifier将自动添加。)
如何使用¶
iOS¶
当您构建 iOS 项目时,Unity 会生成 UnityFramework 目标,该目标与 DynamicFramework 一起工作。
- 设置 EDM4U(基于 1.2.179)\n确保在 Unity 编辑器的 iOS Resolver Settings(菜单:Assets > External Dependency Manager > iOS Resolver > Settings)中设置为构建 static_framwork。
- 在Assets/HIVEAdKit/Editor/AdKitPostprocess.cs文件中,取消注释导入
dynamicFramework
的行。这些行的位置如下。
(string Name, string Source)[] dynamicFrameworks = {
//("FBLPromises.xcframework", "Libraries/Bidmad/Plugins/iOS"),
("OMSDK_Pubmatic.xcframework","Pods/OpenWrapSDK/OpenWrapSDK"),
//("ADOPUtility.xcframework", "Pods/ADOPUtility"),
//("OMSDK_Teadstv.xcframework", "Pods/TeadsSDK/Frameworks"),
//("TeadsSDK.xcframework", "Pods/TeadsSDK/Frameworks"),
//("IASDKCore.xcframework", "Pods/Fyber_Marketplace_SDK/IASDKCore"),
//("AdFitSDK.framework","Pods/AdFitSDK/Frameworks")
};
- 构建项目。构建完成后,打开项目根路径中的 Podfile 以检查文件设置。
source 'https://github.com/Com2uSPlatformCorp/HiveAdKit-iOS.git'
source 'https://cdn.cocoapods.org/'
platform :ios, '12.0'
target 'UnityFramework' do
pod 'BidmadAdFitAdapter', '3.12.7.4'
pod 'BidmadADOPCoupangAdapter', '1.0.0.3'
pod 'BidmadAppLovinAdapter', '12.2.1.0'
pod 'BidmadAtomAdapter', '1.0.0.3'
pod 'BidmadFyberAdapter', '8.2.6.0'
pod 'BidmadGoogleAdManagerAdapter', '11.2.0.0'
pod 'BidmadGoogleAdMobAdapter', '11.2.0.0'
pod 'BidmadIronSourceAdapter', '7.8.0.0.0'
pod 'BidmadPangleAdapter', '5.8.0.7.0'
pod 'BidmadPartners/AdMobBidding', '1.0.3'
pod 'BidmadPubmaticAdapter', '3.2.0.3'
pod 'BidmadSDK', '6.6.1'
pod 'BidmadTeadsAdapter', '5.0.27.3'
pod 'BidmadUnityAdsAdapter', '4.9.3.0'
pod 'BidmadVungleAdapter', '7.2.2.0'
pod 'HiveAdKit_ADOP_PrivacyInfo', '1.4.6'
pod 'OpenBiddingHelper', '6.6.1'
end
target 'Unity-iPhone' do
end
use_frameworks!
- 运行
pod install
后,通过打开工作区继续进行 Xcode 设置。在检查常规选项卡时,所需的动态/框架会自动嵌入,如下所示:
Note
[与 Facebook SDK 部署相关的问题] Facebook SDK 提供了一个动态框架的构建,而广告模块则提供了一个静态框架,但 Podfile 仅支持这两种框架中的一种。因此,当您在 Unity 上构建并应用 Facebook 时,请按照以下附加设置来解决 Facebook SDK 和广告模块之间的崩溃问题。
<
在 Xcode 构建的 TARGET 列表中添加额外的库依赖。
添加 FBSDKAMKit、FBSDKCoreKit_Baseic、FBSDKCoreKit、FBSDKLoginKit 和 FBSDKShareKit 框架作为动态框架。
Note
请参考隐私调查指南以获取有关在分发应用时填写隐私调查表的信息。
ADOP Proguard 设置¶
如果您正在使用 Proguard,请添加以下 ADOP Proguard 设置。
-keep class com.adop.sdk.** { *; }
-keep class ad.helper.openbidding.** { *; }
-keep class com.adop.adapter.fc.** { *; }
-keep class com.adop.adapter.fnc.** { *; }
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient ;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keepclassmembers class * {
@android.webkit.JavascriptInterface ;
}
# Pangle
-keep class com.bytedance.sdk.** { *; }
-keep class com.bykv.vk.openvk.component.video.api.** { *; }
# Tapjoy
-keep class com.tapjoy.** { *; }
-keep class com.moat.** { *; }
-keepattributes JavascriptInterface
-keepattributes *Annotation*
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
public static final *** NULL;
}
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
@com.google.android.gms.common.annotation.KeepName *;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.google.android.gms.ads.identifier.** { *; }
-dontwarn com.tapjoy.**
在ADOP中测试广告密钥¶
使用ADOP发出的测试广告密钥是必需的。
// ANDROID Environment
public static string adopAppKey = "6933aab2-7f78-11ed-a117-026864a21938";
public static string rewardVideoUnitId = "7d9a2c9e-5755-4022-85f1-6d4fc79e4418";
public static string InterstitialAdUnitId = "e9acd7fc-a962-40e4-aaad-9feab1b4f821";
public static string AdaptiveBannerAdUnitId = "944fe870-fa3a-4d1b-9cc2-38e50b2aed43";
// IOS Environment
public static string adopAppKey = "6b097551-7f78-11ed-a117-026864a21938";
public static string rewardVideoUnitId = "29e1ef67-98d2-47b3-9fa2-9192327dd75d";
public static string InterstitialAdUnitId = "228b95a9-6f42-46d8-a40d-60f17f751eb1";
public static string AdaptiveBannerAdUnitId = "1c3e3085-333f-45af-8427-2810c26a72fc";
// Other Environments (Only the mobile envs supported.)
public static string adopAppKey = "NotSuport";
public static string rewardVideoUnitId = "NotSuport";
public static string InterstitialAdUnitId = "NotSuport";
public static string AdaptiveBannerAdUnitId = "NotSuport";
初始化 AdKit¶
为了初始化 ADOP 广告,必须发放 adopAppKey
。发放的 adopAppKey
必须作为 ADOP 广告初始化方法的参数使用。
Note
在执行重置时,如果您位于欧洲经济区和英国地区,GDPR同意弹出窗口将自动出现。在其他地区,请立即执行重置。 如果您的游戏面向欧洲经济区和英国地区,请确保您的GDPR同意弹出窗口根据GDPR消息指南进行设置。
// For commercial distribution
HIVEAdKit.InitializeWithShowGDPRConsent(adopAppKey, false, null);
// When testing GDPR
HIVEAdKit.GDPR.Reset();
HIVEAdKit.InitializeWithShowGDPRConsent(adopAppKey, true, testDeviceId);
回调¶
要使用回调,BidmadManager 必须注册为 GameObject。
GameObject bidmadManager = new GameObject("BidmadManager");
bidmadManager.AddComponent<BidmadManager>();
DontDestroyOnLoad(bidmadManager);
高级设置¶
// GameData Example
[Serializable]
public class SendInfo
{
public int level;
public int gold;
}
SendInfo addtionalInfo = new SendInfo();
addtionalInfo.level = 1;
addtionalInfo.gold = 100;
// Send as a JSON Obejct format
HIVEAdKit.SetAdditionalInfo(JsonUtility.ToJson(addtionalInfo));
奖励广告¶
奖励广告会奖励观看视频一段时间的用户,并且一次只能加载一个广告。
// Set Event Callback
EventHandlers eventHandlers = new EventHandlers.Builder()
.OnAdLoaded(OnAdLoadedCB)
.OnAdOpening(OnAdOpeningCB)
.OnAdClosed(OnAdClosedCB)
.OnAdFailed(OnAdFailedCB)
.OnAdReward(OnAdRewardCB)
.Build();
// Create RewardVideoAd Instance
RewardVideoAd = HIVEAdKit.RewardVideo.Initialize(rewardVideoUnitId, eventHandlers);
// Load RewardVideoAd
HIVEAdKit.RewardVideo.LoadAd(RewardVideoAd, "Unity-RewardVideo-Load-AdPlacementInfo");
// Show RewardVideoAd
if( HIVEAdKit.RewardVideo.IsLoaded(RewardVideoAd) ) {
HIVEAdKit.RewardVideo.Show(RewardVideoAd, "Unity-RewardVideo-Show-AdPlacementInfo");
}
插页广告¶
插页广告是覆盖游戏界面的全屏广告。
// Set Event Callback
EventHandlers eventHandlers = new EventHandlers.Builder()
.OnAdLoaded(OnAdLoadedCB)
.OnAdOpening(OnAdOpeningCB)
.OnAdClosed(OnAdClosedCB)
.OnAdFailed(OnAdFailedCB)
.OnAdClick(OnAdClickCB)
.Build();
// Create InterstitialAd Instance
InterstitialAd = HIVEAdKit.Interstitial.Initialize(InterstitialAdUnitId, eventHandlers);
// Load InterstitialAd
HIVEAdKit.Interstitial.LoadAd(InterstitialAd, "Unity-Interstitial-Load-AdPlacementInfo");
// Show InterstitialAd
if( HIVEAdKit.Interstitial.IsLoaded(InterstitialAd) ) {
HIVEAdKit.Interstitial.Show(InterstitialAd, "Unity-Interstitial-Show-AdPlacementInfo");
}
自适应横幅类型¶
自适应横幅类型广告是一种占据屏幕位置的滚动横幅。您可以使用 BannerPosition 或 yPos 值来调整横幅位置。
如果您提供 yPos 来调整横幅位置,横幅将对齐到屏幕底部,然后将根据您指定的 yPos 值向上移动。
// the example codes using the BannerPosition
// Set Event Callback
EventHandlers eventHandlers = new EventHandlers.Builder()
.OnAdLoaded(OnAdLoadedCB)
.OnAdClosed(OnAdClosedCB)
.OnAdFailed(OnAdFailedCB)
.OnAdClick(OnAdClickCB)
.Build();
// Create AdaptiveBanner Instance at Top of View
AdaptiveBannerAd = HIVEAdKit.AdaptiveBanner.Initialize(AdaptiveBannerAdUnitId, HIVEAdKit.AdaptiveBanner.BannerPosition.Top, eventHandlers);
// Create AdaptiveBanner Instance at Bottom of View
AdaptiveBannerAd = HIVEAdKit.AdaptiveBanner.Initialize(AdaptiveBannerAdUnitId, HIVEAdKit.AdaptiveBanner.BannerPosition.Bottom, eventHandlers);
// Automatic Load & Show AdaptiveBanner
HIVEAdKit.AdaptiveBanner.LoadAd(AdaptiveBannerAd, "Unity-AdaptiveBanner-Load-AdPlacementInfo");
// Destroy AdaptiveBanner
HIVEAdKit.AdaptiveBanner.Destroy(AdaptiveBannerAd);
// This example shows adjusting the banner position with specifiying the yPos value.
// Set Event Callback
EventHandlers eventHandlers = new EventHandlers.Builder()
.OnAdLoaded(OnAdLoadedCB)
.OnAdClosed(OnAdClosedCB)
.OnAdFailed(OnAdFailedCB)
.OnAdClick(OnAdClickCB)
.Build();
// Set yPos
var yPos = 100;
AdaptiveBannerAd = HIVEAdKit.AdaptiveBanner.Initialize(AdaptiveBannerAdUnitId, yPos, eventHandlers);
// Automatic Load & Show AdaptiveBanner
HIVEAdKit.AdaptiveBanner.LoadAd(AdaptiveBannerAd, "Unity-AdaptiveBanner-Load-AdPlacementInfo");
// Destroy AdaptiveBanner
HIVEAdKit.AdaptiveBanner.Destroy(AdaptiveBannerAd);
测试广告¶
在开发过程中,广告商在测试广告被点击时不应被收费是很重要的。如果您在测试模式之外点击广告过多,则会被视为无效操作。因此,请注意不要成为被举报的目标账户。
请参考Google Developers以使用测试广告。
卸载¶
要卸载 ADOP 的 AdKit,请在 Unity 项目中删除以下文件夹。
- 资产/Bidmad
- 资产/HIVEAdKit
- 资产/HIVEAdKit_示例