Unity IAP v5 と併用して AppCoins を追加する
このガイドでは、すでに Unity IAP v5(5.0 以降)を使用している Unity ゲームに AppCoins Billing を追加する方法を説明します。プロジェクトがそれより古い Unity IAP バージョンを使用している場合は、先に Unity IAP v4 以前と併用して AppCoins を追加する を参照してください。必要なのは、既存の Connect() 呼び出しの前に 1 行追加することだけです。すでに記述したイベントハンドラー、商品定義、確定処理はすべてそのままで、Aptoide 経由で配信されたビルドでは AppCoins が有効なストアになります。
セットアップ
GitHub のリリースページ から最新の .unitypackage をダウンロードし、インポートします。
- Unity で Assets → Import Package → Custom Package... を開きます。
- ダウンロードした
.unitypackageファイルを選択します。 - Import Unity Package ダイアログですべての項目が選択されていることを確認し、Import をクリックします。
プラグインのファイルは Assets/Plugins/iOS/AppCoinsSDKPlugin/ に配置されます。
概要
AppCoins は、カスタムストアプロバイダーとして Unity IAP v5 に統合されます。設定が完了すると、すでに使用している StoreController API が、条件を満たす場合は自動的に AppCoins Billing へ購入をルーティングし、それ以外の場合は Apple Billing にフォールバックします。購入用の別 API は不要です。
変更点は 1 つだけ
AppCoins の API を使用するファイルに追加するものは 2 つです。名前空間のインポートと、Connect() の前の 1 つの await です。
変更前:
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
_controller.FetchPurchases();
変更後:
using AppCoins.Unity; // Add this using directive
// ↓ This is the only new line required
await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
_controller.FetchPurchases();
ConfigureStoreAsync は controller.Connect() の前に呼び出して await してください。ストアを設定せずに Connect() を呼び出すと、ストアプロバイダーが誤って設定されるか、登録されない状態になります。Automatic モードの動作
AppCoinsStoreMode.Automatic は起動時に AppDistributor.current を照会し、iOS 17.4 以降で、Apple App Store および TestFlight 以外からインストールされた場合に AppCoins Billing を有効にします。インストール元ごとの詳細は、実行時判定の仕組み を参照してください。
OnPurchasePending、OnProductsFetched、OnPurchaseConfirmed、OnPurchaseFailed の各ハンドラーは、どのストアが有効であっても同じように発火します。どちらの経路が選択されたかを確認するには、ConfigureStoreAsync の完了後に AppCoinsIAP.SelectedStore を参照してください。
var selectedStore = await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
// selectedStore is either "AppCoinsAppStore" or "AppleAppStore"
Debug.Log("Active billing store: " + selectedStore);
レシートの変更点
サーバーサイドで購入検証を行っている場合、AppCoins Billing が有効なときは order.Info.Receipt に Apple のレシートではなく AppCoins の JSON ペイロードが含まれる点にご注意ください。レシートの構造とサーバーサイド検証のフローについては、購入の検証 を参照してください。
変更前後の完全な例
以下の例は Unity IAP v5 の完全なセットアップを示し、AppCoins を追加するために必要な唯一の変更点を強調しています。
変更前 — Apple のみの標準的な Unity IAP v5:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
public class IAPManager : MonoBehaviour
{
private StoreController _controller;
private async void Start()
{
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
_controller.FetchPurchases();
}
private void OnProductsFetched(List<Product> products)
{
foreach (var product in products)
{
Debug.Log($"Product: {product.definition.id} — {product.metadata.localizedPriceString}");
}
}
public void BuyProduct(string productId)
{
_controller.PurchaseProduct(productId);
}
private void OnPurchasePending(PendingOrder order)
{
var product = order.CartOrdered.Items().FirstOrDefault()?.Product;
if (product == null) return;
GiveItemToUser(product.definition.id);
_controller.ConfirmPurchase(order);
}
private void GiveItemToUser(string productId)
{
Debug.Log($"Delivering item: {productId}");
}
}
変更後 — AppCoins を追加した同じコード(強調された行が新規):
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
using AppCoins.Unity; // Add this using directive
public class IAPManager : MonoBehaviour
{
private StoreController _controller;
private async void Start()
{
// ↓ This is the only new line required
await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
// Re-fire OnPurchasePending for any unfinished purchases found by FetchPurchases()
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
// Trigger recovery of unfinished purchases — results arrive via OnPurchasePending
_controller.FetchPurchases();
}
private void OnProductsFetched(List<Product> products)
{
foreach (var product in products)
{
Debug.Log($"Product: {product.definition.id} — {product.metadata.localizedPriceString}");
}
}
public void BuyProduct(string productId)
{
_controller.PurchaseProduct(productId);
}
private void OnPurchasePending(PendingOrder order)
{
var product = order.CartOrdered.Items().FirstOrDefault()?.Product;
if (product == null) return;
GiveItemToUser(product.definition.id);
_controller.ConfirmPurchase(order);
}
private void GiveItemToUser(string productId)
{
Debug.Log($"Delivering item: {productId}");
}
}
AppCoins 固有の追加は、using AppCoins.Unity; ディレクティブと await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic); の呼び出しだけです。その他(ProcessPendingOrdersOnPurchasesFetched(true)、FetchProducts(List<ProductDefinition>)、FetchPurchases())はすべて標準的な Unity IAP v5 のものであり、変更前・変更後のどちらにも含まれます。