リリースした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でリトライ)して、終了しないためです。
この処理を使った購入は、以下のアプリで実際に試せますよ!笑
