リリースした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
購入画面を出す前(初期化を行う前)に、インターネットの接続有無だけは確認が必須です。
if (Application.internetReachability == NetworkReachability.NotReachable){ //接続されていない }
iOS側で確認したところ、ネットワーク未接続時、IAPの初期化が無限ループ(接続できなかったらwaitでリトライ)して、終了しないためです。
この処理を使った購入は、以下のアプリで実際に試せますよ!笑