Androidのアプリ内購入

GodotエンジンにはGooglePaymentsV3モジュールが統合されており、ゲーム内でアプリ内購入を実装できます。

Godotエンジンのデモプロジェクトリポジトリには、android-iapサンプルプロジェクトがあります。これには、Android IAP用のgdscriptインターフェイスが含まれています。

ここでリポジトリを確認してください https://github.com/godotengine/godot-demo-projects

iap.gdスクリプトを探す

godot-demo-projects/misc/android_iap

Autoloadリストに追加し、IAPという名前を付けて、ゲーム内のどこからでも参照できるようにします。

製品の詳細を取得する

ゲームを始める際には、商品価格、説明、ローカライズされた価格文字列など、Googleから商品の詳細を取得する必要があります。

#First listen to the sku details update callback
IAP.connect("sku_details_complete",self,"sku_details_complete")

#Then ask google the details for these items
IAP.sku_details_query(["pid1","pid2"]) #pid1 and pid2 are our product ids entered in Googleplay dashboard


#This will be called when sku details are retrieved successfully
func sku_details_complete():
    print(IAP.sku_details) #This will print the details as JSON format, refer the format in iap.gd
    print(IAP.sku_details["pid1"].price) #print formatted localized price

IAPの詳細を使用して、ショップシーンのタイトル、価格、説明を表示できます。

ユーザーがアイテムを購入したかどうかを確認する

ゲームを開始するときに、ユーザーが製品を購入したかどうかを確認できます。ゲームをロードした後、2/3秒後にのみこれを行う必要があります。ゲームの起動時にこれを最初に行うと、IAPが初期化されない可能性があり、開始時にゲームがクラッシュします。

#Add a listener first
IAP.connect("has_purchased",self,"iap_has_purchased")
IAP.request_purchased() #Ask Google for all purchased items

#This will call for each and every user purchased products
func iap_has_purchased(item_name):
    print(item_name) #print the name of purchased items

Google IAPポリシーでは、ユーザーが携帯電話を交換するか、同じアプリを再インストールした場合、ゲームはユーザーの購入を復元する必要があるとしています。上記のコードを使用して、ユーザーが購入した製品を確認し、それに応じてゲームを応答させることができます。

簡単な購入

この購入ロジックを製品の購入ボタンに配置できます。

#First listen for purchase_success callback
IAP.connect("purchase_success",self,"purchase_success_callback")

#Then call purchase like this
IAP.purchase("pid1") #replace pid1 with your product id
IAP.purchase("pid2") #replace pid2 with your another product id

#This function will be called when the purchase is a success
func purchase_success_callback(item):
    print(item + " has purchased")

また、購入フローに他のシグナルを実装し、必要に応じてユーザーエクスペリエンスを向上させることもできます。

purchase_fail - 何らかの理由で購入が失敗したとき

purchase_cancel - ユーザーが購入をキャンセルしたとき

purchase_owned - ユーザーが既に以前に製品を購入している場合

消耗品と非消耗品

製品には、消耗品と非消耗品の2種類があります。消耗品 を購入して使用します。たとえば、何度も購入できる治癒ポーション。非消耗品 は1回限りの購入です。例: レベルパック。

Googleでは、ダッシュボードにこの分別はありません。提供する商品が消耗品であり、ユーザーがそれを購入した場合、それが消費されるまで新たに購入できません。したがって、私たちは消耗品に対して消費メソッドを呼び出し、非消耗品に対しては消費メソッドを呼び出さないでください。

IAP.connect("consume_success",self,"on_consume_success")
IAP.consume("pid")

func on_consume_success(item):
    print(item + " consumed")

ゲームに消耗品しかない場合、これを行う必要はありません。購入後にアイテムを自動的に消費するように設定できます。

IAP.set_auto_consume(true)

ゲームに非消耗品のみが含まれている場合、つぎのようにできます

IAP.set_auto_consume(false)

ゲームの開始時に1回だけ自動消費(auto consume)の値を設定する必要があります。

テストする

GoogleダッシュボードでテスターとしてGmail IDを追加すると、そのテスターはアイテムを購入でき、課金されません。 IAPをテストする別の方法は、購入フローが同じであるため、ゲーム用に生成されたコードを使用することです。

第3のテスト方法は開発側です。以下に示すように、製品IDを入力すると、製品IDに基づいて静的な固定応答が返されます。これは、ダッシュボードに移動する前に、簡単にテストする方法です。

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable