Soomlaのサンプルプログラム

Soomlaをインストールすると、Assetsの下に、シーンと複数のディレクトリが配置される。トップに配置されるsceneというファイルがサンプルシーンで、Examplesディレクトリ内にサンプルプログラムが入っている。実際にSoomlaでアプリを作成する場合は、sceneとExamplesは不要なので、削除すればよい。

Sooomlaファイル構成

Soomlaの課金システムの概要

Soomlaで管理できる仮想アイテムは、消費型仮想アイテム非消費型仮想アイテム仮想通貨の3種類。それぞれの特徴を表に示す。

購入回数 購入方法 ストア管理
非消費型仮想アイテム 一度だけ買える 現実の通貨で買う 管理される
消費型仮想アイテム 何度でも買える 仮想通貨で買う 管理されない
仮想通貨 何度でも買える 現実の通貨で買う 管理されない

非消費型消費型は、Google Play Storeのアイテム分類の、管理対象外のアイテム管理対象のアイテムに対応している。消費型アイテムの情報は、ストアのサーバーで管理されないため、
アプリを再インストールすると消去されるのに対し、非消費型仮想アイテムのデータは、ストアのサーバーで管理されるため、アプリの再インストール時に、サーバーから復旧できる。
仮想通貨も非消費型に分類される。消費型仮想アイテムや仮想通貨を、アプリの再インストール後に復旧可能にするには、自分でサーバーを構築してデータを管理する必要がある。

Scene

サンプルシーンの階層には、Main CameraStoreEventsCoreEventsExampleWindowが入っている。

シーン構成

StoreEvents、CoreEventsは、Prefabsディレクトリに入っているプレハブで、それぞれにスクリプトがアタッチされている。Soomlaを利用するには、この2つのプレハブをシーンに組み込む。

ExampleWindowにはサンプルプログラムがアタッチされていて、実行時にサンプルシーンのウィンドウを表示させる機能を持っている。

サンプルプログラム

サンプルプログラムの中身は、以下の5種類。Example.csは重要ではないので省略する。

Example.cs サンプルのウィンドウを表示する
ExampleWindow.cs UIの表示や、仮想アイテムの購入を行うメインクラス
ExampleEventHandler.cs イベントを処理する
ExampleLocalStoreInfo.cs 仮想アイテムを管理する
MuffinRushAssets.cs 仮想アイテムを定義する

ExampleWindow.cs

Examplesディレクトリに入っているExampleWindow.csが、サンプルプログラムの主な処理を行っている。ほとんどの箇所がGUI処理なので、重要な箇所のみピックアップする。

以下の箇所で、Soomlaのイベントハンドラクラスを定義している。このクラスに、購入や、キャンセル、リストアなどのイベント発生時の処理が記述されている。中身については後述する。

Startメソッドの最初の部分で、Soomlaのイベントハンドラの登録と、フレームワークの初期化を行っている。Initializeの引数に渡しているのは、MuffinRushAssetsという、ストアのアイテム情報を定義するためのインターフェース(IStoreAssets)を実装したクラスで、この中にサンプルプログラムのアイテム情報が定義されている。

サンプルプログラムには、初期画面仮想アイテム画面仮想通貨画面があり、それらがwelcomeScreengoodsScreencurrencyScreenメソッドに対応している。

初期画面(welcomeScreen)

welcomeScreenには、特に重要な箇所は無いが、ここで仮想アイテム画面に移動する直前に、Google PlayのIn-App Billing Serviceを開始している。

公式ドキュメントによると、
Androidではアプリ内購入の前後で、このサービスの起動と終了のコードを入れるのがオススメらしい。一応、無くても動作するようなので、この辺は要検証。

サービスは、goodsScreenで仮想アイテム画面から初期画面に戻る時に停止している。不要になったらすぐにサービスを停止しよう。

仮想アイテム画面(goodsScreen)

仮想アイテム画面では、ExampleLocalStoreInfoというクラスから、仮想アイテム(VirtualGood)を取得して、それに対応するメニューアイテムがタッチされたら、仮想通貨で仮想アイテムを買う処理を行っている。

ExampleLocalStoreInfoには、仮想アイテムと仮想通貨に関する情報が収納されている。

StoreInventory.BuyItem(アイテムID)を実行すると、そのIDに対応した仮想アイテムが、仮想通貨によって購入される。

仮想通貨画面(currencyScreen)

仮想通貨画面では、仮想通貨を補充できる。ExampleLocalStoreInfoから、仮想通貨パック(VirtualCurrencyPack)を取得し、それに対応するメニューアイテムがタッチされたら、現実の通貨で仮想通貨パックを買う処理を行っている。仮想通貨パックも仮想アイテムと同じ消費型アイテムだが、仮想通貨パックを購入すると仮想通貨が補充される。

