Unity5.3のあの機能に触ってみた（アプリ内課金編）


##あいさつ
[CYBIRDエンジニア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cybird)の14日目を担当します[@yyama2](http://qiita.com/yyama2)です。
普段はUnityを使ってクライアントアプリ開発をしています。
昨日は[@fuppi](http://qiita.com/fuppi)さんの[「HiveからSparkに変えたら14時間分の集計バッチが3時間まで短縮できた話」](http://qiita.com/fuppi/items/bdeaa8723811a8208a0e)でした。
時間短縮は作業効率の他にも、自身の精神的ダメージにも関わってくる、という点が、@fuppiさんのリアルな実体験が伝わってくるようでしたねw
##はじめに
先日、12/8にとうとうUnity5.3がリリースされました！
Unity5.3では様々な新機能が搭載され、より便利に開発が進められるようになっています（のハズです。）
その追加機能のひとつ、待望の課金機能について今回触れていきたいと思います！
##Unityのアプリ内課金事情
いままで、Unityにはアプリ内課金機能がなかったので、
自前でアプリ内課金を実装するか、[Unity Asset Store](https://www.assetstore.unity3d.com/jp/)で誰かが作った課金機能のアセット（プラグイン）を購入するしかありませんでした。
多くのかたは、アセットを購入して実装コストを削減していたのではないでしょうか。

**で、今回のバージョンアップで待望 ~~（というか、実装されていないのが当たり前すぎて忘r）~~の課金機能が搭載！！**
実際にAndroidの課金機能を通して、デモを動かしてみました！
##Unity5.3のダウンロード
Unity5.3は[こちらのページ](http://unity3d.com/jp/)からダウンロードできます。
いままでのUnityとは違い、 **必要なプラットフォームを選択してインストール** することができるのでセットアップの時間も短縮できます。
![unity001.png](https://qiita-image-store.s3.amazonaws.com/0/94735/596c3167-c64c-0439-5ddc-b9f072948bfe.png "unity001.png")
##課金機能の有効化
Unity5.3から提供される課金機能はデフォルトでは有効になっていないので、[こちらの手順](http://unity3d.com/jp/learn/tutorials/topics/analytics/integrating-unity-iap-your-game-beta?playlist=17123)を参考に有効化してみます。

####Servicesウィンドウを開く 
``Window > Services`` で開くことができます。
	開いたら、適当 ~~に~~なIDを入力しましょう。
	![unity003.png](https://qiita-image-store.s3.amazonaws.com/0/94735/4546bedb-5e17-2595-08de-2ebbbed6d459.png "unity003.png")


####In-App Purchasing(アプリ内課金)を有効化
  In-App Purchasingを選択して、Enableをクリックします。
  ![unity004.png](https://qiita-image-store.s3.amazonaws.com/0/94735/bfe54a55-8cfe-e4fa-5f1b-0e5c70192bd0.png "unity004.png")
  対象年齢について聞かれるので、１３歳以下を対象としたアプリでない方にチェック。
  ![unity007.png](https://qiita-image-store.s3.amazonaws.com/0/94735/5d8853eb-3855-ae91-ba9e-fd0bf4acd523.png "unity007.png")
  importをクリック。ここでみてわかるように、iOS AppStore/Andorid GooglePlayStore/Mac AppStore/WindowsStoreの４つのストアでの課金をサポートしています。
  ![unity008.png](https://qiita-image-store.s3.amazonaws.com/0/94735/1edefbee-bcd7-6a91-119b-a6036ad08ea9.png "unity008.png")
そうすると、アプリ内課金に必要な機能(Plugins/UnityPurchasing)のインポートが行われます。
↓こんな感じ。
![unity013.png](https://qiita-image-store.s3.amazonaws.com/0/94735/ac1fe9e6-465e-319b-1729-af23f64931e4.png "unity013.png")
このインポートが完了すると、Androidの場合は課金用のパーミッションがアプリに追加されるようになります。
####GooglePlayStoreアップ時の表示
![unity016.png](https://qiita-image-store.s3.amazonaws.com/0/94735/d353b530-b144-619c-10d7-63246281d339.png "unity016.png")

**課金機能をマウスクリックだけでぽちぽち進めていくだけで、Androidは権限まで追加されて楽チン！**

##実装
今回は簡単な動作確認を行うため、APIDemo.csの下記の部分をAwake()を修正して検証してみました。

```cs:IAPDemo.cs
    ・・・
    public void Awake()
    {
    	・・・
    	
        var builder = ConfigurationBuilder.Instance( module );

        /////////////////////////////////////////////////////////////////
        // 自分で登録したアプリの情報に書き換え
        /////////////////////////////////////////////////////////////////
        
        // API_KEYはキーを別途定数定義
        builder.Configure<IGooglePlayConfiguration>().SetPublicKey( API_KEY );

        builder.AddProduct( "Unityで100円課金するぞー！", ProductType.NonConsumable, new IDs
        {
            { "jp.yyama2.demo.nonconsume", GooglePlay.Name }
        });
        // ストアごとにIDが違う場合
        builder.AddProduct( "Consume100", ProductType.Consumable, new IDs
        {
            { "jp.yyama2.demo.consume", GooglePlay.Name },
            { "jp.yyama2.demo.consumable", AppleAppStore.Name },
        });
        // ストアごとにイDが一緒の場合
        builder.AddProduct( "購読100", ProductType.Subscription, new IDs
        {
            // 
            { "jp.yyama2.demo.subscription", GooglePlay.Name, AppleAppStore.Name }
        });
        
        /////////////////////////////////////////////////////////////////
        // 書き換えここまで
        /////////////////////////////////////////////////////////////////
        
        // Now we're ready to initialize Unity IAP.
        UnityPurchasing.Initialize( this, builder );
    }
    ・・・
```
と、上記の箇所のみ修正しました。

##実際に動かしてみた
####アプリ起動時、Awakeで商品情報やAPIキーをもとに初期化が行われます。
APIDemo.csでは、初期化完了時のコールバックOnInitialized()関数でUIの初期化処理を行っています。
![app001.png](https://qiita-image-store.s3.amazonaws.com/0/94735/333a86f0-36fe-1251-8a92-9ab59a907856.png "app001.png")
####購入してみる
![unity002.png](https://qiita-image-store.s3.amazonaws.com/0/94735/c63c404e-685c-103f-6664-3273c309703e.png "app002.png")

![app003.png](https://qiita-image-store.s3.amazonaws.com/0/94735/8582e0a2-00ca-b3c0-7b76-ab1f7e1cb4a9.png "app003.png")
####購入後
![app004.png](https://qiita-image-store.s3.amazonaws.com/0/94735/a9b0e54c-4927-1960-5916-13d84de19178.png "app004.png")
####再起動（Consumable以外のアイテムは状態が保存されている。というか、Consumableは消費されている。）
![app005.png](https://qiita-image-store.s3.amazonaws.com/0/94735/8a0aa30f-96a0-ab95-bd45-fc4944c906d6.png "app005.png")
##今回アプリ内課金を試してみて思ったこと
###メリット
- Unity側の実装は、IAPDemoに沿った実装ならすぐに実装が可能！（だと思われる。）
- プラグインを買う必要がないのでお財布に優しい。
- 複数のプラットフォームの課金アイテムを１ソースで管理しやすい構造になっている。
- UnityAnaliticsと連携しやすい（らしい）。
- 既存のプラグインよりもに、プラットフォームの拡張の夢が広がりんぐ（勝手に思ってるだけ）。

###デメリット
- 既存のアプリだと導入しにくい（というかもう差し替えられないでしょ・・・）
- まだ、4つのプラットフォームしか対応していないので他のスマホ以外にも対応しようと思った場合に、まだ導入時期ではない。

デメリットというか大きな問題が・・・↓
##注意！まだベータ版
[こちら](http://unity3d.com/jp/learn/tutorials/topics/analytics/integrating-unity-iap-your-game-beta?playlist=17123)の手順のページでは、大きな文字で **(Beta)** と書かれていますので、実際に利用する際は自己責任で・・・
##まとめ
Unityでやっとこさ実装された課金機能のデモプレイを実践でした。
今回、何が一番つまづいたかというと、
**Androidの課金アイテムのテストの準備**でした。

- アプリは **β版** で **公開** しないといけない（反映まで１〜２時間以上。。。）
- **テストアカウント登録** しないと課金されちゃう
- **β版のテスター登録** をする必要がある
- ケーブル転送じゃなく、PlayStoreからダウンロードする必要がある(これは正確には違うかもしれないけど・・・)
などなど。。。

改めて勉強になったので、よかったです。

##おわりに
いかがだったでしょうか。
Unity単体での開発がどんどん便利になっていく一方ですね！
プラグインなしで開発をスタートできるっていうのは、個人で開発を行っている人はもちろん、
企業で開発をしていても、保守するプラグインが少なくなるので、非常にいいことなのではないでしょうか。
(あとは、 **プッシュ通知** と **WebView** と **動画再生** と・・・)

今回の記事は ~~[@fuppi](http://qiita.com/fuppi)さんがハードルを上げてくれたおかげで~~ 
気合い入れて書きましたが、キャプチャや説明がわかりやすいかどうかがものすごく心配な今日この頃です。
この記事をみてUnityのアプリ内課金触ってみようかな？とか思っていただけたら幸いです^q^


明日の[CYBIRDエンジニア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cybird)の担当は、[@UsuiYasuhiko](http://qiita.com/UsuiYasuhiko)さんの「自己分析」です。
どんな内容になるんでしょうか。楽しみです！