游戏开发者:广告最佳做法
简介
本指南介绍使用 Google 移动广告 SDK 将横幅广告和插页式广告与游戏进行集成的最佳做法,具体内容涉及与 Unity 和 Cocos2d-x 游戏引擎的集成,以及常规的基于 OpenGL 的 Android 和 iOS 游戏。
前提条件
- 下载适用于
Android 或 iOS 的 Google 移动广告 SDK
实用的入门信息
如果您使用采用 Android 或 iOS 代码的 OpenGL 来集成 Google 移动广告,快速入门指南 (Android | iOS)
和插页式广告指南 (Android |iOS)
是很好的入门信息,可帮助您了解如何使用 SDK。
OpenGL 游戏 - 横幅广告
如果您使用基于 OpenGL 的游戏引擎,但使用原生的 Android 和 iOS SDK 来集成广告,我们建议您仅在游戏暂停或结束时,或者在用户未主动玩游戏的屏幕上展示横幅广告。这样做的优势在于:
- 更好的用户体验 - 用户不希望在玩游戏的过程中被广告干扰
- 效果 - 广告可能会影响游戏的帧速率
- 防止出现意外点击
以下示例说明如何使用最少的代码添加横幅广告。在适当的时间加载横幅广告则是您的责任。
iOS
此示例基于 SpriteKit,但适用于所有框架。当为 SpriteKit 游戏创建新的 Xcode 项目时,您的 GameViewController 的 viewDidLoad
方法的样板代码如下所示:
- (void)viewDidLoad {
[super viewDidLoad];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;
// Create and configure the scene.
GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
将 SDK 添加到项目后,请更新 viewDidLoad
方法以加入一个横幅广告。在此示例中,我们使用了智能横幅广告格式并在屏幕左上方将其初始化:
- (void)viewDidLoad { [super viewDidLoad]; // Create a banner ad and add it to the view hierarchy. self.bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait]; self.bannerView.hidden = YES; self.bannerView.adUnitID = @"ca-app-pub-3940256099942544/2934735716"; self.bannerView.rootViewController = self; [self.view addSubview:self.bannerView]; // Configure the view. SKView *skView = (SKView *)self.view; skView.showsFPS = YES; skView.showsNodeCount = YES; /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = YES; // Create and configure the scene. GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; }
要解决编译错误,请在文件上部导入 GADBannerView
并添加 bannerView
属性。
#import "GADBannerView.h"
@interface GameViewController()
@property(nonatomic, strong) GADBannerView *bannerView;
@end
您的应用现在已经可以展示横幅广告了。剩下的一个步骤是显示广告和发送广告请求。这可以采用名为 showBanner
的辅助方法来完成:
- (void)showBanner {
self.bannerView.hidden = NO;
GADRequest *request = [GADRequest request];
request.testDevices = @[ GAD_SIMULATOR_ID ];
[self.bannerView loadRequest:request];
}
调用 showBanner
之后,您的游戏将显示一个横幅广告。
您希望在用户玩游戏期间将广告隐藏起来,这可以通过调用 hideBanner
方法来完成:
- (void)hideBanner {
self.bannerView.hidden = YES;
}
游戏结束时,请再次调用 showBanner
方法以刷新并显示广告。
Android
大部分基于 OpenGL 的 Android 游戏都使用 SurfaceView 的形式。您的主活动如下所示:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SurfaceView gameView = new SurfaceView(this);
setContentView(gameView);
}
}
以下示例使用 RelativeLayout 将智能横幅广告固定在屏幕底部。
public class MainActivity extends Activity {
private AdView adView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SurfaceView gameView = new SurfaceView(this);
// Create and load the AdView.
adView = new AdView(this);
adView.setAdUnitId("ca-app-pub-3940256099942544/6300978111");
adView.setAdSize(AdSize.SMART_BANNER);
// Create a RelativeLayout as the main layout and add the gameView.
RelativeLayout mainLayout = new RelativeLayout(this);
mainLayout.addView(gameView);
// Add adView to the bottom of the screen.
RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
mainLayout.addView(adView, adParams);
// Set the RelativeLayout as the main layout.
setContentView(mainLayout);
}
}
您的应用现在已经可以展示横幅广告了。剩下的一个步骤是显示广告和发送广告请求。这可以采用名为 showBanner
的辅助方法来完成:
private void showBanner() {
adView.setVisibility(View.VISIBLE);
adView.loadAd(new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR).build());
}
调用 showBanner
之后,您的游戏将显示一个横幅广告。
您希望在用户玩游戏期间将广告隐藏起来,这可以通过调用 hideBanner
方法来完成:
private void hideBanner() {
adView.setVisibility(View.GONE);
}
游戏结束时,请再次调用 showBanner
方法以刷新并显示广告。
Unity
如果您使用 Unity 游戏引擎,则可以使用官方支持的插件在
Unity 开发环境中编写脚本,以将横幅广告和插页式广告投放到 Android 游戏和 iOS 游戏中。
要求
- Unity 4 或更高版本
- Google 移动广告 SDK
将插件导入到游戏中
- 在 Unity 编辑器中打开您的项目。选择“Assets”(资源)>“Import Package”(导入程序包)>“Custom Package”(自定义程序包)并找到您下载的
GoogleMobileAdsPlugin.unitypackage
文件。 - 确保选择所有文件,然后点击 Import(导入)。
我已经拥有 AndroidManifest.xml 文件
如果您的项目已经有 Assets/Plugins/Android/AndroidManifest.xml
文件,您可以选择不从GoogleMobileAds.unitypackage
导入此文件,但您需要先更新该清单文件,以将unityplayer.ForwardNativeEventsToDalvik
元数据标记添加到 Unity 主活动中(以下突出显示的内容):
<activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" /> </activity>
在 Unity 主活动中,将 unityplayer.ForwardNativeEventsToDalvik
标记设置为 true
可确保广告是可以点击的。
您还需要按照快速入门指南中的介绍对清单文件做出更改。
运行您的项目
根据您的平台完成以下相应步骤,将 Android 和 iOS 版本的 Google 移动广告 SDK 导入到项目中。完成这些步骤后,请参阅 Unity
插件 API 部分,详细了解如何使用插件请求横幅广告和插页式广告。
Android
- 此插件要求项目中包含 Google Play 服务库。将整个
<android_sdk>/extras/google/google_play_services/libproject/google-play-services_lib/
文件夹添加到 Unity 项目的Assets/Plugins/Android
文件夹中。 - 转到“File”(文件)>“Build Settings”(构建设置),选择 Android 平台,然后选择 Build and Run(构建并运行)。
您已为 Android 导入了该插件!
iOS
- 转到“File”(文件)>“Build Settings”(构建设置),依次选择 iOS 平台和 Build(构建)。这将会导出 Xcode 项目。
- 打开导出的 Xcode 项目,并按照 iOS 快速入门指南中的手动导入部分来添加
Google 移动广告 SDK。 - 在 Xcode 中,转到“Product”(产品)>“Run”(运行)以运行您的项目。
现在您已为 iOS 成功导入该插件!
Unity 插件 API
您可以在 Google 移动广告插件中使用常用的 C# API 来请求横幅广告和插页式广告。这段代码只需编写一次即可,然后可以分别部署到 Android 设备和 iOS 设备中。
基本的横幅广告请求
以下是创建和加载横幅广告所需的最少代码。
using GoogleMobileAds.Api;
…
private void RequestBanner()
{
#if UNITY_ANDROID
string adUnitId = "INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE";
#elif UNITY_IPHONE
string adUnitId = "INSERT_IOS_BANNER_AD_UNIT_ID_HERE";
#else
string adUnitId = "unexpected_platform";
#endif
// Create a 320x50 banner at the top of the screen.
BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the banner with the request.
bannerView.LoadAd(request);
}
AdPosition
枚举会指定横幅广告的展示位置。
请注意,不同广告单元的使用方式要取决于具体的平台。具体来说,在使用 AdMob 时,您需要使用 iOS 广告单元在 iOS 设备上发送广告请求,使用 Android 广告单元在 Android 设备上发送广告请求。
基本的插页式广告请求
以下是加载插页式广告所需的最少代码。
using GoogleMobileAds.Api;
…
private void RequestInterstitial()
{
#if UNITY_ANDROID
string adUnitId = "INSERT_ANDROID_INTERSTITIAL_AD_UNIT_ID_HERE";
#elif UNITY_IPHONE
string adUnitId = "INSERT_IOS_INTERSTITIAL_AD_UNIT_ID_HERE";
#else
string adUnitId = "unexpected_platform";
#endif
// Initialize an InterstitialAd.
InterstitialAd interstitial = new InterstitialAd(adUnitId);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the interstitial with the request.
interstitial.LoadAd(request);
}
与横幅广告不同,插页式广告需要显式展示。请在游戏的适当停止点(例如当前关卡结束时)检查插页式广告是否已准备好进行展示。展示插页式广告的一个好时机是在游戏结束时:
private void GameOver()
{
if (interstitial.IsLoaded()) {
interstitial.Show();
}
}
自定义广告尺寸
您可以为广告指定一个自定义的尺寸而不使用 AdSize
常量。
AdSize adSize = new AdSize(250, 250);
BannerView bannerView = new BannerView(adUnitId, adSize, AdPosition.Bottom);
测试广告
我们建议您在开发过程中请求测试广告,以免产生不当的广告展示。要请求测试广告,请在构建广告请求时将加密的设备 ID 添加到AddTestDevice
方法。无论是 Android 还是 iOS,当您的应用运行并发送有效请求时,此 ID 只能在日志中找到。
以下说明了如何在构建广告请求时加入测试设备。
AdRequest request = new AdRequest.Builder()
.AddTestDevice(AdRequest.TestDeviceSimulator) // Simulator.
.AddTestDevice("2077ef9a63d2b398840261c8221a0c9b") // My test iPod Touch 5.
.Build();
广告请求定位
要向广告请求提供额外的定位信息,请在构建请求时设置这些定位参数。此广告请求示例显示了可以使用哪些定位方法。
AdRequest request = new AdRequest.Builder()
.SetGender(Gender.Male)
.SetBirthday(new DateTime(1985, 1, 1))
.TagForChildDirectedTreatment(true)
.AddExtra("excl_cat", "cars,sports") // Category exclusions for DFP.
.Build();
广告事件
BannerView
和 InterstitialAd
都包含您可以注册的相同广告事件。这些事件是 EventHandler
类型。以下示例说明如何在横幅广告上设置广告事件:
private void RequestBanner()
{
BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
// Called when an ad request has successfully loaded.
bannerView.AdLoaded += HandleAdLoaded;
// Called when an ad request failed to load.
bannerView.AdFailedToLoad += HandleAdFailedToLoad;
// Called when an ad is clicked.
bannerView.AdOpened += HandleAdOpened;
// Called when the user is about to return to the app after an ad click.
bannerView.AdClosing += HandleAdClosing;
// Called when the user returned from the app after an ad click.
bannerView.AdClosed += HandleAdClosed;
// Called when the ad click caused the user to leave the application.
bannerView.AdLeftApplication += HandleAdLeftApplication;
}
public void HandleAdLoaded(object sender, EventArgs args)
{
print("HandleAdLoaded event received.");
// Handle the ad loaded event.
}
AdFailedToLoad
事件包含特殊的事件参数。该事件会传递一个 AdFailedToLoadEventArgs
实例,此实例具有一个说明错误内容的 Message
。
public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
print("Interstitial Failed to load: " + args.Message);
// Handle the ad failed to load event.
};
您只需注册自己感兴趣的事件。
显示和隐藏横幅广告
默认情况下,横幅广告是可见的。要暂时隐藏横幅广告,请调用:
bannerView.Hide();
要重新显示该广告,请调用:
bannerView.Show();
清除横幅广告和插页式广告
当完成 BannerView
或 InterstitialAd
后,请在放弃对其的引用之前调用 Destroy()
方法。
bannerView.Destroy();
interstitial.Destroy();
这会通知插件应该将此对象作为垃圾进行收集。不调用此方法将导致内存泄漏。
AdMob 中介支持
要使用 Unity 插件执行中介功能,您必须按照中介快速入门指南 (Android | iOS)
中的介绍,为每个第三方广告网络下载并添加 SDK 和适配器库。以下是针对不同设备的不同操作:
- 对于 Android,将所需的库添加到项目的
Assets/Plugins/Android
目录中。 - 对于 iOS,将所需的库添加到 Xcode 项目中,该项目是您为 iOS 构建项目时由 Unity 生成的。
DFP 广告管理系统支持
正如 Unity
Plugin API 中所述,Unity 插件支持 DFP 广告单元、自定义广告尺寸和自定义定位。
该插件当前不支持更高级的 DFP 功能,如多个广告尺寸、应用事件和手动展示次数计数。
Cocos2d-x
如果您使用任何的 Cocos2d-x 游戏引擎,则可以集成 AnySDK 框架并构造您的应用以便使用广告系统,从而通过
Android 和 iOS 应用获利。
本指南介绍针对 Cocos2d-x 应用的 AnySDK 集成,但这些概念也适用于整个 Cocos2d-x 引擎套件。
要求
- Cocos2d-x 的最新版本
- AnySDK 框架 v1.2.3
或更高版本 - AnySDK 程序包工具
将 AnySDK 导入到游戏中
AnySDK 快速入门指南详细介绍了如何在
C++ 和 Android 级别导入 AnySDK,请查看该指南以了解相关信息。
AnySDK Ads System API
成功导入 AnySDK 后,您可以参阅广告系统指南,编写针对
AnySDK 广告系统的代码。
AdMob 支持 AD_TYPE_BANNER
和 AD_TYPE_FULLSCREEN
格式。我们将介绍一些集成 AdMob 的常用方法。
横幅广告
要请求和展示横幅广告,请使用 AD_TYPE_BANNER
广告类型的 showAds
方法。
AdsPlugin* ads = AgentManager::getInstance()->getAdsPlugin();
ads->showAds(AD_TYPE_BANNER);
要停止展示横幅广告,请使用 hideAds
方法。
ads->hideAds(AD_TYPE_BANNER);
插页式广告
在您显式展示插页式广告之前,应该使用 AD_TYPE_FULLSCREEN
广告类型的 preloadAds
方法预加载相应的广告。
AdsPlugin* ads = AgentManager::getInstance()->getAdsPlugin();
ads->preloadAds(AD_TYPE_FULLSCREEN);
当您稍后要展示插页式广告时,请调用 showAds
。
ads->showAds(AD_TYPE_FULLSCREEN);
使用多个横幅广告或插页式广告
如果您需要使用多个横幅广告尺寸或不同的广告单元 ID,则可以向 showAds
、hideAds
和 preloadAds
方法传递一个索引。以下是一些示例:
ads->showAds(AD_TYPE_BANNER, 2); // show banner #2
ads->hideAds(AD_TYPE_BANNER, 2); // hide banner #2
ads->showAds(AD_TYPE_FULLSCREEN, 2); // preload interstitial #2
ads->preloadAds(AD_TYPE_FULLSCREEN, 2); // show interstitial #2
如果不指定索引,则默认为 1
。
当您稍后使用 AnySDK 程序包工具配置 AdMob 时,可以设置每个横幅广告的广告单元 ID、广告尺寸以及展示位置,还可以设置每个插页式广告的广告单元 ID。
注意:假设您的游戏有 4 个横幅广告展示位置和 2 个插页式广告展示位置。您应该将横幅广告从 1
到 4
进行编号,将插页式广告从1
到 2
进行编号。AnySDK
程序包工具希望您使用这种编号方案。
监听广告事件
如果需要获得广告事件的通知(例如成功接收到广告),请指定实现 AdsListener
的类。它只提供一个方法(即 onAdsResult
),该方法会通知您所有事件。
AdMob 支持以下广告事件:
kAdsReceived
kAdsShown
kAdsDismissed
kNetworkError
kUnknownError
onAdsResult
方法的典型实现框架如下所示:
void onAdsResult(AdsResultCode code, const char* msg) {
switch(code) {
case kAdsReceived:
// Ad has been received.
break;
case kAdsShown:
// Ad is presenting a full screen view.
break;
case kAdsDismissed:
// A full screen ad view is being dismissed.
break;
case kNetworkError:
// Ad failed due to network error.
break;
case kUnknownError:
// Ad failed.
break;
default:
break;
}
}
在这里,您可以决定针对各个事件采取的措施。
最后,请注意设置广告插件的广告监听器,以便告知 AnySDK 哪些类应该接收广告事件:
AgentManager::getInstance()->getAdsPlugin()->setAdsListener(this);
使用 AnySDK 程序包工具
将您的应用配置为使用 AnySDK 广告系统后,请使用 AnySDK
程序包工具启用 AdMob 以填充您的广告空间。您必须分别针对 Android 和 iOS 配置 AnySDK,针对这两个平台的配置过程如下所述:
Android
- 在 AnySDK 应用配置的 SDK Management(SDK 管理)部分,指定 AdMob 作为广告提供商,并选择您的应用支持哪些格式。
- 在 Parameter Config(参数配置)部分,为横幅广告和/或插页式广告输入 Android 广告单元 ID,还请输入广告尺寸和展示位置(如果您使用的是横幅广告)。
如果您的应用设置为使用多个横幅广告(参见使用多个横幅广告或插页式广告部分),请点击 + 标签为每个横幅广告配置广告单元。另请针对插页式广告执行相同操作。
- 最后,在 Publishing(发布)标签中,选择 Browse(浏览)并找到应用的
.apk
文件。然后点击 Start(开始)。
就这么简单!此步骤会生成一个包含 AdMob 的项目版本!
iOS
- 在 AnySDK 应用配置的 SDK Management(SDK 管理)部分,指定 iOS-AdMob 作为广告提供商,并选择您的应用支持哪些格式。
- 在 Parameter Config(参数配置)部分,为横幅广告和/或插页式广告输入 iOS 广告单元 ID,还请输入广告尺寸和展示位置(如果您使用的是横幅广告)。
如果您的应用设置为使用多个横幅广告(参见使用多个横幅广告或插页式广告部分),请点击 + 标签为每个横幅广告配置广告单元。另请针对插页式广告执行相同操作。
- 在 Publishing(发布)标签中,依次选择 Browse(浏览)以及您的 Cocos2d-x 项目的最高级目录。
当系统询问您要使用哪个
.xcodeproj
时,选择proj.ios_mac/
目录下的项目,并点击 OK(确定)。然后点击 Start(开始)。就这么简单!此步骤会生成一个包含 AdMob 的项目版本!
AdMob 中介支持
要使用 AnySDK 框架执行中介功能,您必须按照中介快速入门指南 (Android | iOS)
中的介绍,为每个第三方广告网络下载并添加 SDK 和适配器库。以下是针对不同设备的不同操作:
- 对于 Android,在使用 AnySDK 程序包工具前,将所需的库添加到项目的
libs/
文件夹中。 - 对于 iOS,在使用 AnySDK 程序包工具之前,将所需的库添加到 Xcode 项目中。
DFP 广告管理系统支持
AnySDK 接受 DFP 广告单元,但您只能使用 AnySDK 提供的广告尺寸常量。自定义广告尺寸和自定义定位不受支持。
常见问题解答
- 我使用的游戏引擎是本指南中未提到的引擎。我该如何集成 Google 移动广告?
- 请参阅横幅广告最佳做法,该指南适用于在任何游戏中实现广告。
- 从哪里可以获得有关 Unity 的帮助?
-
有关 Google 移动广告 Unity 插件的疑问,请参阅 Google 移动广告 SDK 开发者论坛。要报告错误,请将问题添加到
GitHub 上的问题跟踪页面。对于常见的
Unity 问题,请咨询 Unity 社区。 - 从哪里可以获得有关 Cocos2d-x 的帮助?
-
请使用 AnySDK 联系表单获取有关
AnySDK 框架集成、AnySDK 程序包工具使用和错误报告方面的帮助。
本页面中的内容已获得知识共享署名3.0许可,并且代码示例已获得Apache
2.0许可;另有说明的情况除外。有关详情,请参阅我们的网站政策。