メインコンテンツまでスキップ

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 以降にアップグレードします。

⚠️
アップグレード後、以下の v5 API の変更を適用するまでプロジェクトにコンパイルエラーが発生します。これは想定どおりの動作です。

手順 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 をダウンロードし、インポートします。

  1. Unity で Assets → Import Package → Custom Package... を開きます。
  2. ダウンロードした .unitypackage ファイルを選択します。
  3. 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 から最終形までの主な変更点:

  1. IStoreListener を削除 — 実装すべきインターフェースはなくなりました
  2. UnityPurchasing.Initialize(this, builder)await _controller.Connect()_controller.FetchProducts(products)
  3. ProcessPurchaseOnPurchasePendingcontroller.ConfirmPurchase(order)
  4. OnInitializedOnProductsFetched イベントの購読
  5. Connect() の前に await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic) を追加