West Hill 開発メモ

以前とりあげたUnityでのAndroidアプリ内課金プラグインであるprime31のAndroid In App Billing Pluginですが、
AndroidのIn App Billingがversion3になって色々変わっていて、
プラグインの方も大きく変更されているので、新バージョンでの実装メモになります。

prime31
http://www.prime31.com/

今回も管理なしアイテムと、ユーザアカウント毎に管理のアイテムで試しました。

導入時のバージョンはUnity4.0.1、
プラグインのバージョン(公式サイトでのリリース日)は2013-01-21です。

--------------------------------------------------------
※注意:ここで紹介しているバージョンは古いので
実装の際は公式で最新のドキュメントを確認することをおすすめします。
--------------------------------------------------------

※前準備として事前に、デベロッパーコンソールにてアプリと課金アイテムを登録し、
 アイテムのみ公開状態にしておく。(アプリが非公開なら、公開されることはない)
 テストアカウントの追加を行ない、端末のメインアカウントをテストアカウントにする。

※旧バージョンから移行する場合には、最初にPlugins配下の
 InAppBillingAndroid フォルダを削除する必要があります。

以下、実装の簡単な流れ

①Android In App Billing Pluginをインポート(※1)した後、
 最初のシーンに GoogleIABEventListener を配置。
 DontDestroyOnLoadで死なないようにしておく。

②まずは GoogleIAB.init( publicKey ) で初期化します。
 引数にはデベロッパーコンソールで確認できる、自身のパブリックキーを入れます。
 アプリ内購入が可能である場合には 
 GoogleIABEventListenerbillingSupportedEvent() が非同期で呼ばれ、
 アプリ内購入不可の場合は
 billingNotSupportedEvent( string error ) が呼ばれます。

③詳細なログ出力を行うかどうかを
 GoogleIAB.enableLogging( AndroidDetailLogging ) で設定し、
 署名の認証チェックを自動で行うかどうかを
 GoogleIAB.setAutoVerifySignatures( AndroidAutoVerifySignatures ) で設定します。

④ GoogleIAB.purchaseProduct( productId ) で購入リクエストを送信する。
 購入したいアイテムのプロダクトIDを引数に入れる。
 これでマーケットアプリが立ち上がり、アイテムの購入画面が表示される。
IAB01
⑤購入が正常に終わると、GoogleIABEventListener 
 purchaseSucceededEvent( GooglePurchase purchase ) 
 が呼ばれます。ここで対応するアイテム等をゴニョゴニョする。
 引数の GooglePurchase にはプロダクトIDやオーダーID等、
 購入レシートと同じ情報が含まれています。

⑥In App Billing version3では、消費タイプのアイテムは購入後に消費リクエストを投げないと
 追加購入ができなくなるので、
 GoogleIAB.consumeProduct( googlePurchase.productId ) で消費リクエストを送ります。

⑦正常に通れば、GoogleIABEventListener 
 consumePurchaseSucceededEvent( GooglePurchase purchase ) が呼ばれます。

⑧リストアの実装は GoogleIAB.queryInventory( productIdList.ToArray() )
 の引数にプロダクトIDリストを入れて呼ぶことで、
 queryInventorySucceededEvent( List<GooglePurchase> purchases, List<GoogleSkuInfo> skus )
 が呼ばれ、purchases に購入済みアイテム一覧が入っているので、この情報で復旧できます。

⑨アプリケーションの終了時、OnApplicationQuit()等の中で、
 GoogleIAB.unbindService()でBillingServiceを終了する。

⑩その他のGoogleIABEventListener 内イベント
purchaseCompleteAwaitingVerificationEvent( string purchaseData, string signature )
  → 購入時のレシート通知イベント。GooglePurchaseと同じ情報ですが、 
    こちらはJSON形式になっています。(※version2のレシートとは形式が異なります)
purchaseFailedEvent( string error )
   購入エラー。キャンセルでも呼ばれます。
queryInventoryFailedEvent( string error )
  → 購入済アイテムの取得失敗。
consumePurchaseFailedEvent( string error )
  → 消費の失敗。

