插页式广告属于全屏广告,会覆盖宿主应用的整个界面,通常展示在应用流程的自然过渡点,例如,游戏关卡之间的暂停时段。当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。案例研究。
本指南介绍了如何将插页式广告植入到 Unity 应用中。
前提条件
- 完成入门指南。
制作插页式广告
要展示插页式广告,首先要在附加到 GameObject
的脚本中创建 InterstitialAd
对象。
using GoogleMobileAds.Api;
...
private InterstitialAd interstitial;
private void RequestInterstitial()
{
#if UNITY_ANDROID
string adUnitId = "ca-app-pub-3940256099942544/1033173712";
#elif UNITY_IPHONE
string adUnitId = "ca-app-pub-3940256099942544/4411468910";
#else
string adUnitId = "unexpected_platform";
#endif
// Initialize an InterstitialAd.
this.interstitial = new InterstitialAd(adUnitId);
}
InterstitialAd
的构造函数包含以下参数:
adUnitId
- AdMob 广告单元 ID,InterstitialAd
应通过该 ID 加载广告。
请务必注意,您需要根据平台选择使用不同的广告单元。在 iOS 设备上发出广告请求时,您需要使用 iOS 广告单元,而在 Android 设备上发出请求时,您需要使用 Android 广告单元。
务必用测试广告进行测试
上述示例代码包含一个广告单元 ID,您可以随意使用该 ID 请求广告。该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告(而不是实际投放的广告),从而能够安全地使用。
但是,如果您在 AdMob 界面中注册了应用,并创建了您自己的广告单元 ID 以便在该应用中使用,那么您需要在开发期间明确地将您的设备配置为测试设备。这一点非常重要。使用真正的广告进行测试(即使您从未点按它们)会违反 AdMob 政策,可能会导致您的账号被中止。请参阅测试广告,了解如何确保在开发期间始终获得测试广告。
加载广告
实例化 InterstitialAd
之后,下一步是加载广告。此步骤可使用 InterstitialAd
类中的 loadAd()
方法完成。这需要 AdRequest
参数,该参数包含有关单个广告请求的运行时信息(如定位信息)。
以下示例展示了如何加载广告:
using GoogleMobileAds.Api; ... private InterstitialAd interstitial; private void RequestInterstitial() { #if UNITY_ANDROID string adUnitId = "ca-app-pub-3940256099942544/1033173712"; #elif UNITY_IPHONE string adUnitId = "ca-app-pub-3940256099942544/4411468910"; #else string adUnitId = "unexpected_platform"; #endif // Initialize an InterstitialAd. this.interstitial = new InterstitialAd(adUnitId); // Create an empty ad request. AdRequest request = new AdRequest.Builder().Build(); // Load the interstitial with the request. this.interstitial.LoadAd(request); }
展示广告
插页式广告应在应用流程的自然停顿期间进行展示,例如游戏的不同关卡之间或用户完成一项任务之后,都是非常不错的展示时机。如需展示插页式广告,请使用 isLoaded()
方法验证广告是否已完成加载,然后调用 show()
。
上一个代码示例中的插页式广告可以在游戏结束时展示,如下所示。
private void GameOver()
{
if (this.interstitial.IsLoaded()) {
this.interstitial.Show();
}
}
广告事件
若要进一步自定义您广告的行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以为相应的 EventHandler
注册代理来监听这些事件,如下所示。
using GoogleMobileAds.Api; ... private InterstitialAd interstitial; private void RequestInterstitial() { #if UNITY_ANDROID string adUnitId = "ca-app-pub-3940256099942544/1033173712"; #elif UNITY_IPHONE string adUnitId = "ca-app-pub-3940256099942544/4411468910"; #else string adUnitId = "unexpected_platform"; #endif // Initialize an InterstitialAd. this.interstitial = new InterstitialAd(adUnitId); // Called when an ad request has successfully loaded. this.interstitial.OnAdLoaded += HandleOnAdLoaded; // Called when an ad request failed to load. this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad; // Called when an ad is shown. this.interstitial.OnAdOpening += HandleOnAdOpening; // Called when the ad is closed. this.interstitial.OnAdClosed += HandleOnAdClosed; // Create an empty ad request. AdRequest request = new AdRequest.Builder().Build(); // Load the interstitial with the request. this.interstitial.LoadAd(request); } public void HandleOnAdLoaded(object sender, EventArgs args) { MonoBehaviour.print("HandleAdLoaded event received"); } public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) { MonoBehaviour.print("HandleFailedToReceiveAd event received with message: " + args.Message); } public void HandleOnAdOpening(object sender, EventArgs args) { MonoBehaviour.print("HandleAdOpening event received"); } public void HandleOnAdClosed(object sender, EventArgs args) { MonoBehaviour.print("HandleAdClosed event received"); }
OnAdFailedToLoad
事件包含特殊的事件参数。该事件会传递一个 HandleAdFailedToLoadEventArgs
实例,其中包含的 Message
用于描述错误:
public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
print("Interstitial failed to load: " + args.Message);
// Handle the ad failed to load event.
}
广告事件 | 说明 |
---|---|
OnAdLoaded |
广告加载完成时,系统会执行 OnAdLoaded 事件。 |
OnAdFailedToLoad |
广告加载失败时,系统会调用 OnAdFailedToLoad 事件。Message 参数用于描述发生了何种类型的失败。 |
OnAdOpening |
在广告开始展示并铺满设备屏幕时,系统会调用此方法。 |
OnAdClosed |
在用户点按“关闭”图标或使用“返回”按钮关闭插页式广告时,系统会调用此方法。如果您的应用暂停了音频输出或游戏循环,则非常适合使用此方法恢复这些活动。 |
清理插页式广告
创建完 InterstitialAd
后,请确保在放弃对它的引用前调用 Destroy()
方法:
interstitial.Destroy();
这会通知插件已不再使用该对象,且可回收它占用的内存。此方法调用失败将导致内存泄露。
一些最佳做法
- 考虑插页式广告这种广告类型是否适合您的应用。
- 在具有自然过渡点的应用中,插页式广告的效果最好。此类过渡点通常存在于应用内的任务结束时,例如分享完图片或完成一个游戏关卡时。用户希望可以在操作过程中休息一下,因此这时展示插页式广告不会影响用户体验。请务必考虑在应用流程的哪些时间点展示插页式广告,以及用户可能会以什么方式响应。
- 请务必在展示插页式广告时暂停操作。
- 插页式广告类型多样,包括文字广告、图片广告和视频广告等。确保应用在展示插页式广告时,也会暂停使用某些资源,以便供广告使用,这一点十分重要。例如,当您发出展示插页式广告的调用后,请务必暂停应用产生的所有音频输出。您可以在
onAdClosed()
事件处理脚本中恢复声音播放,当用户结束与广告的互动时,就会调用以下处理脚本。此外,在广告展示时,请考虑暂时停止所有密集计算任务(例如游戏主循环)。这样可以确保用户不会遇到图像无响应、响应慢或视频卡顿的现象。 - 留出充足的加载时间。
- 确保在恰当的时间展示插页式广告十分重要,同样,确保用户无需等待广告加载也十分重要。在您打算调用
show()
前,不妨事先通过调用loadAd()
加载广告,这样可确保应用在广告展示时间到来时,已准备好加载完毕的插页式广告。 - 不要向用户展示太多广告。
- 虽然提高插页式广告在应用中的展示频次似乎是实现增收的好方法,但这么做也会影响用户体验并降低点击率。应确保用户不会频繁受到广告打扰,使他们可以充分享受到使用应用的乐趣。
其他资源
示例
- HelloWorld 示例 - 所有广告格式的极简实现方案