在 Unity 中使用 Google Play 结算库

Google Play 结算插件扩展了 Unity 内置的应用内购买服务和资源(称为 Unity IAP),为您的游戏提供 Google Play 结算库的最新功能。本指南介绍如何设置您的项目以使用该插件。本指南还介绍如何在 Unity 游戏中实现 Google Play 结算库的功能。

设置 Google Play 结算插件

要设置插件,请完成这些链接部分中的每个步骤

  1. 启用 Unity IAP 抽象层.
  2. 下载并导入插件.
  3. 配置插件的构建设置.
  4. 启用插件.

启用 Unity IAP 抽象层

Google Play 结算插件构建在 Unity IAP 中包含的抽象层之上,因此您需要在下载和导入插件之前启用此抽象层。要启用 Unity IAP 抽象层,请执行以下操作

  1. 完成以下 Unity 教程中的所有步骤:为 Unity 服务设置您的项目
  2. 完成以下 Unity 教程中的所有步骤:启用 Unity IAP 服务

下载并导入插件

该插件以 Unity 包的形式发布,格式为 .unitypackage。要下载并导入插件,请按照以下步骤操作

  1. 从资源库的 GitHub 上的发布页面 下载 Unity 的 Google Play 插件的最新版本。
  2. 在 Unity 菜单栏中,点击**资源 > 导入包 > 自定义包**。

  3. 找到下载 .unitypackage 文件的位置并选择它。

  4. 在**导入 Unity 包**对话框中,保留所有选定的资源,然后点击**导入**。

导入包后,一个名为**GooglePlayPlugins**(位于 Assets 文件夹的根目录下)的新文件夹将添加到项目的资源中。此文件夹包含插件的所有 Google Play 结算库资源。

配置构建设置

由于该插件扩展了 Unity IAP,因此除非从构建中删除 Unity IAP 中一些较旧的、重叠的依赖项,否则 Unity 将遇到冲突并无法构建 Android APK。该插件提供了一种自动的方法来从您的项目中删除冲突的库。要解决这些冲突,请按照以下步骤操作

  1. 在 Unity 菜单栏中,选择**Google > Play 结算 > 构建设置**。

  2. 在 Play 结算构建设置窗口中,点击**修复**。这将解决冲突并将冲突的 Unity IAP 文件移动到备份目录。点击**修复**后,按钮将变为**还原**,您可以点击它来还原原始的冲突文件。

启用插件

要启用插件,请将 Unity IAP 对 Google Play 的实现替换为 Google Play 结算插件。例如,当使用 Unity IAP 购买者脚本 时,您将更改传递到 IAP 生成器的 StandardPurchaseModule 以使用 Google.Play.Billing.GooglePlayStoreModule

// Create a builder using the GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());

如果您的游戏对多个平台使用相同的购买者脚本,则应添加平台检查,以确保 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 块中。

有关如何使用比例模式的更多信息和示例,请参阅设置比例模式