FreelyApps

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


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

    タグ:Android

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Google Playの色々な説明はこのリンクに載っています。

    Google Play デベロッパー コンソールの使い方が主な説明になります。アプリを開発した後にどのように公開すればいいかとか、アプリが満たすべき要件は何かとか、どれくらいアプリがインストールされているかといった統計情報の見方等が解説されています。
    一番最初のページには「Google Play デベロッパー アカウントへの登録」が説明されていて、AndroidのアプリをGoogle Play上で公開しようと思う人は必ず行うことが書いてあります。アカウントの作成に$25かかるといったことはここに書いてあるのです。



    アプリの内容について最も重要な規約は「Google Play デベロッパー プログラム ポリシー」というものです。多くのアプリが守れていなかったり、故意に破っているルールはほとんどこの規約に関することです。
    Androidアプリを作る上でこの規約を知らないということは非常に危険な状態です。この規約を違反していると、Googleはアカウントを停止させることができると明記されています。(重大な違反や違反を繰り返した場合と書いてありますがその判断はGoogleが行うのですから、これは大丈夫だろうといった判断は自己責任です。)アカウントが停止されれば、アプリを公開させることができなくなりますし、会社等がそのような状態に陥れば信用が傷つくことになるでしょう。アカウントが停止させられたときは永久に取り直すことができなくなります。詳細はここにあるので、確認してみてください。
    現状Google Play上のアプリで違反があるものが存在するというのは事実ですが、あくまで対処されていないというだけであり、いつアカウントを停止させられてもおかしくない状況なのです。アプリのポリシー違反を報告することが可能になっていて、やり方がここに載っています。一応説明すると、Google Playアプリで報告するアプリの詳細ページに行きます。ページの下の方にある「不適切なコンテンツを報告」という文字を押すと、何が問題かを選べるのでそれを選び報告することができます。

    開発者だけが規約を守らなければいけないかというとそんなことはありません。ユーザーも規約を守る必要があります。コメント欄に酷い言葉遣いのものが載っていることがありますが、攻撃的な表現は禁止されています。 こういったコメントに対して「スパム」として報告することができます。どのような効果があるかはわかりませんが、投稿したユーザーのGoogleアカウントが停止させられるのかもしれません。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    WWWクラスを使うとWebサーバーと通信して、データを取得できます。
    適当なサーバーに画像や音楽を置いておき、WWWを使ってそのURLにアクセスします。そうすると画像や音楽をダウンロードし、それをゲーム内で使うということができます。
    Unityで用意されているアセットバンドルという仕組みを使うとさらにWWWの用途は広がります。アセットバンドルはシーンやプレハブなどのUnityで使えるアセットを配信することができる仕組みのことです。Google PlayやAppStoreで配信されたときは数十MBであったアプリが、数百MBにも大きくなっていく場合はこれを使っているのでしょう。
    WWWを使ってサーバーとのやり取りもすることができます。HTTPでの通信をしているので、色々と使うことができるわけです。

    AndroidとiOSでもこの機能が使えます。AndroidとiOSではOSの機能を使っているようでキャッシュという問題が発生します。
    キャッシュはサーバーにいちいち問い合わせて通信する手間を省くために本体に一時的に保存されているデータです。同じURLでのリクエストはまずキャッシュがあるかを調べ、なければ通信を行います。キャッシュがある場合はそれをリクエストの結果として返します。この仕組みがあるためキャッシュが残っている間、同じURLでのリクエストは更新されません。
    対策としてはURLを変えるしかありません。URLのクエリパラメータに意味のないパラメータを追加し、その値を毎回変更すれば良いです。

    アクセスしたいURLがhttp://test/であったら、http://test/?nonsense=ランダムな値
    とかにすればいいのです。nonsenseというパラメータの名前にしましたが、これはサーバーが処理しないパラメータならば何でも構いません。パラメータの値が毎回変わればURL全体として、毎回変わることになります。URLが違えばキャッシュは使われないので、毎回通信して最新のデータを取得することができるようになります。

    WWWがキャッシュされるのを防ぐ」 という記事が日本語ヘルプデスクに挙がっています。この問題は発覚しにくいものであり、何がまずいのかもわかりにくいものです。WWWを使ってなんだか更新が行われないというときはキャッシュによって更新がすぐに行われていないかもしれないということを知っておくべきです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    この記事を検証したときのUnityのバージョンは5.1.2f1 Personalです。

    プロジェクトには何もいれずもっとも小さいアプリを作ってみます。
    デフォルトではヒエラルキーにはライトとカメラがあります。
    defhie
     
    これだけがシーンに存在するアプリをビルドしたときにapkのサイズはどうなるでしょうか?
    作ったファイルのプロパティを見てみると以下のようになっていました。約18MBです。何も入れていないのにも関わらず結構大きな容量をとっています。
     size

    上記のアプリではPlayer SettingsでDevice Filterという項目をFATにしていました。つまり、x86の端末向けのファイルまで含まれています。大抵の端末には関係ないので、ARM v7という設定にした方がアプリの容量が減ります。
    nox86

    ARM v7向けの設定にすると以下のように約10MB程になりました。
    nox86-size



    完成したapkの拡張子をzipにして展開してみます。 FAT(ARM v7 + x86)とARM v7のみの2つのapkに対して試してみます。
     
    まずFATの方は何がファイルサイズの大きなところを占めているかというと、以下の通りです。
    名前からわかるようにUnityのライブラリとMonoのライブラリが大きな容量を占めています。lib/x86とlib/armeabi-v7aにこれらのファイルが含まれているので、FATの方はx86用のライブラリの分大きくなっていると言えます。
    size-unzip


    ARM v7に設定した場合は次の通りです。
    x86用のライブラリがなくなるので、libunity.soとlibmono.soはひとつずつです。
    nox86-unzip
     
    これらのファイル容量を足すとapkのサイズを超えますが、apkは圧縮されたファイルなのでそうなります。 

    アプリの容量のほとんどがUnityのライブラリによって占められているという結果になりました。 x86端末のために出すアプリだったら別ですが、基本的にPlayer SettingsのDevice FilterをARM v7に設定しておく方が良いようです。
    Unityの機能が減るということはないので、ライブラリの容量は将来さらに増えるでしょう。使っていない機能は除外してビルドするといった機能が実装されると良いのですが、このあたりはスマホの進化によっても必要かどうかはわからないところです。通信速度が速くなり、ストア上のアプリの容量制限もなくなってくればあまり気にする必要がないからです。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    以前のビルド環境整備が終わっていれば、すぐにでもアプリを作りたいと思うでしょう。

    ビルドを行う前に適当なプロジェクトを用意する必要があります。どのようなものを使うのかは自由ですが、最低限必要なものがいくつかあります。 
    ビルドして端末でアプリを動かすことを今回の目標とするので、以下で用意するプロジェクトの中身は最低限のものにしています。

    新しくプロジェクトを作りましょう。作ったばかりのプロジェクトUnityで開くと、ヒエラルキーには次のように2つのゲームオブジェクトが存在しているはずです。適当に何かを配置しても構いませんが、最低限なのであればこれをそのまま保存してシーンを作成します。
    FileメニューのSave Sceneを押してシーンとして現在のヒエラルキーを保存してください。
    defhie

    上でのシーンをmainと名付けた結果、プロジェクトビューは以下のようになります。mainシーンだけが存在しています。このmainというシーンファイルにヒエラルキーにおいたゲームオブジェクトの情報などが含まれています。
    leastpro

    ゲーム自体の編集は以上です。本来であればシーンにいろいろなものを置いたり、スクリプトを書いてゲームの挙動を決めますがビルドには必須ではありません。
    FileメニューBuild Settings...を押して以下のウィンドウでビルドに含めるシーンと対象プラットフォーム(ここではAndroid)を決めます。
    プロジェクトビューにあるmainシーンをドラッグアンドドロップでScenes In Buildと書いてある領域に置くか、mainシーンを開いた状態で右下のAdd Currentを押してビルドするシーンにmainシーンを含めます。複数追加してしまった場合はDeleteキーで削除して、画像のようにひとつにしてください。
    左下のPlatformはAndroidを選択します。プロジェクトのデフォルト設定だとPCに設定されているので、Androidの項目を選びSwitch Platformというボタンを押してください。プロジェクトに含まれるリソースをプラットフォームに適した状態にコンバートされます。ほとんど何も入れていないプロジェクトの場合、変換はすぐに終わり画像のようにAndroidを選択した状態になります。
    bse

    最後にPlayerSettingsの設定をします。Build Settingsウィンドウの下部のPlayer Settings...ボタンを押すかEditメニューのProject Settings->Playerを押してPlayerSettingsを開きます。
    Androidのマーク(ドロイド君)を押して、Android用の設定を行います。Other SettingsのBundle Identifierははじめ「com.Company.ProductName」になっています。これを適当な文字列に変更しないとビルドが失敗します。とりあえずここでは「com.test.app」としてビルドを行いました。
    Bundle Identifierはアプリの固有の識別子です。他のアプリと同じであることは許されません。
    ps

    Android端末をつなぎ、Build And Runを押せば自動でアプリがインストールされ実行できます。Android端末は開発者向け(USBデバッグの有効化、USBからのアプリのインストールの許可など)の設定にし、PCにはドライバを入れる必要があったと思います。

    無事実行できたら、端末に「New Unity Project」という名前のアプリがインストールされています。 実行結果は次のような画像になるはずです。
    ss

    カメラがあるだけなので、何もなく空だけがあるような画面になります。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityを使ってAndroidアプリを作ることができます。公式ブログに記事があるのですが、2013年5月末にAndroid/iOSへのビルドが無償化されました。
    もちろん現在のUnity5においてもPersonal版(無償版)でAndroid/iOSアプリの出力が可能です。

    Androidアプリの作り方は、設定を一度行ってしまえば、その後は決まった作業をするだけなので簡単です。ただこの設定が曲者なのです。今回は設定についてのみ説明します。ビルドそのもののやり方については後ほど記事にしようと思います。

    必要なものは3つあります。
    • Unity
    • Android SDK
    • JDK
    が必要です。上位にあるものが下位にあるものを必要としています。UnityでAndroidアプリを作成するにはAndroid SDKが必要であり、Android SDKを動かすにはJDKが必要です。Unityはビルド時だけAndroid SDKを必要とするので、先にUnityだけインストールされている状態でも問題なく始められます。いずれかのインストールが住んでいる場合は以下手順の対応項目の部分を行わずに次に進んでいってください。
    Android SDKを使うにはJDKが必要なので、JDKをインストールしその次にAndroid SDKを入れるというのが良いと思います。

    JDKのインストール
    JDKはこちらのページからダウンロードしてインストールします。
    jdk

    上の画像の赤い枠で囲ったところがJDKのインストールページになります。クリックして次のページに進んでください。

    jsedk

    進んだ先のページにどのOS向けのJDKが必要かを選択するところがあります。Java SE Development Kitと表示されているところを見つけてください。8u45というのはバージョンのことだと思います。
    ライセンスに同意するチェックをしたら、自分のPCに合うバージョンを選択してインストーラをダウンロードします。ダウンロード後はインストーラの指示に従ってインストールを行ってください。

    Android SDKのインストールとセットアップ
    Android SDKはこちらのページからダウンロードしてインストールします。
    Android StudioというIDEに付属しているものを使っても良いし、SDK単体のものを使用してもかまいません。いずれにしろAndroid SDKが使えれば問題ありません。
    インストールが終わったらインストールしたフォルダに行き、SDK Manager.exeを実行してください。

    asdk

    ToolsといずれかのOSバージョンのAndroidをチェックしてインストールをしてください。非常に長い時間がかかります。(~1時間程度)
    Android SDKの設定については公式マニュアルでも解説されているのでリンクを貼っておきます。

    Unityの設定をする
    最後にUnityが必要です。Unityのインストールを行ってください。 インストール方法がわからない場合は以前やり方を記事にしていますのでそちらを参照してください。
    Unityを開いたら、メニューからEdit->Preferencesを選びます。ウィンドウが開くので、External Toolsタブを押します。

    asdkpath

     Android SDK LocationとJDK Locationに正しいパスを設定することでAndroid向けのビルドの準備は完了です。Android SDKのあるフォルダには次のようなフォルダが含まれていると思います。
    asdk
     
    JDKのあるフォルダはC:\Program Files\Javaの下にあるのが一般的だと思います。「jdkバージョン名」というフォルダがあるはずです。

    以上でビルドの環境整備ができました。結構面倒ではじめてUnityを触る人が準備するのは大変だと思います。

    ビルドについての説明は「Androidアプリのビルド」をご参照ください。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity4ではモバイル版のAudioClipの圧縮はMP3で行われるようになっていました。MP3はライセンス的に厳しいです。ここに具体例が挙がっていますが、ゲームで5000本以上配布したら$2500という料金というものです。タイトルごとということなので、1作ごとに約30万円程度の利益がでないと赤字です。

    Unity5ではモバイル版のAudioClipの圧縮がOgg Vorbisに変わっています。すべてのプラットフォームでOgg Vorbisがデフォルトになったようです。

    公式の解説はまだ更新が遅れているようで、Unity4のときの解説が残っています。いずれ更新されると思います。
    以下は2015/6/25時点でスクリーンショットを撮ったものです。一番下のPlatform specific detailsという項目があり、モバイルの音データの圧縮はMP3になると書いてあります。

    audioclip-miss

    ライセンス料が発生すると困る場合もあるでしょう。私も困る一人です。
    気になったのでUnityに問い合わせたところ問題なかったということでした。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    DDMS(Dalvik Debug Monitor Server) を使うとログが見れます。
    端末での実行時に起こったことが見れるので、特にエラーが出ていないかを調べるときに重宝します。

    Android SDK をインストールしてSDK Manager からいくつかのツールが落とせますが、その中の一つです。たぶんAndroid SDK Tools を入れておけばDDMS が使えたと思います。

    Android SDK をインストールしたフォルダにtools というフォルダがあるはずです。その中のddms.bat をダブルクリックで実行するとDDMS が起動します。端末をUSBケーブルでつながないと情報は見れませんので、それだけ注意してください。

    実行画面は次のような見た目です。

    ddms-window
     

      このエントリーをはてなブックマークに追加 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
    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
    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ケーブルもつけっぱなしにしておいてください。

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

    このページのトップヘ