Google Play 结算插件扩展了 Unity 内置的应用内购买服务和资产(称为 Unity IAP),为您的游戏提供 Google Play 结算库的最新功能。本指南介绍如何设置您的项目以使用该插件。本指南还描述了如何在 Unity 中的游戏中实现 Google Play 结算库功能。
设置 Google Play 结算插件
要设置插件,请完成这些链接部分中的每个步骤
启用 Unity IAP 抽象层
Google Play 结算插件构建在 Unity IAP 中包含的抽象层之上,因此在下载并导入插件之前,您需要启用此抽象层。要启用 Unity IAP 抽象层,请执行以下操作
- 完成以下 Unity 教程中的所有步骤:为 Unity 服务设置您的项目。
- 完成以下 Unity 教程中的所有步骤:启用 Unity IAP 服务。
下载并导入插件
该插件以 Unity 包的形式提供,格式为 .unitypackage
。要下载并导入插件,请按照以下步骤操作
- 从存储库的 GitHub 上的发布页面下载 Unity Google Play 插件的最新版本。
从 Unity 菜单栏中,单击 **Assets > Import Package > Custom Package**。
找到您下载
.unitypackage
文件的位置并选择它。在 **Import Unity Package** 对话框中,保留所有选定的资产,然后单击 **Import**。
导入包后,一个名为 **GooglePlayPlugins** 的新文件夹(位于 Assets 文件夹的根目录)将添加到您的项目的资产中。此文件夹包含插件的所有 Google Play 结算库资产。
配置构建设置
由于该插件扩展了 Unity IAP,因此除非从构建中删除 Unity IAP 中一些旧的、重叠的依赖项,否则 Unity 会遇到冲突并无法构建 Android APK。该插件提供了一种自动方法来从您的项目中删除冲突的库。要解决这些冲突,请按照以下步骤操作
从 Unity 菜单栏中,选择 **Google > Play Billing > Build Settings**。
在 Play Billing Build Settings 窗口中,单击 **Fix**。这将解决冲突并将冲突的 Unity IAP 文件移动到备份目录。单击 **Fix** 后,按钮将更改为 **Restore**,您可以单击该按钮以恢复原始的冲突文件。
启用插件
要启用插件,请使用 Google Play 结算插件替换 Unity IAP 对 Google Play 的实现。例如,当使用 Unity IAP Purchaser 脚本 时,您将更改传递给 IAP 构建器的 StandardPurchaseModule
以使用 Google.Play.Billing.GooglePlayStoreModule
// Create a builder using the GooglePlayStoreModule.
var configurationBuilder =
ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());
如果您的游戏对多个平台使用相同的 Purchaser 脚本,则您应该添加平台检查以确保 Unity 将继续对其他平台使用其自己的 IAP 解决方案
ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android)
{
builder = ConfigurationBuilder.Instance(
Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}
如果您在 Google Play 商店之外的其他 Android 应用商店发布您的游戏,则只有在选择 Google Play 商店时,您才应替换默认的 Unity IAP 实现
ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android
&& SelectedAndoidAppStore == AppStore.GooglePlay)
{
builder = ConfigurationBuilder.Instance(
Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}
在您的游戏中实现 Google Play 结算库功能
Google Play 结算插件扩展了 Unity IAP 服务,因此您可以使用相同的 Unity API 来管理常见的购买工作流程。请注意,由于 Google Play 结算库与 Unity 为其他应用商店提供的标准 IAP 实现之间存在一些差异,因此 API 行为存在一些细微变化。如果您不熟悉 Unity IAP API,请参阅 Unity IAP 教程 中的“创建购买脚本”部分,了解如何实现基本购买流程的示例。
Google Play 结算库还包含一些 Google Play 商店独有的功能。您可以通过扩展接口访问这些功能。本节的其余部分介绍了如何在游戏中实现这些独特的 Google Play 结算库功能。
启用延迟购买
Google Play 支持延迟购买(也称为 待处理交易 或待处理购买),用户可以在其中创建购买并在稍后使用商店中的现金完成购买。
要启用延迟购买,请使用您的 IAP 构建器通过调用 EnableDeferredPurchase()
方法修改模块的配置
// Create a builder using a GooglePlayStoreModule.
var configurationBuilder =
ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());
// Enable deferred purchases
configurationBuilder.Configure<Google.Play.Billing.IGooglePlayConfiguration>()
.EnableDeferredPurchase();
接下来,使用 Play 商店扩展实现延迟购买回调
// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();
// Set the deferred purchases callback.
_playStoreExtensions.SetDeferredPurchaseListener(
delegate(Product product)
{
// Do not grant the item here. Instead, record the purchase and remind
// the user to complete the transaction in the Play Store.
});
将混淆的帐户 ID 传递给 Google Play
您可以将混淆的用户帐户 ID 传递给 Google Play 以方便滥用检测,例如检测许多设备是否在短时间内使用同一帐户进行购买。
要传递混淆的帐户 ID,请从扩展 API 调用 SetObfuscatedAccountId()
方法
// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();
// Pass an obfuscated account ID.
_playStoreExtensions.SetObfuscatedAccountId(obfuscatedAccountId);
将混淆的个人资料 ID 传递给 Google Play
您可以将模糊处理后的用户资料 ID 传递给 Google Play,以方便欺诈检测,例如检测在短时间内多个设备是否在同一帐户上进行购买。这类似于传递模糊处理后的用户帐户 ID。在这两种情况下,ID 都代表单个用户,但用户资料 ID 允许您在一个应用中跨用户拥有的多个用户资料唯一识别单个用户。将模糊处理后的用户资料 ID 发送到 Google Play 后,您可以在之后的购买收据中检索该 ID。
要传递模糊处理后的用户资料 ID,请使用您的 IAP 构建器通过调用 SetObfuscatedProfileId()
方法修改模块的配置。
// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();
// Pass an obfuscated profile ID.
_playStoreExtensions.SetObfuscatedProfileId(obfuscatedProfileId);
确认订阅价格变更
Google Play 允许您更改活动订阅的价格。您的游戏用户必须在价格变更生效前确认任何价格变更。要提示用户确认其订阅的价格变更,请调用 ConfirmSubscriptionPriceChange()
方法。
// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();
_playStoreExtensions.ConfirmSubscriptionPriceChange(productId,
delegate (bool success)
{
// Returns whether the user has accepted the new price or not.
});
Unity API 行为变更
当您使用 Google Play 结算插件时,大多数 API 的行为与 Unity 为其他应用商店提供的标准 IAP 实现相同。但是,在某些情况下,API 的行为会有所不同。本节介绍这些行为差异。
开发者负载不受支持
Google Play 已弃用开发者负载,并将其替换为更有意义且更具上下文意义的替代方案。因此,开发者负载不受支持。有关替代方案的更多信息,请参阅有关开发者负载的页面。
您可以继续使用 Unity 为其他应用商店定义的标准 IAP 实现中定义的相同接口,包括 IStoreController
。当您发起购买时,您仍然可以使用 IStoreController
并调用 InitiatePurchase()
方法。
public void InitiatePurchase(Purchasing.Product product, string payload);
但是,您传入的任何负载都不会生效(不会出现在最终收据中)。
SubscriptionManager 不受支持
Unity IAP 提供了SubscriptionManager
类用于管理订阅。由于此类的 Unity 标准 IAP 实现使用了开发者负载,因此此类不受支持。您仍然可以创建此类,但在使用任何类的 getter 方法时可能会收到不可靠的数据。
UpdateSubscription API 有少量变更
Google Play 结算插件不支持使用 SubscriptionManager.UpdateSubscription()
和 SubscriptionManager.UpdateSubscriptionInGooglePlayStore()
方法来升级和降级您的订阅。如果您的游戏调用这些方法,则会抛出 GooglePlayStoreUnsupportedException
异常。
Google Play 结算库提供了替代 API 来代替这些方法。要升级或降级订阅,请使用按比例分配模式调用 UpdateSubscription()
方法。
void UpdateSubscription(Product oldProduct, Product newProduct,
GooglePlayStoreProrationMode prorationMode = GooglePlayStoreProrationMode.Unknown);
您可以在捕获到 GooglePlayStoreUnsupportedException
异常时,使用平台检查将其包装到方法调用中或将其包装到 catch 块中。
有关如何使用按比例分配模式的更多信息和示例,请参阅设置按比例分配模式。