※1 他のAssetや独自でAndroidManifestをカスタムしている場合には、
 (Plugins→Android配下にAndroidManifest.xmlファイルがある場合)
 上書きされてしまうので、AndroidManifestだけはインポートしないでおき、
 元のAndroidManifestとprime31のAndroidManifestを手動でマージする必要があります。

このエントリーをはてなブックマークに追加 Clip to Evernote

Unityでのパフォーマンス低下の原因の一つであるDrawCallを減らすためのAsset、
Draw Call Minimizerを使用した際の問題点とその対策方法のまとめです。

Draw Call Minimizer (free)

実装時のバージョンはUnity4.0.0、Draw Call Minimizerのバージョンは1.3.6.2です。

基本的な使い方についてはテラシュールウェアさんの記事が参考になります。

[Unity3D]Draw Call Minimizerの使い方と問題について
http://terasur.blog.fc2.com/blog-entry-215.html


以下が自分の環境で使用した際に起きた問題点とその対策方法です。

●まとめたオブジェクトが実行時に真っ黒になってしまう
 オブジェクトのマテリアルで使用しているテクスチャが大きすぎると、
 1枚に結合できずに黒くなってしまうので、
 テクスチャのインポート設定でMax Sizeを小さいサイズに変更する。 

●エラーメッセージUnsupported texture format needs to be ARGB32, RGBA32, BGRA32, RGB24, Alpha8 or DXTが出る
 メッセージの通り、テクスチャのインポート設定でAdvancedにして、
 FormatをARGB32、RGBA32、RGB24、Alpha8、DXTのいずれかに変更する。

●エラーメッセージCannot combine textures when using Unity's default material textureが出る
 これもメッセージの通り、デフォルトテクスチャは使用できないので、
 何でもいいのでテクスチャを張り付ける。

●一部のモデルでout of boundsエラーが出る
 エラーが発生しているスクリプトの該当箇所をコメントアウトする。
 対応箇所は「MeshCombineUtillity」の以下部分。

 mesh.colors = colors.ToArray();
 mesh.uv1 = uv1.ToArray();
 mesh.uv2 = uv2.ToArray();

●オブジェクトの当たり判定がなくなり、すり抜けてしまう
 実行時にColliderが外れてしまうので 、「OptimizedCombinedChildren」の
 150行目付近のメッシュを結合しているfor文の中にMeshColliderを付ける処理を追加する。

 go.AddComponent ("MeshCollider");
 go.GetComponent<MeshCollider>().sharedMesh = combinedMeshes[i];


ちなみに、Draw Call MinimizerはOptimizedCombineChildren配下の全オブジェクトを1つにしてくれるのではなく、共通のシェーダを使用しているオブジェクトが1つにまとめられます。
(2種類のシェーダを使っていたら2つのオブジェクトにまとめられます。)

マテリアルを結合しているので当たり前なのですが、複数のシェーダを使用している場合には注意が必要です。

このエントリーをはてなブックマークに追加 Clip to Evernote

NGUIを使用したヘッダーやフッター(タブバー等)の実装です。

前回はアスペクト比を固定してレターボックスを表示していましたが、
黒帯は嫌だスクリーンをフルで使いたい!という場合に、アスペクト比が変わってもヘッダーは上部固定、フッターは下部固定にする設定です。 

NGUI ($95)
https://www.assetstore.unity3d.com/#/content/2413

実装時のバージョンはUnity3.5.7、NGUIのバージョンは2.2.6Cです。

※今回もUI Rootへウダサンコウボウさんの以下スクリプトをアタッチします。

[Unity]NGUIで画面サイズに合わせる(NGUI2.2.2対応版)
http://udasankoubou.blogspot.jp/2012/10/unitynguingui222.html


以下、実装手順

①画面の中心用、ヘッダー用、フッター用にUIAnchorを3つ用意する。
headfoot01
②ヘッダー用のUIAnchorのSideの値をTopに設定する。
headfoot02
③ヘッダー用のUIAnchor配下のパネルへSpriteを追加し、PivotをTopにする。
headfoot03
④同じように、フッターはBottomに設定する

これでアス比の違うiPhone5のような縦長画面でもヘッダーとフッターの位置を固定できました。
headfoot04

このエントリーをはてなブックマークに追加 Clip to Evernote

このページのトップヘ