いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : アプリ内ストアを最小限のスクリプトで実装する

Unityのアプリ内購入は、コードをほとんど書かずに実装することができます。

ライブラリをインポートする

Window > Services

からサービスウインドウを開き、In-App Purchasing のトグルをONにします。

f:id:sugar_affordance:20170105100852p:plain

その先の画面のトグルもONにし、13歳以下対象かどうかのチェックボックスを入れて Continue ボタンを押します。

f:id:sugar_affordance:20170105101212p:plain

このチェックボックスに関しては下の記事参照

indie-du.com

さらに下記画面に移動するので、Importボタンを押すとライブラリがインポートされます。

f:id:sugar_affordance:20170105101309p:plain

これで準備完了です。

購入ボタンを配置する

メニューから

Window > Unity IAP > Create IAP Button

で、シーンに購入ボタンを置きます。

f:id:sugar_affordance:20170105101636p:plain

f:id:sugar_affordance:20170105101830p:plain

一見なんのへんてつもないボタンですが、インスペクタでみると

f:id:sugar_affordance:20170105101941p:plain

IAP Button コンポーネントがついています。

このコンポーネント内では直接

  • ストアで売るものの情報
  • 購入成功、失敗後のコールバック参照

を定義できます。

売り物情報編集

IAP Catalog ボタンを押して編集画面を開きましょう。

f:id:sugar_affordance:20170105102554p:plain

IDは売り物を表す一意な文字列で、これはAppStoreなどで使用するIDと一致している必要はありません。ゲーム内で使いやすい文字列にするといいでしょう。

Typeはアイテムの種類で、

Consumableはジェムなどの消費アイテム、Non Consumableは使っても消費しないアイテム、Subscriptionは広告消しなどの永続アイテムという区分けのようです。
Non ConsumableとSubscriptionは購入状態を復元できるようなので、種類はちゃんと入力しましょう。

一通りアイテムを定義したら、IAP Buttonで購入対象のIDを選択します。

テスト動作してみる

実はすでにエディタ上で実行できます。
ゲームを実行して購入ボタンを押すと、ダイアログが出てきます。

f:id:sugar_affordance:20170105103802p:plain

実際にはGooglePlayStoreやAppStoreのアプリ内購入システムと接続するので、アプリ書き出し後に出てくるダイアログは各システム依存です。

ちなみにカタログのウインドウでCatalog Exportを実行すると、各ストアにアップロードするCSVファイルなどを吐き出せるようです。便利ですね。

購入成功時のコールバックを呼び出す

特にConsumableなアイテムを購入したあとは、ゲーム内のアイテム数を増やさなければなりません。

それにはまず下記のような関数をスクリプトに定義します。

using UnityEngine.Purchasing;

public class PurchaseTest : MonoBehaviour {

    // 購入完了
    public void OnPurchaseCompleted (Product product)
    {

    }
}

これを適当なオブジェクトにつけると、IAP Buttonの On Purchase Complete 欄に登録することができます。

f:id:sugar_affordance:20170105105541p:plain

これで購入完了時に関数がよびだされます。

購入されたものから自動で処理してみる

ボタンごとにコールバックを定義してもいいのですが、Productクラスからは購入されたものの情報を取得できるので、条件分岐で処理を分けることもできます。

たとえばIDを

gem.購入数

という形式にしておけば、以下のコードで購入数を引き出すことができます。

    // 購入完了
    public void OnPurchaseCompleted (Product product)
    {
        // IDから購入量取得
        string[] defs = product.definition.id.Split('.');

        if (defs[0].Equals ("gem")) {

            int val = 0;
            if (Int32.TryParse (defs [1], out val)) {
                // 獲得ジェム数を保存
            }

        }
    }

  • 公式サイト

docs.unity3d.com


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。