[Unity] アプリ内購入 NonConsumableの場合

リリースしたUnityアプリに、一度だけ購入する必要のあるアプリ内購入(NonConsumable)をひとつ入れました。

広告の解除です。

現在は、こちらに本家の情報があります。
Unity IAP

画面をスクロールすると出てきます。
ログインをして、チュートリアルをSTARTさせると、どこまで進めたかを保存しながら進めれるような作り。

この記事の以下の情報は古いです。参考程度に。

Unityサイトの説明とサンプルを見ながら作るとだいたいいけました。

Integrating Unity IAP In Your Game

ビルド時:Unity 5.3.5f1 Personal

気をつけないといけないところがあったので、要所とそのあたりを簡単に書いておきます。

・アイテムの初期化

	public void MyIAPInit () {
		var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
		builder.Configure<IGooglePlayConfiguration> ().SetPublicKey ("このアプリのライセンスキー");
		builder.AddProduct("RemoveAds", ProductType.NonConsumable, new IDs
			{
				{"Android側のID", GooglePlay.Name},
				{"iOS側のID", AppleAppStore.Name}
			});
		UnityPurchasing.Initialize (this, builder);
	}

「このアプリのライセンスキー」は、Google Developer Consoleでアプリ選択後、「サービスとAPI」を選択すると表示されます。

初期化終了時に呼ばれる OnInitialized

	private IStoreController controller;
	private IExtensionProvider extensions;
	private IAppleExtensions appleExtensions;

public void OnInitialized (IStoreController controller, IExtensionProvider extensions){
		this.controller = controller;
		this.extensions = extensions;
		this.appleExtensions = extensions.GetExtension<IAppleExtensions> ();
....
ここで画面に購入ボタンを表示するとか。
}

初期化失敗時

	public void OnInitializeFailed (InitializationFailureReason error)
	{
		switch (error)
		{
		case InitializationFailureReason.AppNotKnown:
			break;
		case InitializationFailureReason.PurchasingUnavailable:
			break;
		case InitializationFailureReason.NoProductsAvailable:
			break;
		}
		//失敗時の処理
		//メッセージを出すとか
	}

購入処理

controller.InitiatePurchase(controller.対象プロダクト);

controller.products.all[0]とか、指定方法は幾つか。
今回はひとつだけなので、allの0番目。

成功すると、

	public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
	{
		Debug.Log("Purchase OK: " + e.purchasedProduct.definition.id);
		Debug.Log("Receipt: " + e.purchasedProduct.receipt);

		//購入成功時の処理
		//購入したidを確認したり
	}

失敗すると、

	public void OnPurchaseFailed (Product item, PurchaseFailureReason r)
	{
		Debug.Log("Purchase failed: " + item.definition.id);
		Debug.Log(r);
		//失敗時の処理
	}

iOS側

リストア処理が要ります。

リストア(){
	appleExtensions.RestoreTransactions (result => {
			//if (result) {//結果のbool値はそんなに意味がない

			// リストア処理完了
			//リストア後の購入結果を判断

		});
}

リストアは、複数の購入リストアを一回で行う(この場合は広告解除だけですが)だけで、リストアが成功したからと言って、購入されたとか、復元されたというわけではないです。

購入の復元で、ProcessPurchaseが(アイテム数分)呼ばれ、最後に上記resultの中に来ると。
結果として購入が復元されたのかは、購入されたかの確認をしないといけない。

Android側

同じソースでいけましたが、再購入(リストア)は、初期化時に勝手にされてしまいました。
その時の画面状況がおかしくなければ、それでいいのかなと。

リストアボタンは必要ないため、非表示に。
再購入は、初期化で即購入処理に行くので、『購入しました。』というメッセージはよくなさそうに思われ、購入ボタンが押されていない場合は、リストアのメッセージにしました。

※Androidアプリは、ベータなどで公開し、ストアからダウンロードしないと課金は動作しません。テストアカウントを用意して、そのアカウントでダウンロードし、購入などをします。

iOSとAndroid

購入画面を出す前(初期化を行う前)に、インターネットの接続有無だけは確認が必須です。

【Unity】ネットワークの接続状態を見る

	if (Application.internetReachability == NetworkReachability.NotReachable){
		//接続されていない
	}

iOS側で確認したところ、ネットワーク未接続時、IAPの初期化が無限ループ(接続できなかったらwaitでリトライ)して、終了しないためです。

この処理を使った購入は、以下のアプリで実際に試せますよ!笑

ぴよなーで
piyonade150

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする