Unity 用ゲームで Google Play Billing Library を使用する

Google Play 請求サービス プラグインは、Unity に組み込まれているアプリ内購入用のサービスとアセット(Unity IAP)を拡張し、Google Play Billing Library のすべての最新機能をゲームに提供します。このガイドでは、プラグインを使用するようにプロジェクトをセットアップする方法について説明します。また、Unity 用ゲームに Google Play Billing Library の機能を実装する方法についても説明します。

Google Play 請求サービス プラグインをセットアップする

プラグインをセットアップする手順は次のとおりです。各ステップの詳細については、それぞれのリンク先をご覧ください。

  1. Unity IAP 抽象化レイヤを有効にします
  2. プラグインをダウンロードしてインポートします
  3. プラグインのビルドを設定します
  4. プラグインを有効にします

Unity IAP 抽象化レイヤを有効にする

Google Play 請求サービス プラグインは Unity IAP に含まれている抽象化レイヤ上に構築されるため、プラグインをダウンロードしてインポートする前にこの抽象化レイヤを有効にする必要があります。Unity IAP 抽象化レイヤを有効にする手順は次のとおりです。

  1. Unity のチュートリアルにある Unity Services のためのプロジェクトの設定手順をすべて完了します。
  2. Unity のチュートリアルにある Unity IAP の設定手順をすべて完了します。

プラグインをダウンロードしてインポートする

プラグインは .unitypackage 形式の Unity パッケージとしてリリースされています。プラグインをダウンロードしてインポートする手順は次のとおりです。

  1. Google Play Plugins for Unity の最新リリースを、GitHub のリポジトリ リリースページからダウンロードします。
  2. Unity のメニューバーで、[Assets] > [Import Package] > [Custom Package] をクリックします。

  3. .unitypackage ファイルをダウンロードした場所を探して、このファイルを選択します。

  4. [Import Unity Package] ダイアログで、すべてのアセットを選択したままにして [Import] をクリックします。

パッケージがインポートされると、GooglePlayPlugins という新しいフォルダ(Assets フォルダのルート上)がプロジェクトのアセットに追加されます。このフォルダには、プラグインの Google Play Billing Library アセットがすべて格納されています。

ビルド設定を構成する

プラグインによって Unity IAP が拡張されるため、Unity IAP 内の重複する古い依存関係の一部をビルドから削除しない限り、Unity で競合が発生し、Android APK のビルドが失敗します。プラグインには、競合するライブラリをプロジェクトから自動的に削除する方法が用意されています。こうした競合を解決する手順は次のとおりです。

  1. Unity のメニューバーで、[Google] > [Play Billing] > [Build Settings] を選択します。

  2. [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 アプリストアでゲームを公開する場合、デフォルトの Unity IAP 実装を置き換える必要があるのは、Google Play ストアを選択している場合だけです。

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 サービスを拡張するので、1 つの Unity API を使用して共通の購入ワークフローを管理できます。ただし、Google Play Billing Library と他のアプリストア用の標準 Unity IAP 実装には相違点があるため、API の動作がわずかに異なる場合があります。Unity IAP API を使用するのが初めての場合は、Unity IAP チュートリアルの「Making a Purchase Script」で、基本的な購入フローの実装例についてご確認ください。

Google Play Billing Library には、Google Play ストアに固有の機能も含まれます。このような機能を使用する際は、拡張インターフェースを利用します。以下では、このような固有の Google Play Billing Library 機能をゲームに実装する方法について説明します。

遅延購入を有効にする

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 を利用すると、ユーザーが 1 つのアプリ内に複数のプロファイルを持っている場合に、その複数のプロファイルにわたって単一のユーザーを一意に識別することができます。難読化済みプロファイル 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 は、デベロッパー ペイロードのサポートを終了しました。わかりやすくコンテキストに基づいた代替機能に置き換えられています。そのため、デベロッパー ペイロードはサポート対象外となっています。代替機能の詳細については、デベロッパー ペイロードをご覧ください。

IStoreController など、他のアプリストア用の標準 Unity IAP 実装で定義されているものと同じインターフェースを引き続き使用できます。たとえば、購入を開始する場合、引き続き 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 Billing Library には、これらのメソッドの代わりに使用できる API が用意されています。定期購入をアップグレードまたはダウングレードするには、比例配分モードを使用する UpdateSubscription() メソッドを呼び出します。

void UpdateSubscription(Product oldProduct, Product newProduct,
           GooglePlayStoreProrationMode prorationMode = GooglePlayStoreProrationMode.Unknown);

このメソッド呼び出しはプラットフォーム チェックでラップできます。また、GooglePlayStoreUnsupportedException がキャッチされたときにキャッチ ブロックにラップすることもできます。

比例配分モードの使用方法の詳細と例については、比例配分モードを設定するをご覧ください。