Unityの有料アセット「EasyIAP」のDocumentationを和訳した記事になります。
こちらのセットにも同梱されています。
このアセットでできること
- 最低限のコーディング労力でゲーム内にIAP(In App Purchase)を導入できる
- ビルド目的のプラットフォームが複数あっても、同じコードのままでOK
- EasyIAPアセットをインポートしてIAP製品IDを入力するだけで設定完了(←別途自前Scriptも要るのでは?)
- Unity Editor上でテストできる
- 当Assetオリジナルの設定画面から、IAP商品IDなど簡単にセットアップできる
対応状況 | サポート対象 |
---|---|
IAP商品タイプ | 消耗型、非消耗型、サブスクリプション型 |
プラットフォーム | AppStore(iOS)、Google Play(Android)、Amazon(追加予定?) |
Visual Scripting Tool | Bolt、GameFlow、Playmaker |
初期設定
- Package Managerで "EasyIAP" アセットをインポートする。
- Window -> Gley -> EasyIAP を開く。
デバッグメッセージを見たい場合はDebugにチェックしておく。
- "Import Unity IAP SDK"ボタンを押すか、Window > Package Manager > Packages: Unity Registry を開いてIn App Purchasingパッケージをインストールする。
- Window > General > Services を開いて In-App Purchasing をONにする
- EasyIAPウィンドウに戻り、"Add new product"ボタンを押し、各IAP商品の情報を入力していく。
項目 | 説明 |
---|---|
Product Name | IAP商品の名前。スクリプト上で使用する。命名規則として、スペース・特殊文字の使用禁止、数字始まり禁止。 |
Product Type | IAP商品のタイプ。消耗型(Consumable)、非消耗型(NonConsumable)、サブスクリプション型(Subscription) から1つ選ぶ。 |
Reward Value | 消耗型の場合は報酬の値を入力する。非消耗型の場合は"0"と入力しておく。 |
Google Play ID | Google Play Console上で確認できる、IAP商品固有のID。 |
App Store (iOS) ID | iTunes Connect上で確認できる、IAP商品固有のID。 |
Amazon SKU | Amazon developer portal上で確認できる、IAP商品固有のID。 |
各ストアでのIAP商品IDの探し方
- Google Play ID の場合
Google Play Console > すべてのアプリ > (当該アプリを選択) > 商品 > アプリ内アイテム
- App Store (iOS) ID の場合
App Store Connect > アプリ > (当該アプリを選択) > 機能 > アプリ内課金
レシート検証の設定 (Google Playのみ)
レシート検証とは、ゲームユーザーが購入前のコンテンツにアクセスするのを防止するための機能。
レシート検証を有効にする方法:
- Window > Unity IAP > IAP Receipt Validation Obfuscator を開く。
- Google Play Developer Consoleで現在のプロジェクトを選択し、"Services and API"を開くと、ライセンスキー(Google Play public key)が表示される。
- 先程のライセンスキーを入力して "Obfuscate Google Play Licence Key" ボタンを押す。
Script作成
1. 初期化
// IAP商品情報を初期化するメソッド(ゲーム開始時に1度だけ呼び出して下さい):
IAPManager.Instance.InitializeIAPManager(InitializeResultCallback);
// 上記メソッド完了後に呼ばれるコールバック(例):
private void InitializeResultCallback(Status status, string message, List<StoreProduct> shopProducts)
{
if (status == Status.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);
}
}
2. IAP購入時の処理
// IAP商品が購入された時に呼び出すメソッド:
IAPManager.Instance.BuyProduct(ShopProductNames.YourProductName, ProductBoughtCallback);
// 上記メソッド完了後に呼ばれるコールバック(例):
private void ProductBoughtCallback(Status status, string message, StoreProduct product)
{
if (status == Status.Success)
{
// 消耗型の例。1購入につきRewardValue個のコインが与えられる:
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);
}
}
3. 過去の購入を復元する処理 (iOSのみ必要)
// 過去に購入したIAP商品を復元するメソッド(初期化時にも毎回自動で呼ばれる):
IAPManager.Instance.RestorePurchases(ProductRestoredCallback);
// 上記メソッド完了後に呼ばれるコールバック(例):
// 購入メソッドのコールバックとほぼ同じ内容。
private void ProductRestoredCallback(Status status, string message, StoreProduct product)
{
if (status == Status.Success)
{
// 消耗型は復元する必要なし
// 非消耗型の例。UnlockLevel1フラグをtrueにする:
if (product.productName == "UnlockLevel1")
{
unlockLevel1 = true;
}
// サブスクリプション型の例。Subscriptionフラグをtrueにする:
if (product.productName == "Subscription")
{
subscription = true;
}
}
else
{
// IAP購入処理中にエラーが発生した場合、詳細なエラーログを吐く:
Debug.Log("Buy product failed: " + message);
}
}
復元に失敗した場合の処理も追加したい場合
// 上と同じ「購入復元メソッド」だが、2番目のコールバックも引数に登録できる
IAPManager.Instance.RestorePurchases(ProductRestoredCallback, RestoreDone);
// このコールバックは「購入の復元に失敗した時」や「復元するものが何も無い時」に呼ばれる
// 購入復元中のUI表示などに使える
private void RestoreDone()
{
Debug.Log("Restore done");
}
4. その他の便利なメソッド
初期化済みかどうか確認する
// 初期化済みかどうかboolを返すメソッド:
public bool IsInitialized()
// 実装例:
IAPManager.Instance.IsInitialized()
報酬累計額をUI表示する
// 1つのIAP商品について、ユーザーが受領したゲーム内通貨の累計額を返すメソッド:
public int GetValue(ShopProductNames product)
// 実装例:
IAPManager.Instance.GetValue(ShopProductNames.YourProductName)
商品価格を現地通貨でUI表示する
現地価格 + 通貨コード
// 1つのIAP商品について、現地価格と国別通貨コードをstring型で返すメソッド:
public string GetLocalizedPriceString(ShopProductNames product)
// 実装例:
IAPManager.Instance.GetLocalizedPriceString(ShopProductNames.YourProductName)
現地価格のみ
// 1つのIAP商品について、現地価格に換算してint型で返すメソッド:
// (訳者注:int型なので、例えば米ドルだとセント部分が切れてしまう。実用的でない)
public int GetPrice(ShopProductNames product)
// 実装例:
IAPManager.Instance.GetPrice(ShopProductNames.YourProductName)
通貨コードのみ
// 1つのIAP商品について、国別通貨コードをISO4217に準拠した書式(GBP,USD等)で返すメソッド:
public string GetIsoCurrencyCode(ShopProductNames product)
// 実装例:
IAPManager.Instance.GetIsoCurrencyCode(ShopProductNames.YourProductName)
商品情報の取得
説明文の取得
// 1つのIAP商品の説明文を、Google Play/AppStore/AmazonStoreから取得するメソッド:
public string GetLocalizedDescription(ShopProductNames product)
// 実装例:
IAPManager.Instance.GetLocalizedDescription(ShopProductNames.YourProductName)
商品タイトルの取得
// 1つのIAP商品のタイトルを、Google Play/AppStore/AmazonStoreから取得するメソッド:
public string GetLocalizedTitle(ShopProductNames product)
// 実装例:
IAPManager.Instance.GetLocalizedTitle(ShopProductNames.YourProductName)
サブスクリプション商品の追加情報の取得
// サブスクリプション型商品に関する追加情報を取得するメソッド:
public SubscriptionInfo GetSubscriptionInfo(ShopProductNames product)
// 実装例:
SubscriptionInfo info = IAPManager.Instance.GetSubscriptionInfo(ShopProductNames.YourProductName);
if (info != null)
{
Debug.Log(info.getExpireDate());
}
購入状況の確認
// 1つのIAP商品について、現在のステータスを取得するメソッド(trueなら購入済み):
public bool IsActive(ShopProductNames product)
// 実装例:
IAPManager.Instance.IsActive(ShopProductNames.YourProductName)
その他のメソッド一覧
私の実装例: 商品価格を現地通貨でUI表示する
GetPriceメソッドだと米ドルのセント部分が消えてしまったので、GetLocalPriceStringメソッドを使ってstring切り出ししてました。
// 「1.00 USD」「100 JPY」のようなTextmeshPro用のstringを返すメソッド:
public string LocalPrice(string product)
{
ShopProductNames shopProductName = ShopProductNames.RemoveAds;
// 数字だけ抽出
string price = System.Text.RegularExpressions.Regex.Replace
(IAPManager.Instance.GetLocalizedPriceString(shopProductName), @"[^0-9,.]", "");
// 通貨だけ抽出
string currency = IAPManager.Instance.GetIsoCurrencyCode(shopProductName);
// 文字列を結合し、フォントサイズを調整
string tmptext = System.String.Join("", new string[] { price," <size=80%>",currency,"</size>" });
return tmptext;
}
トラブルシューティング
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にアップロードするのに使ったリリースキーと同じキーでアプリが署名されていること。
参考
Documentation
Forum