FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    アプリ『トランプ・ジン・ラミー』を公開しました。
    Android/iOS https://goo.gl/PYKFYG

    タグ:広告

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Google Play Developer ConsoleにはクラッシュとANRという項目があります。
    これはアプリのクラッシュ(強制終了)とANR(アプリが応答しなくなる) がどれくらい起こっているかのレポートを見るものです。

    少し前にこのようなレポートが上がっていました。
    タイトルにjava.lang.Error: FATAL EXCEPTION [main]と書かれていて、何が起こっているかわかりませんがまずそうな感じなのはわかりました。
    原因は、
    Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@2bbfaf22: Unmarshalling unknown type code 7274595 at offset 12だと書いてありました。ParcelでUnmarshalling unknown type codeが起こったということです。

    admob-interstitial-error
    Parcelクラスはデータを保存できるオブジェクトを作れるもののようです。オブジェクトも保持できるとのことなので、内部的にはバイト列をもつクラスなのでしょう。(C#でいうとシリアライズ、デシリアライズに対応するのだと思います。)
    このクラスのreadValueが失敗するわけですが、クラスの読み込みがうまくいっていないということです。そこまではわかったのですが、どんなオブジェクトが来ていて、どこで読み込みに失敗するかはまるでわかりません。下の方にある呼び出し元を見るとInterstitialというところから呼ばれているのがわかります。これはインタースティシャル広告の開始のことでコードはライブラリの中です。

    もはやコードを見ることはできないので、検索して調べることにしました。
    同じような問題に遭っている人がいるようでGoogleに質問していました。 議論を見てみると、最後にGoogleがバグを修正したとあります。
    UnityにAdMobで広告を出している場合、Unity向けのパッケージを更新すればいいのか、google_play_servicesライブラリを更新すればいいのか、はたまたどちらも更新が必要なのかはわかりませんでした。
     
    どうもすべての端末で起こるわけではないようでしかも11月頃から発生したことのようです。 それまで発生しなかったことを考えると広告配信のデータの形式が変わり、機種(Android version)によってはそれに対応していないということかもしれません。
    インタースティシャルを使わなければ起きないでしょうが、使えないのは困ります。

    google_play_servicesライブラリを更新するくらいしか手がなさそうです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    11/15に「トランプ・ナポレオン」を2.2にアップデートしました。

    機能追加としてはチャットの対応です。
    前面にチャット用のUIが表示されるため、宣言や副官指定、カード交換時に表示してしまうとそれらのUIの操作ができなくなってしまいます。チャットをしながら遊ぶということを優先したので、このようになっています。
    トリックの最中はチャットUIを表示してもカードの選択に被らないようにしてあるので、チャットをしながらカードを出すということができます。
    tn-chat1 tn-chat2

    チャットは全員にメッセージが送られるようになっています。表示できるメッセージには上限があり、古いものから消えていきます。
    1メッセージは30文字まででメッセージの上限は50個になっています。

    ユーザー的には関係ないですが、広告のメディエーションに対応したというのが開発者としては最も重要なアップデートになります。nendの単価が下がってきていたので、1つの広告に依存するのは良くないと考えメディエーションを行おうかとなりました。
    AdMobのメディエーション機能自体は以前のアプリから対応したいと思い、実験はしていました。しかしnendのAdMobメディエーション用のアダプタにバグがあるようでAscend G6で必ずアプリが終了するということが発生していたため、対応は行いませんでした。この話は6月ごろのことで結構な時間が経っているので、もしかしたら直っているのではないかと思って今回試してみることにしました。
    SDKもアダプタも更新されていたためか問題は起こらずバナーとインタースティシャルのメディエーションを行うことができました。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    利用しているアプリの広告サービスを紹介します。広告を出す側ではなく、広告を載せる場所を提供する側についての話です。
    広告を入れると無料のアプリでも収益を得ることができるようになるため広告を表示する場所を提供したいと考える人はそれなりにいると思います。自分で広告の依頼主を集めるということをするよりは、仲介者にそれを行ってもらうことが普通なのではないかと思います。(そうしないと非常に難しいです。)仲介者というのは色々な会社があって、どれを選べばいいのかというのが良くわかりません。
     
    有名なものをあげると、
    • AdMob
    • nend
    • appC cloud
    • i-mobile
    • AMoAd
    • GAMEFEAT
    などです。

    私が使ったことがあるのはAdMob、nend、appC cloudです。これらのものの使用料は無料です。おそらく他のものもそうでしょう。
    使ってみて気に入らなければ、違うサービスを使うというようなやり方でも良いと思います。

    個人的に気に入っているのはnendです。 出せる広告はバナー、アイコン、インタースティシャル(全画面)で良く使われるタイプの広告です。動作が軽く、安定しているようなのが良いところだと思います。

    どのサービスも一長一短があります。目的にあったものを使うのが一番良いと思います。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity Adsを使う上で気をつけた方が良いことをまとめておきます。

    動画広告のためか通信速度が速くないと、広告の取得ができなくなります。 3G回線ではかなり厳しいかと思います。

    サンプルはあくまで最低限の実装であり、これで動くというものです。これだけのスクリプトで動画の広告が載せられるということは素晴らしいのですが、実用的にはもう少し厄介な問題を解決する必要があります。サンプルをそのまま使っても問題は起きません。ただ表示されないときの処理が単純すぎるだけです。

    実はAdvertisement.Initialize が重要です。初期化に失敗することがあり、このメソッドは一度しか呼ぶ意味がないようになっています。
    通信できない状況でAdvertisement.Initialize を呼ぶと100%失敗します。一度しか呼ぶ意味がないというのはメソッドの内部で呼び出したかどうかのフラグを見ており、一度目以外処理が行わないようになっているからです。
    つまり、Advertisement.Initialize を呼び出したときに通信がうまくいかないと、一度ゲームを終了させない限りUnity Adsは使えないということになります。
    このあたりのことはソースを見ていて発見したことでした。Unity AdsはUnityに完全に統合されているわけではないので、ソースコードが結構内部まで見れます。

    Advertisement.isInitialized をサンプルでは使っていません。使わなくても動くからですが、本来は使うべきものだと思います。
    このプロパティは初期化が成功していればtrueになるので、これを調べてfalseのときは広告を出す処理をしないとするべきです。falseのときは広告が出せることはないからです。

    Advertisement.isReady というものがあります。これは広告の準備ができたかを判定するためのものです。Unity Adsを使う場合は広告の表示がしたいわけであり、そのための準備を待ちたいと思うのは自然でしょう。そうするとAdvertisement.isReady がtrueになるまで待つような実装をしたいと思うかもしれません。しかし、それには十分な注意が必要なのです。
    Advertisement.isReady は内部でAdvertisement.isInitialized を見ています。初期化が失敗していた場合Advertisement.isReady は永遠にfalseになります。したがって以下のようなことが起きやすいと思います。
    Advertisement.isReady がtrueになるまで待つという実装をした場合、無限ループに突入する可能性があります。
     以上のことは非常に重要ですので、気をつけて実装しましょう。準備が終わる保証はないのです。
    サンプルが問題なく動くのは広告表示ができるかどうか関係なしに広告表示するようにしているためです。表示を試してみて失敗するか成功するかという実装です。

    Advertisement.isInitialized がtrueであったときだけAdvertisement.isReady の判定処理に行くというのが正しい実装だと思います。そうすればAdvertisement.isReady が絶対にfalseにしかならないということは防げます。
    またAdvertisement.isInitialized がtrueであったとしてもAdvertisement.isReady の判定を時間制限した方が無難だと思います。 時間判定に引っかかった場合は広告を表示させずに処理を終わらせます。



    Unity Adsはデフォルトで画面横向きの広告が流れるとき、ホームボタンを右側にして横向きに強制します。UntiyのPlayer Settingsで言うとLandscape Leftになっていないと、画面が回転してしまいました。Unity Adsの方の設定で変更できればいいのですが、今のところ見当たりません。 (縦方向というのはありました。自由な向きではないです)


     
    Advertisement.isReady とAdvertisement.Show はゾーンIDを指定しない場合は、管理サイト上で設定したデフォルトの広告を表示しているみたいです。(isReady については未検証です。)
    ゾーンIDを指定しなければ、管理サイトを使って自由に変えられるので、指定しない方が便利な気がします。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity AdsのSDKはアセットストアからダウンロードします。

    Unity AdsのSDKはC#で書かれているので、C#で実装するのが一番簡単です。基本的な実装の流れはドキュメントのサンプルに書いてある通りです。 このサンプルをシーンに存在するGameObjectにつけて、GameIDと呼ばれるゲームごとに固有なIDを設定するだけで動きます。GameIDはUnity Adsの管理サイトの登録済みゲームの一覧が見れる画面で見ることができます。(日本語の場合、ゲームIDと書いてあります)

    サンプルコードの重要な所だけ説明しておきます。

     Advertisement.isSupported がtrueでない場合は、iOS/Androidではないプラットフォームを選んでいるのでUnity Adsは動きません。これはtrueだったら処理を続けるというだけのことです。

    Advertisement.Initialize  が初期化を行います。呼び出し方はゲームIDを引数に渡して呼ぶだけです。ゲームIDを間違ってしまうと、得られた報酬が実は違うゲームのものだったということになりかねません。これは十分に注意して書く必要があります。

    サンプルのOnGUIでは、Advertisement.Show を呼び出しています。特に準備できたか関係なしに実行されていることがわかります。Advertisement.isReady() はボタンの表示を変えているだけです。
    Advertisement.Show を呼び出すと広告の表示をします。必ず成功するわけではありません。このメソッドの引数にラムダ式を渡していますが、それにAdvertisement.Show の実行結果を渡します。(渡されるタイミングはわかりませんがいずれ渡されるのは確実のようです。)失敗、広告がスキップされた、広告が最後まで見られたの3通りの結果があります。サンプルでは結果をログに出しているだけですが、この引数によって処理を変えれば広告を見たときだけリワードを渡すといったことができます。

    大雑把に言うと、Advertisement.Initialize を行った後にAdvertisement.Show を呼べば広告が表示されます。広告が表示できないこともありますが、Advertisement.Show を呼んだときに処理がうまくいっていれば広告が出ます。その2つだけで実装は可能です。

    サンプルの説明は以上です。
    一応使えるものですが、実用には向かないと思います。なぜなら通信が遅いときや通信が失敗したときのことを考えられていないように思うからです。
    サンプルのままだと広告再生をしても失敗するということが多く起こると思われます。これについては今度説明したいと思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity Adsをゲームに組み込むには2段階あると思います。
    一つは管理サイト上で行う情報の登録でもう一つは実際にプログラミングをしてSDKを組み込むことです。
    今回は管理サイト上でUnity Adsを利用したいゲームの登録の手順をまとめておこうと思います。プログラミングをすることについては次回説明する予定です。

    管理用のサイトでゲームごとに情報を登録する必要があります。 とりあえず登録だけ済ませれば実装して確認できますので、それだけ行います。

    1. Unity Adsにログイン後、画面左のメニューからゲームを選びます。 既に登録されているゲームの情報が見れるのと新しくゲームを登録することができます。
    2. 画面の上部に「+新しいゲームを追加」というボタンがあるので、それを押します。
    3. 「ステップ1 - OSを選択してください。」と表示されるので、iOSかAndroidを選びます。
    4. 「ステップ2 - ANDROIDゲームを追加。」と表示されるので、Google Playに公開しているならそのURLを入力します。公開していないアプリの場合は、下の方に表示されているこちらからゲームを登録となっているところを押して名前の入力だけします。
    5. 「ステップ3 - ゲーム情報の確認」と表示されるので、質問に答えます。
    最後の質問がわかりづらいので補足しておきます。
    下のような画面の質問なのですが、全世界、全年齢向けのゲームとかなら、「このゲームは13才未満の児童を対象にしています。」を選べば良いでしょう。アメリカの法律に関係するようでフォーラムにも載っています。

    uad-gamereg-q
     
    以上の手順で「登録済みゲーム」の 一覧に新しく設定したゲームが追加されています。設定をいじることもできますが、既に2種類の広告を表示できるように設定されています。デフォルトになっているスキップできるタイプの広告と 報酬をあげるスキップできないタイプの広告です。
    あとで設定できるので、実装してからでも十分間に合います。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity AdsとはUnityの提供する広告システムのことです。
    広告の掲載場所の提供で収益を得ることができます。また広告掲載を依頼することでユーザーを獲得し、費用を払うということもできます。Unity Ads はゲームに特化した動画広告を配信するものなので、他の広告と違いゲームに組み込むのに適しています。

    Unity Ads の使い方を一度に解説するには長すぎるので、手順を何回かに分けて説明することにしようと思います。まずはUnity Adsを使うために登録をしなければなりません。今回はその手順について説明します。

    Unity Adsのサイトに行き、画面右上のログインもしくはサインインで登録ができます。画面右上はこんな感じです。

    uad-topright
     
    サインアップでも登録できると思いますが、Unity Accountを使いたいので、ログインの方から登録をしました。
    Unity Adsではメールアドレスと登録情報が重要みたいなので、Unity Accountを使う必要はありません。Unityで作ったもの以外でも使えるため、そのようになっているのだと思われます。
    比べてないのでわかりませんが、Unity Accountを使っての登録のメリットはログインがUnity Accountだけで楽というだけな気がします。 どちらでも機能は同じでしょうから、お好みの方法でどうぞ。

    Unity Accountを使った登録について説明していきます。
    ログインを押すと、次の画面が出てきます。
    UDNというのがUnity Accountのことであり、ログイン画面で登録とログインを兼ねています。サインアップではないので注意してください。

    uad-login
     
    ボタンを押すと、Unity アカウントのログイン画面になりますのでログインをしてください。
    ログイン後にUnity Adsの登録画面が開きます。下のような画面ですので、全ての欄を埋めてください。
    個人開発者であれば、会社名は自分の名前か開発者名(本名でない)を登録すれば良いです。

    以上が終われば、管理画面に入れます。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    無料アプリでお金を稼ぐには広告が良い方法だと思います
    調べてみると、いくつかの方法があることが分かります。

    CPM:広告を1000回表示したときのコスト
    CPC:広告を1回クリックしたときのコスト
    CPI:広告をクリックし、飛ばされたリンク先でアプリダウンロードし、それをインストールさせたときの1回のコスト

    どれもコストとなっているため、広告を出す側の費用として考えているようです。
    広告を載せる側は逆にコスト分だけ報酬を受け取ることになります。

    上から順に見ていくと、下に行くほど条件を満たすのが難しくなります。
    当然、難しい方がコストは大きいです。

    CPM型の広告は新聞やテレビなどが代表的なものです。アプリとかサイトに掲載する広告はCPC型かCPI型がほとんどだと思います。
    CPC型とCPI型の組み合わせがアプリだとちょうど良いのではないかと思います。どちらも入れてみてパフォーマンスを測り、どちらに力を入れるべきか決めていくことができるからです。

    このページのトップヘ