Unity Asset "EasyIAP"の使い方 (和訳)


Unityの有料アセット「EasyIAP」のDocumentationを和訳した記事になります。
レビュー評価が高いにもかかわらずスクリプトAPIがない&日本語の紹介記事もないので、これを機に開拓してみます。

こちらのセットにも同梱されています。

このアセットでできること

  • 最低限のコーディング労力でゲーム内にIAP(In App Purchase)を導入できる
  • ビルド時のプラットフォームが複数あっても同じコードのままでOK
  • Unity Editor上でテストできる
  • 消耗型、非消耗型、サブスクリプション型に対応
  • AppStore(iOS)、Google Play(Android)、Amazon Storeに対応
  • Visual Scripting Toolである Bolt、GameFlow、Playmaker と互換性あり

初期設定

  1. アセットをインポートする。
  2. Window -> Gley -> EasyIAP を開く。

    デバッグメッセージを見たい場合はDebugをチェックしておく。
  3. "Import Unity IAP SDK"ボタンを押すか、Window > Package Manager > Packages: Unity Registry を開いてIn App Purchasingパッケージをインストールする。
  4. Window > General > Services を開いて In-App Purchasing をONにする
  5. EasyIAPウィンドウに戻り、"Add new product"ボタンを押し、各IAP商品の情報を入力していく。
項目 説明
Product Name IAP商品の名前。スクリプト上で使用する。命名規則として、スペース・特殊文字の使用禁止、数字始まり禁止。
Product Type IAP商品のタイプ。消耗型(Consumable)、非消耗型(NonConsumable)、サブスクリプション型(Subscription) から1つ選ぶ。
Reward Value 消耗型の場合は報酬の値を入力する。非消耗型の場合は"0"と入力しておく。
Google Play ID Google Play developer console上で確認できる、IAP商品固有のID。
App Store (iOS) ID iTunes Connect上で確認できる、IAP商品固有のID。
Amazon SKU Amazon developer portal上で確認できる、IAP商品固有のID。

レシート検証 (Google Playのみ)

レシート検証とは、ゲームユーザーが購入前のコンテンツにアクセスするのを防止するための機能。
レシート検証を有効にするには:

  1. EasyIAPウィンドウで "Use Receipt Validation" をチェックしておく。
  2. Google Play Developer Consoleで現在のプロジェクトを選択し、"Services and API"を開くと、ライセンスキーが表示される。
  3. Window > General > Services > In-App Purchasing > Options を開き、先程のライセンスキーを入力してVerifyを押す。

Script作成

初期化

// IAP商品情報を初期化するメソッド:
// ゲーム開始時に1度だけ呼び出される。
IAPManager.Instance.InitializeIAPManager(InitializeResultCallback);


// 初期化が完了したら呼び出されるコールバック:
private void InitializeResultCallback(IAPOperationStatus status, string message, List<StoreProduct> shopProducts)
{
    if (status == IAPOperationStatus.Success) {
        // IAPの初期化に成功。
        // 全てのIAP商品についてループ開始:
        for (int i = 0; i < shopProducts.Count; i++) {
            if (shopProducts[i].productName == "YourProductName") {
                // このflagがtrueなら、ユーザーがIAP商品を購入したことを意味します。
                // 報酬へのアクセスを許可:
                if (shopProducts[i].active) {
                    yourBoolVariable = true;
                }
            }
        }
    } 
    else {
        Debug.Log("Error occurred " + message);
    }
}

IAP購入

// IAP商品が購入された時に呼ばれるメソッド:
IAPManager.Instance.BuyProduct(ShopProductNames.YourProductName, ProductBoughtCallback);


// IAP商品が購入される度に呼び出されるコールバック(の例):
private void ProductBoughtCallback(IAPOperationStatus status, string message, StoreProduct product)
{
    if (status == IAPOperationStatus.Success) {
        // 消耗型の例。1つの購入につきproduct.value個のコインが与えられる:
        if (product.productType == ProductType.Consumable) coins += product.value;
        // 非消耗型の例。UnlockLevel1フラグをtrueにする:
        if (product.productName == "UnlockLevel1") unlockLevel1 = true;
        // サブスクリプション型の例。Subscriptionフラグをtrueにする:
        if (product.productName == "Subscription") subscription = true;
    }
    else {
        // IAP購入処理中にエラーが発生した場合、エラーログを吐く:
        Debug.Log("Buy product failed: " + message);
    }
}