ExampleEventHandler.cs

ExampleEventHandlerは、仮想アイテムや仮想通貨を使ったり、購入した際に発生するイベントを取得するためのクラス。コンストラクタで、イベントハンドラを登録している。

コードの下部に、Soomlaの初期化イベント発生時の処理が記述されている。初期化時に、ExampleLocalStoreInfoを初期化して、仮想通貨が空の場合、仮想通貨をテスト用に4000個追加している。

仮想通貨と仮想アイテムが更新された時に、ExampleLocalStoreInfoの情報を更新している。

ExampleLocalStoreInfo.cs

ExampleLocalStoreInfoは、仮想アイテムと仮想通貨を管理するためのクラス。仮想通貨の所持数や、仮想アイテムの所持数をstatic変数で管理している。
実際のアイテムの情報はSoomla自身が保持しているので、このクラスはSoomlaにとって必須では無いが、Soomlaの内部処理を隠蔽して手軽に利用するには、このようなラッパークラスを作ると便利。

Initメソッドで、StoreInfoクラスから、仮想通貨、仮想アイテムの情報を取得している。

UpdateBalancesメソッドで、仮想通貨の数と、仮想アイテムの数を更新している。

Soomlaでは、複数の種類の仮想通貨を持てるようだが、サンプルでは通貨は一種類のみとなっている。

MuffinRushAssets.cs

MuffinRushAssetsでは、仮想アイテムをIStoreAssetsというインターフェースのコンテキストに従って定義されている。

GetVersionでは、仮想アイテムのバージョン管理を行っている、アプリのバージョアップなどで、仮想アイテムが追加された場合は、この数値をインクリメントする必要がある。

GetCurrenciesでは、仮想通貨が定義されている。サンプルでは、MUFFIN_CURRENCYという通貨が一種類のみ。

GetCurrencyPacksでは、複数の仮想アイテムが定義されている。

GetNonConsumableItemsでは、非消費型コンテンツが定義されているが、サンプルでは購入する箇所が見当たらない。

続いて、アイテムのストア用のIDが定義されている。android.test.refundedといったIDは、
Androidで課金テストを行うための特別な変数なので、実際のアプリ公開時は、別のIDを使う必要がある。

参考: Testing In-app Billing

この後、個別のアイテム定義が続くが、長いので一部のみ抜粋。

1000マフィンという仮想通貨パックは、以下のように定義されている。

チョコレートケーキという消費型仮想アイテムは、以下のように定義されている。

よくある広告無効オプションの非消費型アイテムは、以下のように定義されている。

Soomlaでは、これらのアイテム定義を元に、購入処理や、アイテム管理を行っている。

まとめ

Soomlaを使ってアイテム課金処理を行う手順をまとめると、以下のようになる。

  • IStoreAssetsを実装したアイテム定義クラスを作成する
  • イベントハンドラを登録する
  • SoomlaStore.Initializeで、アイテム定義クラスを登録する
  • Soomlaからアイテムリストを取得する
  • アイテムに対応するユーザーのアクションが発生した場合に、購入処理を行う

Androidから利用するには、Google Play Developer Condoleに、同じIDでアイテムを登録し、マニフェストに以下のパーミッションを加える必要がある。

次回は、サンプルプログラムで省略されていた、非消費型アイテムを購入するテストアプリを作ってみる。

執筆時のコンテンツのバージョン

Unity: 4.5.2f1
Soomla: 1.5.3

Soomlaのサンプルプログラム」への3件のフィードバック

  1. 山崎貴衛

    初めまして
    山崎と申します。
    soomlaのブログ、とても参考になります。
    マフィンの課金はなんとか理解できそうなのですが、広告を非表示のところが、理解できません。
    本家のsoomlaで,、No adを参考にしてテストをしました。課金実装はできたのですが、表示されている広告を非表示にする方法が思いつきません。(NonConsumableItemの実装の仕方が理解できません。)
    何卒、ご教授いただければ幸いです。よろしくお願いします。

  2. fumobox 投稿作成者

    こんにちは。コメントありがとうございます。

    私自身、Soomlaの勉強中で、理解を深めるために記事を書いているので、Soomlaを熟知しているわけではないのであしからずw

    広告を非表示にする場合、起動時に広告無効アイテムが購入されたか調べて、もし購入済みなら外すといった処理をすればよいと思います。非消費型アイテムが購入済みか調べるには以下のメソッドが使えそうです。

    質問の意図を誤解していたらすみません。

    1. 山崎貴衛

      アドバイス、ありがとうございます。教えていただいたメソッドを参考にさせていただきます。

コメントは停止中です。