码迷,mamicode.com
首页 > 其他好文 > 详细

游戏开发者:广告最佳做法

时间:2015-04-10 15:43:09      阅读:420      评论:0      收藏:0      [点我收藏+]

标签:

游戏开发者:广告最佳做法

  1. 简介
  2. 前提条件
  3. 实用的入门信息
  4. OpenGL 游戏 - 横幅广告
    1. iOS
    2. Android
  5. Unity
    1. 要求
    2. 将插件导入到游戏中
    3. Unity 插件 API
    4. AdMob 中介支持
    5. DFP 广告管理系统支持
  6. Cocos2d-x
    1. 要求
    2. 将 AnySDK 导入到游戏中
    3. AnySDK Ads System API
    4. 使用 AnySDK 程序包工具
    5. AdMob 中介支持
    6. DFP 广告管理系统支持
  7. 常见问题解答

简介

本指南介绍使用 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 来集成广告,我们建议您仅在游戏暂停或结束时,或者在用户未主动玩游戏的屏幕上展示横幅广告。这样做的优势在于:

  1. 更好的用户体验 - 用户不希望在玩游戏的过程中被广告干扰
  2. 效果 - 广告可能会影响游戏的帧速率
  3. 防止出现意外点击

以下示例说明如何使用最少的代码添加横幅广告。在适当的时间加载横幅广告则是您的责任。

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

将插件导入到游戏中

  1. 在 Unity 编辑器中打开您的项目。选择“Assets”(资源)>“Import Package”(导入程序包)>“Custom Package”(自定义程序包)并找到您下载的 GoogleMobileAdsPlugin.unitypackage 文件。

    技术分享

  2. 确保选择所有文件,然后点击 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
  1. 此插件要求项目中包含 Google Play 服务库。将整个<android_sdk>/extras/google/google_play_services/libproject/google-play-services_lib/ 文件夹添加到 Unity 项目的 Assets/Plugins/Android 文件夹中。

  2. 转到“File”(文件)>“Build Settings”(构建设置),选择 Android 平台,然后选择 Build and Run(构建并运行)

    技术分享

您已为 Android 导入了该插件!

iOS
  1. 转到“File”(文件)>“Build Settings”(构建设置),依次选择 iOS 平台和 Build(构建)。这将会导出 Xcode 项目。

  2. 打开导出的 Xcode 项目,并按照 iOS 快速入门指南中的手动导入部分来添加 Google 移动广告 SDK。

  3. 在 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,则可以向 showAdshideAds 和 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

  1. 在 AnySDK 应用配置的 SDK Management(SDK 管理)部分,指定 AdMob 作为广告提供商,并选择您的应用支持哪些格式。

    技术分享

  2. 在 Parameter Config(参数配置)部分,为横幅广告和/或插页式广告输入 Android 广告单元 ID,还请输入广告尺寸和展示位置(如果您使用的是横幅广告)。

    技术分享

    如果您的应用设置为使用多个横幅广告(参见使用多个横幅广告或插页式广告部分),请点击 + 标签为每个横幅广告配置广告单元。另请针对插页式广告执行相同操作。

  3. 最后,在 Publishing(发布)标签中,选择 Browse(浏览)并找到应用的 .apk 文件。然后点击 Start(开始)

    技术分享

就这么简单!此步骤会生成一个包含 AdMob 的项目版本!

iOS

  1. 在 AnySDK 应用配置的 SDK Management(SDK 管理)部分,指定 iOS-AdMob 作为广告提供商,并选择您的应用支持哪些格式。

    技术分享

  2. 在 Parameter Config(参数配置)部分,为横幅广告和/或插页式广告输入 iOS 广告单元 ID,还请输入广告尺寸和展示位置(如果您使用的是横幅广告)。

    技术分享

    如果您的应用设置为使用多个横幅广告(参见使用多个横幅广告或插页式广告部分),请点击 + 标签为每个横幅广告配置广告单元。另请针对插页式广告执行相同操作。

  3. 在 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 程序包工具使用和错误报告方面的帮助。

游戏开发者:广告最佳做法

标签:

原文地址:http://blog.csdn.net/wangxfvc/article/details/44978359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!