FreelyApps

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


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

    2015年05月

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityを使ったAndroid向けのアプリを解説することは、Unityを使ったiOS向けのアプリを作っている人にも役に立つはずです。Unityを使ったというところがポイントです。

    UnityはiOS/Androidのどちらのアプリを作ることができます。しかもそれが同じソース(プログラム)で動きます。プラットフォーム固有の部分は定義をして分岐させる必要がありますが、それを除けばすべてが同じコードです。ゲームエンジンを使ってれば当り前に感じますが、これは重要なことです。 
    iOSもしくはAndroidのどちらかのみのアプリを開発している人でも開発環境さえ整えば、すぐにもう一方のアプリを作ることができることになります。

    このことが最初に述べたUnityを使ったAndroid向けアプリの解説がiOSの場合にも役に立つということに関係します。Unityを使ったiOS向けアプリを作っている人は、Macを所有していることでしょう。MacではAndroidの開発環境を整えることができます。そのためiOS向けアプリを作っている人はAndroidアプリを作ることもできます。
    作る環境が整えられるので、Unityを使ったiOS向けに作ったアプリをそのままAndroid用にビルドしてAndroidで検証するということができます。

    私の場合はWindowsで開発しているので、Androidしか作れません。そのためAndroidの解説を記事にしているわけですが、MacユーザーであればAndroidの解説も役立てることができるということになります。iOSの記事はMacユーザーにしか役立てないことになりますが、それは正しいです。

    正しいからといって役に立つ人数が少ないかというわけではありません。日本でのiPhoneの普及率を考えればむしろ人数は多いかもしれません。
    なぜこのようなことを書いたのかと言えばiOSで開発している人にも記事を見てもらいたいというだけのことです。UnityでiOS向けのアプリを作っている人はAndroidで試すことができるので、そういった使い方もあったと覚えておくと何かに役立つかもしれません。



    Macが買える(MacとiOS端末)だけの収益があがったら、iOS版にも着手します。そのときはiOSだけの記事を書くと思います。  

      このエントリーをはてなブックマークに追加 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
    Androidの端末の画面をキャプチャーする方法がいくつかあります。Android 4.4以上では端末をPCにつないでコマンドを実行すると、Androidの画面をmp4形式の動画で保存することができます。

    Android 4.4以上の端末をPCにUSBケーブルで接続します。USBデバッグを有効にしておく必要があります。
    Android開発用のSDKを入れていれば、ADBがインストール済みなはずです。

    コマンドプロンプトを開き、
    adb shell
    を実行します。これで端末の操作が可能になります。(イメージで言うと端末に入っていろいろいじれる感じでしょうか。実際は入ってませんが)
     
    screenrecord ファイル名
    を実行すると端末の画面のキャプチャーが開始されます。 録画開始後にCtrl + Cを押すか180秒過ぎれば終了になるようです。

    screenrecord
     上の画面はscreenrecord --helpを実行した画面です。コマンドの内容について説明されています。
    詳しい説明はここに載っているので、一度は目を通した方が良いと思います。

    screenrecordの出力先フォルダにファイルの書き込み権限がないとコマンドの実行に失敗します。
    /sdcardの下であれば、問題なくファイルが作れるかと思います。
    例としては、
    adb shell
    screenrecord /sdcard/test.mp4
    と実行すると、/sdcardにtest.mp4というファイルができているはずです。lsコマンドを使えば/sdcardにtest.mp4が追加されているのが見て取れます。ファイルが必要なくなったらrmコマンドで消しておきましょう。

    これで動画の撮影は完了しました。できたファイルをPCに転送してやれば、動画ファイルとして色々扱えます。
    adb shellを終了させ、adb pullコマンドを使ってファイルを転送します。
    先ほどの保存場所だと、
    adb pull /sdcard/test.mp4
    とすれば、カレントディレクトリにファイルのコピーが作られます。 移動ではなくコピーなので、端末にはファイルが残っています。容量が十分にない場合は端末からファイルを消しておく方が良いです。

    ファイルマネージャーアプリでファイルの読み取りができるなら、mp4を作った後それでファイルをPCに持って行った方が簡単です。Android 4.4ではできなかったと思うので、私はadbを利用しています。 


    Android端末の画面を回転させてしまうとキャプチャーはうまくいきません。
    横x縦と決まった大きさの画面を録画しているため、回転すると画面が見切れてしまいます。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityをインストールして起動するとき、ライセンスの確認があります。そのときにUnityのアカウントを作って登録します。Unity Account(Unity アカウント)というのはそのことです。Asset Storeからアセットをダウンロードするときにも必要になります。

     このアカウントを作るとUnityのサービスにも使えます。(Unityのアカウントだから当然と感じますが、サービスの提供がもともと別の企業だったりするので、まだ統合の途中という印象があります。)
    • Unity Ads
    • Unity Analytics 
    • Unity Cloud Build
    • Everyplay
    がサービスとして用意されています。上から広告、分析、ビルドのクラウド化、プレイ動画シェアといった内容の機能です。
    Unity AdsとEveryplayはもともと別の会社が作ったものです。このあたりの話はこの記事に載っています。そのため、開発者のアカウントがUnityのアカウント以外でも登録が可能です。そのためか登録時にどちらにすればいいのか迷ってしまいました。
    Unity Ads、Unity Analytics、Everyplayについては実装しようと考えているので、完了したら記事にしたいと思います。今回はUnity Accountの作り方だけ備忘録として残しておきます。

    Unityをインストールしているのであれば、そのときに使ったアカウントを Webページで作るという手順を説明するだけなので、特に読まなくても問題ありません。

    このURLのページに行くとアカウントの作成かログインができます。以下のような画面です。

    NameとUsenameを設定します。Nameは本名でもかまいませんが、コミュニティ等で表示される公になるものなのでハンドルネーム的なものが良いかと思います。UsernameはIDみたいなもので既存のものと重複が許されません。適当で問題ないみたいです。
    name

    Usernameから下の画面は以下のようになります。
    Emailは自分の持っているアドレスなら何でもいいと思います。ここにメールが届くので、使い捨てメールはやめた方が良いと思います。CountryはJapanでしょうかね。(出身国とか居住国とか書いてないので、なんでも良さそう)
    Passwordは自分の管理できるものであれば何でもいいです。Confirm passwordでPasswordの確認を行うようです。同じものを入力してください。
    Security questionは人間かどうかの判定だと思われます。簡単な計算問題を解答しましょう。

    最後に「I agree to the Unity Terms of Use and Privacy Policy」をチェックして規約と個人情報の利用方針に同意したとします。
    「Get Unity news, discounts and more!」はチェックを外した方が良いと思います。(英語の記事が来ても読まないと思います。必要になったらそのときに考えましょう。)
    Create accountボタンを押して、メールが来るのを待ちます。メールにリンクが貼ってあるのでそれをクリックして登録完了になります。

     pass
    【Unity Accountの登録】の続きを読む

      このエントリーをはてなブックマークに追加 Clip to Evernote
    FC2ブログからlivedoor Blogへデータの転送が終わりました。
    やることはFC2ブログ上でブログ記事のテキストファイルへの書き出しとlivedoor Blog上でそのファイルを取り込むことです。
    やってみれば30分もかからずに終わる簡単なものです。有名なブログ間での引っ越しは自動で行われるようになっていてとても便利でした。

     以前の記事の全てを一気に公開できる状態になっているというわけではありません。
    リンクが変わってしまったので、それに対応してリンクを変えるところもあります。また古いブログにしか関係ない内容の記事については消すかどうかの判断が必要です。一つずつ見返して、多少の修正を入れたのち公開にしようと思います。
    基本的に日時はそのままにするので、古い記事ほど後ろに出るかと思います。

    移転する上で気をつけることは、新しいブログと古いブログの両方に同じ記事が出ていることを避ける必要があるということです。 検索エンジンの方で重複するコンテンツと認識されてしまうからです。そうなると検索に引っかからなくなることがあります。

    こちらに古い記事を追加し、 古い方で対応する記事を消していくという作業を現在行っています。
    そうすれば問題なく移行できます。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ブログを引っ越しました。
    今後はこちらのブログを更新していきますので、お気に入り等に登録されている場合は更新をお願いします。

    古いブログの方に関しては更新をしなくなります。
    徐々に記事をこちらのブログに移していき、古い方からは削除していく予定です。
    最終的には古いブログ自体を消すつもりです。

    まだ完全に移行しきれていないですが、改善していきます。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    FPSの計測を自前で書くことはいろいろなメリットがあります。
    アプリをインストールするだけでFPSを測れることになると、チェックに必要なものが端末だけになるので 便利です。

    UnityにはProfilerというパフォーマンスを計測するための機能があります。実はこれを使うと端末で実行中のゲームのパフォーマンスが測れます。
    Android以外の場合も計測できますが、ここではAndroidだけ説明します。

    ゲームをビルドするときにデバッグできるように設定します。
    Build Settingsを開いたときに以下のようにDevelopment Buildを選択します。
    すぐに計測したい場合はAutoconnect Profilerも選択します。(ゲームのインストールが終わると自動でProfilerを開くようになります)

    bs

    Build And Runを押してビルドと端末へのインストールを行います。
    端末でゲームが起動したら、Unity側でProfilerを開きます。Profilerの上部メニューのActive Profilerを押して計測したい端末を選択します。ここでは3番目に出ているNexus 7を選択します。(私の場合です)

    prof

    選択後計測がリアルタイムで行われていきます。Wi-Fiでつないでいるようなので、Unityから認識されてからはUSBケーブルを外しても大丈夫でした。 

    確実に使うためにはBuild SettingsでDevelopment BuildとAutoconnect Profileを選択し、Build And Runを行うのが良いです。自動で計測開始してくれるのでミスが起こらないと思います。USBケーブルもつけっぱなしにしておいてください。

    公式ページにも情報がありますので参照ください。 

    このページのトップヘ