Unity IAPの機能を使って簡単にアプリ内課金を実装できるアセット、「Simple IAP System(SIS)」。
これまでUnity IAPやCordlessIAPなどのドキュメントを見つつ何度も自前実装に挑戦したものの、敢えなく敗れ去っていたのですが、このアセットを使ってあっさりと実装する事ができました!
どんどんアプデリリースしていくのが当たり前で、アプリのコンテンツ力が重要な昨今、機能レベルのものに対して自前実装に拘って機会損失をするのは馬鹿馬鹿しい事です。本当に素晴らしいアセットなので、もっと広まって欲しいと思います。
実装の手順
基本的な解説は添付PDF(和訳)で十分足りますが、さらに細かい情報は公式フォーラムのこういったトピックを参照する事ができます。
ここでは、自分のメモもかねて手順を書いていきます。※環境によってはパッケージ依存性の問題を引き起こす手順である可能性もあるので、よく確認して行ってください。
各ストアで課金アイテムの登録
Play StoreやApp Storeで課金アイテムを登録します。App Storeでは、購入のリストアボタンも表示させた状態の課金画面のスクショを登録する必要があります。
商品IDは一意なものを指定します。サーバ側でレシート検証などしたい場合は、ストア別にID末尾に_android, _iosなどとサフィクスを付けるとよいかもしれません。
Simple IAP Systemのインポート
これはいつも通りの手順です。
Unity IAPのインストール
Unity IAPをインストール、またはアップデートします。
「will determine if your project is configured properly before importing the unity iap asset package.」みたいなダイアログが出ますがOKしていきます。
Unity IAP Installerが出てきて、「click next to import unity iap [1/2]」みたいなのが出てくるので、Nextと押していきます。依存性解決関連など、複数の類似ダイアログが同時に出る事があるので、Unity側の処理が1つずつ落ち着くまで少し置いてから押していった方が安全かもしれません。
scriptかassemblyがobsoletesな機能を使っている、みたいなダイアログも出ますが、Go ahead!を押します。
Firebaseの機能を使っていると、この辺りでバグ地獄が発生する可能性があります(発生しました)。エラーメッセージに対する対処をメモした他の記事も参考にしてみてください。
ServicesでUnity IAPをONにします。
SimpleIAPSystem>Plugin Setupで、Unity IAP Statusが全てOKになってるのを確認します。Billing PlatformsはEverything, Activate Unity IAPはONにしてApplyを押します。
シーン側の準備
SimpleIAPSystem> Prefabs> Resourcesから「IAPManager」プレハブをゲーム内のシーンにドラッグします。マニュアルにはゲームの最初のシーンにとありますが、買い物するまでに読み込まれれば問題ないと思います。デバッグが楽なので私は課金ウィンドウがあるシーンに置いてます。
IAPManagerの「Google Key」という項目は、Google Play Console(旧)の、開発ツール>サービスとAPI画面にある「ライセンスとアプリ内課金」の「このアプリのライセンス用鍵」をコピペします。
ShopManagerプレハブを、課金購入画面があるシーンにドラッグします。
ShopManagerにはError WindowやConfirm Windowへの参照が必要です(Confirm WindowはPlayfabによるPayPal支払いにしか使わない??)。
Prefabs以下にある「Window-Message」「Window-Confirm」を参考にして自分で作ってもいいですし、「Window-Message」「Window-Confirm」をシーンに置き、それぞれError WindowとConfirm Windowに割当て、「Windows-Message>Window>Text」をMessageに割り当てて、デザインを修正するのが簡単です。
PlayFabサービス(アプリ内購入、仮想通貨、プレーヤーデータのクラウド保存など)を使う場合は、SimpleIAPSystem>Plugin SetupウィンドウでPlayFabを有効にして、「PlayfabManager」プレハブをSimpleIAPSystem> Prefabs> Resourcesからゲームの最初のシーンにドラッグします。もし、アプリ内購入のデータやプレイヤーデータのクラウド保存をやりたい場合はこれも実行します。
私は今回既存のシステムに課金だけを付けたくて、またレシート検証はローカルで良かったのでPlayfabの手順は行っていません。
シーン側の細かい実装
SimpleIAPSystem\Scenes\Verticalなどのアセット付属のサンプルシーンを使ってもよいのですが、既に自前のアイテム購入ウィンドウを作っていたので、そちらを利用する事にします。もしサンプルシーンを使う場合はそれをBuildウィンドウのScenes In Buildに追加します。ボタンのサイズ等がおかしかったりするので、これも修正します。
課金アイテムを登録
今回はリアルマネーでの石購入と、広告除去の購入を実装します。
このアセットでは、ゲーム中のコインはVirtual Currencies(ゲーム内仮想通貨)という枠組みで扱われます。今回はコインではなく石を通貨として扱う事になります。
石の購入は消費型(Consumable)のCurrency型商品、広告除去は非消費型(Non-Consumable)のDefault型商品という扱いになります。
SimpleIAPSystem>IAP Settingsでウィンドウを開き、
Virtual CurrenciesエリアでNameをcoinsからstonesに変更し、Defaultを0にします。
他にも仮想通貨が必要ならAdd Currencyを押して増やしていきます。
本来の用法なら、ここで登録した仮想通貨はSIS内で一元管理され、課金でCurrency型商品が購入されたら仮想通貨のamountが増え、ここで登録した仮想通貨で購入できる商品(Virtual Economy型商品)を購入するとamountが減るというような管理までしてくれます。
(私の場合、既に自前のコインや石の管理システムや、コインや石で購入できる店システムは実装しており、このアセットは後付で石課金や広告除去を実装する為だけに使いたかったので、virtual currencyのamount自体は実際には使いませんでした)
In App Purchasesエリアに既にサンプルで色々登録されていますが、GroupがIAP(アプリ内課金)になっている物以外(Itemsなど)を消します。もし先述の通りにSIS内で仮想通貨によるアイテム購入まで取り扱いたい場合は残します。
IAP Group内に石を購入する為のCurrency型商品と、広告除去の為のDefault型商品(TypeはNon-Consumable)を作成します。
iOSやAndroidのストアで登録したものと一致する商品IDをIdentifierに(ストアを識別する為のサフィクスを付けてたりする場合は左側の三角ボタンを押してストア別にIDをオーバーライドしてください)設定します。
課金のサムネ画像をIcon、商品見出しをtitle、商品説明をDescriptionに入力します。
Priceはストアを参照して同じ額に、Cost/Earningsは購入される石の個数です。
Fetchにチェックするとストア側の情報を見に行って、その情報で上書きされます。
IAPItemのデザインを変更
IAPItemというコンポーネントをアタッチされたプレハブがScrollViewなどのコンテナに自動的にInstantiateされる仕組みです。既にサンプルでIAPItemプレハブは用意されていますが、それを流用してもいいですし、自前でデザインしてIAPItemをアタッチしても構いません。編集が終わったら適当な場所に新しいプレハブとして保存します。
Restoreボタンの設置
iOS版にはリストアボタンの設置が義務付けられています。SISではUIButtonRestoreスクリプトをボタンにアタッチして、自分のUIButtonRestore.RestoreをOn Click()に加えるだけでリストアボタンが出来上がります。
IAPListener.csの編集
購入後の処理を編集します。
IAPListener.csでcase “restore”のテキストを日本語環境だと「購入を復元しました!」と表示されるように変更します。これでリストア時のメッセージが変更されました。
その他も購入した商品のIdに対応した購入時メッセージが出るように変更します。
私の場合は、先述の通りSISの仮想通貨の管理機能は使用しませんので、石を購入した時のcaseブロック内に、シンプルに石の数を増やす処理を書き加えます。
IAPItemとコンテナの設定
課金画面が開かれると、指定されたシーン内のコンテナにIAPItemがInstantiateされて商品一覧が作成されます。
シーン内に商品一覧のScrollviewを作っておきます。
「課金画面があるシーンを開いてから」SimpleIAPSystem>IAP Setupでウィンドウを開き、IAPグループの右上にあるPrefabにIAPItemコンポーネントをアタッチしたプレハブを指定し、ContainerにはScrollview内のContentのような、課金アイテム一覧の親となるオブジェクトにIAPContainerスクリプトをアタッチした上で指定します。
クライアント側のレシート検証
課金の不正が行われる可能性を少しでも防ぐ為、クライアント側のレシート検証を行います。
- [Window]> [Unity IAP]> [Receipt Validation Obfuscator]でUnity IAPの難読化ツールを開きます
- Google Store Keyを入力します(IAPManagerプレハブで入力したものと同じ)。
- Obfuscateボタンを押すと、プロジェクトに追加の認証情報ファイルが作成されます。
- IAPManagerプレハブにReceiptValidatorClientコンポーネントを追加します。
- ReceiptValidatorClientスクリプトを開いて、コメント解除行* / / *を削除します。
コメント