Unity In-App Purchasing
名前空間: UnityEngine.Purchasing | セキュリティ: UnityEngine.Purchasing.Security
パッケージ: com.unity.purchasing
Unity IAPには独自の初期化パスがあります UnityIAPServices.StoreController() → store.Connect() 経由です。UnityServices.InitializeAsync() は必要ありませんが、プロジェクトで他のUGSサービスを使用している場合は共存可能です。Analyticsが存在し、InitializeAsync() が呼び出された場合、IAPは自動的にトランザクションイベントを送信します。
始める前に
最初に必ず references/pre-check.md を読んでください。 プロジェクト内のサードパーティIAPパッケージ、ネイティブGoogle Billing、既存のUnity IAPバージョンをスキャンし、適切なパスにルーティングします。ルーティングが解決されるまで、他のリファレンスファイルを読んだり変更を加えたりしないでください。
詳細リファレンス
- プロジェクトスキャンとパスルーティング(最初に読むもの): references/pre-check.md を参照
- APIシグネチャとコード例: references/api-notes.md を参照
- プラットフォーム拡張機能(Apple、Google): references/platform-notes.md を参照
IAPProductCatalog.jsonの編集(スキーマ、decimalシリアライゼーション、リフレッシュ): references/codeless-catalog.md を参照- v4 → v5 移行: references/migration-v4-to-v5.md を参照
- ネイティブ Google BillingClient を Unity IAP 5 に変換: references/path-convert-native-google-billing.md を参照
- ネイティブ iOS StoreKit プラグインを Unity IAP 5 に変換: references/path-convert-native-storekit.md を参照
- Essential Kit Billing を Unity IAP 5 に変換: references/convert-essentialkit.md を参照
- UniPay(FLOBUK)— 評価とガイダンス: references/convert-unipay.md を参照
- RevenueCat — 変換評価とガイダンス: references/convert-revenuecat.md を参照
- Adapty — 変換評価とガイダンス: references/convert-adapty.md を参照
- 既存のIAPがないプロジェクトにUnity IAP 5を追加する: references/path-add-iap-to-new-project.md を参照
- IAP D2C機能を実装する(サードパーティ決済プロバイダ — Stripe/Coda、v5.4+が必要): references/path-implement-iap-d2c.md を参照
リファレンスファイルはオンデマンドで読み取ってください — 特定のAPIシグネチャ、プラットフォーム拡張機能の詳細、または移行マッピングが必要な場合のみです。
初期化フロー
UnityIAPServices.StoreController()を使用してStoreControllerを取得します(または個別のサービスをDefaultStore()、DefaultProduct()、DefaultPurchase()経由で取得)Connect()を呼び出す前に、必要なすべてのイベントをサブスクライブします(以下の必須イベントサブスクリプションを参照)await store.Connect()でプラットフォームストアに接続しますOnStoreConnectedで、store.FetchProducts(List<ProductDefinition>)を呼び出してカタログをロードしますOnProductsFetchedで、製品が表示と購入の準備が整います
初期化には Awake() を使用してください — 他の Start() メソッドの前にIAPの準備が確実に行われます。
製品タイプ: ProductType.Consumable、ProductType.NonConsumable、ProductType.Subscription。
製品の取得
製品を List<ProductDefinition> として定義し、store.FetchProducts() に渡します。Apple/Googleストア間で製品IDが異なる場合は StoreSpecificIds を使用します。複雑なカタログの場合は、CatalogProvider を使用して製品セットとストア固有のIDを管理します。
| メソッド | 動作 |
|---|---|
GetProducts() | キャッシュされた製品リストを返します(同期的、FetchProducts が呼び出されていない場合は古い可能性あり) |
FetchProducts() | ストアに最新の価格/在庫状況を照会し、キャッシュを更新します |
GetProductById(id) | IDで単一のキャッシュされた製品を返します |
これらは互換性がありません。GetProducts() に依存する前に、常に最初に FetchProducts() を呼び出してください。
2段階購入フロー
IAP v5では必須の2段階フローを使用します: Pending → Confirm。
store.PurchaseProduct(product)— プラットフォームの購入ダイアログを開始しますOnPurchasePendingが発火 —PendingOrderを受け取ります- レシートを検証し、プレイヤーにコンテンツを付与します
store.ConfirmPurchase(pendingOrder)— トランザクションを確定しますOnPurchaseConfirmedが発火 —Orderベースタイプを受け取ります;ConfirmedOrder(成功)とFailedOrder(確認失敗)をパターンマッチングします
コンテンツを付与した後は、必ず ConfirmPurchase(pendingOrder) を呼び出してください。 確認されていない購入は、購入の消失を防ぐため、次回アプリ起動時に再配信されます。
重複排除: OnPurchasePending は同じ購入に対して複数回発火する可能性があります(例: 確認前のアプリ再起動)。コンテンツが既に付与されているかどうかを常に確認してください。
消費型アイテム: 確認された消費型アイテムの購入は FetchPurchases では返されません。消費型アイテムの付与は自分で追跡してください(例: Cloud Save や Economy を使用)。
延期購入: OnPurchaseDeferred は Ask-to-Buy(iOS)および Google Play の延期購入に対して発火します。コンテンツを付与しないでください — 承認された場合の OnPurchasePending を待ちます。
トランザクションのリストア
store.RestoreTransactions(callback) は非消費型およびサブスクリプションの購入を再配信します。リストアされた各購入は OnPurchasePending をトリガーします。
iOSではApple App Store準拠のために必須です — 「購入を復元」ボタンを追加してください。
Appleの非更新サブスクリプションは RestoreTransactions 経由では復元できません。サーバー側で追跡してください。
レシート検証
| プラットフォーム | アプローチ |
|---|---|
| Google Play | CrossPlatformValidator と GooglePlayTangle.Data() — ローカル検証がサポートされています |
| Apple(StoreKit 2) | ローカル検証はノーオペレーション(何もしない) です。サーバー側検証には order.Info.Apple?.jwsRepresentation を使用してください |
タングルデータは、Unity Editorの Services > In-App Purchasing > Receipt Validation Obfuscator から生成します。
エンタイトルメント確認
Order を持っておらず、特定の製品のステータスを知りたい場合に使用します(v4の product.hasReceipt を置き換えます)。既に Order を持っている場合は、代わりにそのタイプを確認してください: PendingOrder は EntitledUntilConsumed(消費型)または EntitledButNotFinished(非消費型/サブスクリプション)にマッピングされ、ConfirmedOrder は FullyEntitled にマッピングされます。
store.CheckEntitlement(product) を呼び出し、store.OnCheckEntitlement を処理します。entitlement.Status == EntitlementStatus.FullyEntitled を確認します。
EntitlementStatus の値: FullyEntitled、EntitledUntilConsumed、EntitledButNotFinished、NotEntitled、Unknown。
既存の購入の取得
store.FetchPurchases() はストアから現在のすべての購入を取得します。アプリ起動時に便利です。
| メソッド | 動作 |
|---|---|
GetPurchases() | キャッシュされた購入リストを返します |
FetchPurchases() | ストアに現在の購入を照会し、キャッシュされたリストを上書きします |
FetchPurchases() は呼び出しのたびにキャッシュされたリスト全体を置き換えます。非消費型アイテムとサブスクリプションのみが返されます。