Unity IAP v4 以前と併用して AppCoins を追加する
このガイドでは、Unity IAP v4 以前を使用している Unity ゲームに AppCoins Billing を追加する方法を説明します。AppCoins プラグインには Unity IAP v5 が必要なため、まずアップグレードが必要です。Unity IAP の v4 から v5 へのアップグレードでは購入完了の仕組みが変わるため、AppCoins を導入する前の段階で既存のコードに影響があります。
プロジェクトがすでに Unity IAP v5 以降を使用している場合は、代わりに Unity IAP v5 と併用して AppCoins を追加する を参照してください。
手順 1: Unity IAP を v5 にアップグレードする
Window → Package Manager を開き、In App Purchasing を探して 5.0 以降にアップグレードします。
手順 2: Unity IAP v5 の API 変更を適用する
Unity IAP v5 では、IStoreListener のコールバックインターフェースが IStoreController のイベント購読に置き換えられました。最も大きく変わったのは購入完了のパターンで、ProcessPurchase はなくなりました。
購入の完了
変更前(v4):
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
GiveItemToUser(args.purchasedProduct.definition.id);
return PurchaseProcessingResult.Complete;
}
変更後(v5):
// Subscribe in your initialization code
_controller.OnPurchasePending += OnPurchasePending;
private void OnPurchasePending(PendingOrder order)
{
var product = order.CartOrdered.Items().FirstOrDefault()?.Product;
if (product != null) GiveItemToUser(product.definition.id);
_controller.ConfirmPurchase(order); // replaces returning PurchaseProcessingResult.Complete
}
ストアの初期化
変更前(v4):
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
_controller = controller;
foreach (var product in controller.products.all)
Debug.Log(product.definition.id);
}
変更後(v5):
// Subscribe before Connect()
_controller.OnProductsFetched += OnProductsFetched;
private void OnProductsFetched(List<Product> products)
{
foreach (var product in products)
Debug.Log(product.definition.id);
}
初期化の失敗
変更前(v4):
public void OnInitializeFailed(InitializationFailureReason error) { }
public void OnInitializeFailed(InitializationFailureReason error, string message) { }
変更後(v5):
_controller.OnStoreDisconnected += failure =>
Debug.LogError($"Store connection failed: {failure.Message}");
購入の失敗
変更前(v4):
public void OnPurchaseFailed(Product product, PurchaseFailureReason reason) { }
変更後(v5):
_controller.OnPurchaseFailed += OnPurchaseFailed;
private void OnPurchaseFailed(FailedOrder order)
{
Debug.LogError($"Purchase failed: {order.FailureReason}");
}
IStoreListener は不要になりました
イベント購読のパターンに移行した後は、クラスが IStoreListener を実装する必要はありません。インターフェースの宣言と、残っているスタブメソッドを削除してください。
ストアの初期化処理
変更前(v4):
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
builder.AddProduct("gas", ProductType.Consumable);
UnityPurchasing.Initialize(this, builder); // synchronous, IStoreListener callback
変更後(v5):
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
await _controller.Connect();
// Replaces builder.AddProduct — define product definitions and fetch after Connect
_controller.FetchProducts(new List<ProductDefinition>
{
new ProductDefinition("gas", ProductType.Consumable)
});
手順 3: AppCoins プラグインを追加する
GitHub のリリースページ から最新の .unitypackage をダウンロードし、インポートします。
- Unity で Assets → Import Package → Custom Package... を開きます。
- ダウンロードした
.unitypackageファイルを選択します。 - Import Unity Package ダイアログですべての項目が選択されていることを確認し、Import をクリックします。
プラグインのファイルは Assets/Plugins/iOS/AppCoinsSDKPlugin/ に配置されます。
手順 4: AppCoins を追加する
Unity IAP v5 でプロジェクトが正常にコンパイルできるようになれば、AppCoins の追加は 1 行だけです。Connect() の呼び出しの前に、次を追加します。
using AppCoins.Unity;
// Add this before Connect()
await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
await _controller.Connect();
AppCoinsStoreMode.Automatic は、条件を満たすインストールで AppCoins Billing を有効にし、それ以外では Apple Billing にフォールバックします。実行時判定の仕組み を参照してください。その他のコード変更は不要です。
変更前後の完全な例
変更前 — Unity IAP v4:
using UnityEngine;
using UnityEngine.Purchasing;
public class IAPManager : MonoBehaviour, IStoreListener
{
private IStoreController _controller;
void Start()
{
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
builder.AddProduct("gas", ProductType.Consumable);
UnityPurchasing.Initialize(this, builder);
}
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
_controller = controller;
}
public void OnInitializeFailed(InitializationFailureReason error) { }
public void BuyProduct(string productId)
{
_controller.InitiatePurchase(productId);
}
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
GiveItemToUser(args.purchasedProduct.definition.id);
return PurchaseProcessingResult.Complete;
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason reason)
{
Debug.LogError($"Purchase failed: {reason}");
}
private void GiveItemToUser(string productId)
{
Debug.Log($"Delivering: {productId}");
}
}
変更後 — AppCoins を追加した Unity IAP v5:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Purchasing;
using AppCoins.Unity;
public class IAPManager : MonoBehaviour
{
private StoreController _controller;
private readonly List<ProductDefinition> _products = new List<ProductDefinition>
{
new ProductDefinition("gas", ProductType.Consumable)
};
private async void Start()
{
// AppCoins: configure before Connect
await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.OnPurchaseFailed += OnPurchaseFailed;
// Re-fire OnPurchasePending for any unfinished purchases found by FetchPurchases()
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
// Fetch product metadata (replaces builder.AddProduct + UnityPurchasing.Initialize)
_controller.FetchProducts(_products);
// 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.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 OnPurchaseFailed(FailedOrder order)
{
Debug.LogError($"Purchase failed: {order.FailureReason}");
}
private void GiveItemToUser(string productId)
{
Debug.Log($"Delivering: {productId}");
}
}
v4 から最終形までの主な変更点:
IStoreListenerを削除 — 実装すべきインターフェースはなくなりましたUnityPurchasing.Initialize(this, builder)→await _controller.Connect()と_controller.FetchProducts(products)ProcessPurchase→OnPurchasePendingとcontroller.ConfirmPurchase(order)OnInitialized→OnProductsFetchedイベントの購読Connect()の前にawait AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic)を追加