購入の復元

// 過去に購入したIAP商品を復元するメソッド(iOS AppStoreのみ必要):
// このメソッドは初期化時にも毎回自動で呼ばれる。
IAPManager.Instance.RestorePurchases(ProductRestoredCallback);


// 購入が復元される度に呼び出されるコールバック(の例):
// 購入メソッドのコールバックと同じ内容であることに注意。
private void ProductRestoredCallback(IAPOperationStatus status, string message, StoreProduct product)
{
    if (status == IAPOperationStatus.Success) {
        // 消耗型の購入は復元できないので記載なし。
        // 非消耗型の例。UnlockLevel1フラグをtrueにする:
        if (product.productName == "UnlockLevel1") {
            unlockLevel1 = true;
        }
        // サブスクリプション型の例。Subscriptionフラグをtrueにする:
        if (product.productName == "Subscription") {
            subscription = true;
        }
    }
    else {
        // 購入復元の処理中にエラーが発生した場合、エラーログを吐く:
        Debug.Log("Buy product failed: " + message);
    }
}

購入の復元に失敗した時のエラー処理

// 2番目の引数にもコールバックを設定することができる。
IAPManager.Instance.RestorePurchases(ProductRestoredCallback, RestoreDone);


// 購入の復元に失敗した時や復元するものが何も無い時に呼び出されるコールバック:
// ユーザーが購入の復元を実行する際のUI表示などに使える。
private void RestoreDone()
{
    Debug.Log("Restore done");
}

その他の便利なメソッド

UI表示に使えるものが多いです。

// EasyIAPプラグインが初期化済みかどうかを返すメソッド:
public bool IsInitialized()

// 1つのIAP商品"product"について、ユーザーが受け取った報酬の累計額を返すメソッド:
public int GetValue(ShopProductNames product)

// IAP商品"product"の価格と国別通貨コードをstring型で返すメソッド:
public string GetLocalizedPriceString(ShopProductNames product)

// IAP商品"product"の価格を現地の通貨に変換してint型で返すメソッド:
public int GetPrice(ShopProductNames product)

// IAP商品"product"の国別通貨コードをISO 4217に準拠した書式(GBP,USD等)で返すメソッド:
public string GetIsoCurrencyCode(ShopProductNames product)

// Google Play,AppStore,AmazonStoreからIAP商品"product"の説明文を取得するメソッド:
public string GetLocalizedDescription(ShopProductNames product)

// Google Play,AppStore,AmazonStoreからIAP商品"product"のタイトルを取得するメソッド:
public string GetLocalizedTitle(ShopProductNames product)

// IAP商品"product"のステータスを取得するメソッド(trueならユーザーはproductを購入済み):
public bool IsActive(ShopProductNames product)
// サブスクリプション型商品に関する追加情報を取得するメソッド:
public SubscriptionInfo GetSubscriptionInfo(ShopProductNames product)


// 実装例:
SubscriptionInfo info =
    IAPManager.Instance.GetSubscriptionInfo(ShopProductNames.SubscriptionName);
if (info != null) {
    Debug.Log(info.getExpireDate());
}

その他のメソッド一覧:https://docs.unity3d.com/Manual/UnityIAPSubscriptionProducts.html

トラブルシューティング

EasyIAPをUnity Editor上で動かす場合、支払いは発生しないはずです。
初めてEasyIAPをデバイス上で動かす場合、下記事項をよく確認して下さい。

  • インターネット接続が有効であること。
  • デバイスの日時設定が正しいこと。
  • iOSの場合、銀行口座をiTunes Connectに登録してあること。これをしないとIAP商品を返品できません。
  • iOSの場合、XCode > Capabilites > In-App PurchaseがONになっていること。
  • EasyIAPウィンドウで登録したIDが、それぞれの命名規則に従っていること。
  • AppStore (iOS)やGoogle Play上には未公開のアプリを、テストユーザーとして起動していること。
  • Google Play上にアルファ版またはベータ版として公開済みのアプリであること。
  • アプリのバンドルIDが、Google Play developer consoleやiTuens Connect上で作成したものと同一であること。
  • Google Play developer consoleにアップロードするのに使ったリリースキーと同じキーでアプリが署名されていること。

参考