FreelyApps

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


    アプリ『トランプ・7並べ』を公開しました。
    Android/iOS https://goo.gl/zsFces

    2015年08月

      このエントリーをはてなブックマークに追加 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
    音楽ファイルはフリー素材を使うことがあるのですが、ゲームに使う上で困ったことがありました。それは先頭部部分に入っていた無音です。

    mp3やwavといった音楽ファイルの先頭に無音の部分が入っていることがあります。作る都合上発生するのか、何らかの理由があってそうなっているのかわかりませんが、そのようなものが存在します。

    この無音部分はゲームで使う上で面倒です。ボタンを押したときのSEなどレスポンスが要求されるUIにおいて頭に無音があるSEを流してしまうと、反応が悪く感じられます。少し遅れて再生されるような印象なので、ずれていて一度気になると気持ち悪いものです。

    下のように左端から少しの間無音になっていのがわかります。
    ほんの0.1秒くらいですが、再生するとわずかに遅れる感じがします。

    nosound

    Unity Editor上の画面でも無音部分があることを確認できます。
    調べたい音声ファイルを選び、インスペクタ―の下の方にあるプレビュー画面を見ると波形が表示されています。左側の方を良く見ると、波形が一直線上になっていて無音であることがわかります。
    pre-nosou

    解決方法は2通りあります。
    素材を加工して無音部分を削除する方法とプログラムで再生開始位置をずらす方法です。

    素材を加工するにはその素材が加工しても良くなくてはいけません。フリー素材といっても商用利用が可能なのか作者の情報を載せることが必要なのかといった利用規約についてはそれぞれ異なるため、必ず確認しましょう。加工可能と明記していない素材である場合は、作者に連絡するか使わないのが賢明です。

    素材が加工して良ければ、Audacityというフリーのツールを使って無音の場所を消します。Audacityは色々なファイル形式に対応しているのですが、MP3、WAV、Ogg Vorbisに対応しているのが非常に使いやすいです。
    どのような音楽ファイル編集ソフトでも大抵切り取りは入っているようなので別の編集ソフトを使っても同じ作業はできます。

    編集作業は先頭部分の無音と思われるところを選択して、削除するだけです。Audacityでの編集操作をgifでキャプチャーしたので下の動画を見れば操作がわかると思います。
    無音の領域を消した後に「オーディオの書き出し」というコマンドを選び、保存することで修正を行った音楽ファイルが得られます。

    pre-nosou


    もうひとつの解決方法のプログラムでやる場合は、マニュアルに載っているようにAudioSource.timeに再生場所をセットした状態でAudioSource.Playを呼びます。こうすると自由に再生位置を変えられるため、素材を変更しなくても無音を飛ばして再生することができます。 
    私の場合はSEの再生にAudioSource.PlayOneShotを使っていたので、AudioSource.timeを変更しても再生位置を変えることができませんでした。おそらくはAudioSource.Playだけが設定を反映されるのでしょう。

    プログラムで無音をなくす方法はお勧めしません。調整が非常に難しく時間がかかってしまいます。リソースを編集する方法は専用のツールということもあり、意外と簡単に精度良く加工できます。

      このエントリーをはてなブックマークに追加 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のプログラミングはC#を使うのが一般的です。CやC++をやってきた人であればグローバルな#defineが使えないかと思うことでしょう。
    C#には#defineディレクティブがあります。ファイルに定義するものなので、他のファイルでこれを参照することができません。CやC++にある#includeディレクティブがC#にはないので、定義はファイルごとにしていかなければなりません。(C#で使えるプリプロセッサディレクティブはここにあるものです。)

    グローバルな#defineを行うには、Unity Editorにシンボル(文字列)を登録することで可能です。 

    Player Settings->Other Settings->Configurationのところに以下のようにScripting Define Symbolsという枠があります。各プラットフォームごとにありますので、定義を有効にしたいプラットフォームを選択してScripting Define Symbolsに設定を行ってください。
    定義の仕方は、
    TEST;TEST2;TEST3
    というようにセミコロンで各定義を区切って入力してください。
    scrdef
     
    Unityのマニュアルではこのページの下部に「プラットフォームのカスタム定義」と「グローバルのカスタム定義」という内容が書いてあります。上で説明したのは「プラットフォームのカスタム定義」になります。
    「グローバルのカスタム定義」は専用の定義ファイルを用意するので、使っていると結構面倒です。複数のプラットフォームで同じ定義をしたいときにこれを使います。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    livedoor Blogではアクセス数に応じてブログのレベル分けということを行っています。レベル別のランキングを行い、どのブログを見に行こうかを決めるのに役立つのかもしれません。

    ブログの管理画面に星のマークがあり、これがレベルを表しているようです。2つありますので、レベルが1から2に上がりました。
    brank2

    このところアクセス数が50PV程度を維持しているおかげだと思います。
    24時間で考えれば1時間にふたりくらい来ていることになります。誰も来なかったころに比べると結構来てくれているという感覚なのですが、星の数は5つまであるのでまだまだということなのでしょう。

    目標は大きい方が良いので、このブログは5つ星を目指します。アプリも100万DLとか達成していきたいところです。 

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

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

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

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

      このエントリーをはてなブックマークに追加 Clip to Evernote
    C#でスクリプトを書くときは通常クラスごとにファイルを一つ作るでしょう。公式の解説にもあるようにメニューからスクリプトを作り、名前が選択されているときにリネームするのが便利な作り方です。

    Assets->Create->C# Scriptと選べば、プロジェクトブラウザー上にNewBehaviourScriptというスクリプトが追加されます。以下のように追加したタイミングではファイル名が変更できるようになっています。この瞬間だけ名前を変えることで、ファイルの中身にある文字列も一緒に変わります。
    newscript

    うっかりEnterキーなどを押してNewBehaviourScriptのままになってしまった場合は、ファイルのリネームとクラスのリネームは別々に行えば問題ありません。意外と面倒なので、ファイルを消してやりなおした方がおそらく楽です。

    Test.csというファイル名に変更した場合は以下のようなスクリプトができます。

    classのところがTestになっていて、ファイル名と一致しています。 
    ファイル名とクラス名が一致しているとゲームオブジェクトにアタッチできるということが重要です。 なぜそうなのかというとUnityのルールだからです。(C#ではファイル名とクラス名が一致しなくても良いようです。)
    ゲームオブジェクトにアタッチするというのはスクリプトを簡単に呼び出すことができ、Unityでは以下のようにドラッグ&ドロップするだけです。


    GameObjectにTestというコンポーネントが新たに設定されているのがわかると思います。



    ファイル名とクラス名が一致しない場合どうなるかというと、アタッチできません。そのようなスクリプトにはインスペクタ―上に以下のような注意書きが載ります。MonoBehaviourを継承し、かつファイル名とクラス名が一致していないという注意です。これは問題ない場合もあります。(static classとかpartial classとか)

    nomono

    この注意書きが出ているスクリプトをアタッチしてみると、警告ダイアログが出ます。

    errdi

    警告にも書いてあるようにアタッチできないスクリプトということがわかりました。ただし、GUIではできないというのが今回の本題です。

    GUIでの操作は駄目でしたが、スクリプトから
    ファイル名とクラス名が一致しないスクリプトをアタッチすることができます。やり方はAddComponentを使うことです。 

    まずファイル名とクラス名が一致しないMonoBehaviourを継承したクラスを用意します。以下の例はファイル名がNotSame.csであり、クラス名がNotSameScriptというクラスだけのスクリプトです。

    このクラスをアタッチするために次のようなTest.csを用意しました。

    Testスクリプトにはゲームオブジェクトの参照が渡せます。渡した参照のゲームオブジェクトにNotSameScriptをアタッチすることになります。

    こうしてアタッチすると正しく動きます。StartとUpdateしか試していませんが、動いていました。

    fatt

    corratt

    上のように本来アタッチできないスクリプトをアタッチしたところ、アイコンが微妙に変わりました。下の図はアタッチできるTestスクリプトの場合です。コンポーネントの名前の左のアイコンとScriptという枠が違います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityを使う上で参考にする公式サイトについてまとめておこうと思います。公式サイト(英語版のリンクはこちら)のトップから行けるところは全て参考になりますが、ゲームを作っているときに良く見るのはスクリプトリファレンスやマニュアルだと思います。

    マニュアル(日本語版)
    Unityの持つ色々な機能を解説です。自分で機能を作るよりはここでまず使えそうな機能がないか調べた方が良いです。マニュアルを読めば読むほど楽をできるはずです。
    英語版の翻訳のようなので、できれば英語版の方を見た方が良いです。英語版の方が最新の内容になっていますし、日本語版の更新が遅れている場合、使える機能なのにそれが載っていないということがあります。
    Unity Editorのインスペクタ―から英語版のマニュアルに飛ぶことができます。以下の画像のようにコンポーネントごとに右上に本のようなアイコンが表示されているはずです。これをクリックすると対応する記事をブラウザで開いてくれます。
    component-helplink


    スクリプトリファレンス(日本語版)
    スクリプトの一覧です。色々なコンポーネントのスクリプトから制御できる項目を網羅しています。使おうとしているコンポーネントがわかっていて、それをスクリプトでどのようにいじれるかを調べるときに良く使います。
    英語版の翻訳のようなので、一部翻訳されず英語になっていることや最新でないことや不正確なことがあります。何かおかしいと感じたら、英語版のサイトで確認することをお勧めします。

    UNITY COMMUNITY
    英語のサイトですが、膨大な知識が得られます。いくつかのページにわかれているのでどのようなことを扱っているかだけ紹介しておきます。
    ページの下の方にあるUnify Script & Tips Wikiのリンクが便利だと思います。

    【FORUMS】
    各カテゴリーごとに小さなトピックがあり、解説や議論などが行われているところです。Unityの技術者による新しい機能の解説がされていることもあります。まだベータである機能とかの情報がここに載っています。

    【ANSWERS】
    質問をするところです。質問ごとにページができ、誰かがそれに返答していく形式です。質問の検索ができるのでキーワードを適当に入れて使うと知りたい情報が見つかるかもしれません。

    【FEEDBACK】
    Unityに対する機能の要望ページです。こういったものが欲しいとか改善してほしいことを投稿することができます。

    【ISSUE TRACKER】
    バグの報告ページです。

    日本語ヘルプデスク
    かなり最近にできたサイトです。質問もできるサイトのようですが、過去にされた質問とその解決方法についてまとめてあります。自分の抱えている問題と似たような問題が載っている場合は非常に参考になります。
    このサイトを参考にする必要があるのは中級者以上でしょう。あまり一般ではない問題を扱っている印象がありますし、内容によってはかなり高度なものも含まれます。



    UnityのメニューにHelpというものがあります。これをクリックすると以下のようにUnityの関連サイトを開くリンクが並んでいます。英語版のサイトに行きたいときはこれを利用するのも便利で良いと思います。
    links
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Q:コルーチンに渡すメソッドをIEnumeratorでないものにしたらどうなるのか?
    A:実はSendMessageみたいな動きをします。 


    コルーチンを開始するにはStartCoroutineを使って行うのが一般的だと思います。3種類のオーバーロードがあります。メソッドをそのまま渡すIEnumeratorを引数に取るもの、メソッド名を引数に渡すもの、メソッド名とそのメソッドに渡すパラメータを引数にするものです。
    • StartCoroutine(Func1());
    • StartCoroutine("Func2");
    • StartCoroutine("Func3", 3);
    上のように使い方が異なります。今回の記事で取り上げるのは2番目と3番目のメソッド名を渡してやる場合です。
    本来コルーチンはIEnumeratorを返すメソッドとして実装しなければなりません。StartCoroutineの第2、第3の形式では文字列の指定をするだけなので、IEnumeratorを返さないメソッドを指定することができてしまいます。
    正しい使い方ではないのですが、実はちゃんと機能するみたいです。(公式の説明はないが検証してみると問題がなかったという意味です。)
    引数に指定したメソッドの引数は0か1個でないと駄目ですが、引数に合わせた適切なパラメータを渡すようにしてやるとそのメソッドを単に呼び出すようになります。
    内部的に同じかはわかりませんが、SendMessageという機能と何ら変わらない使い方になります。(SendMessageのOptionがない場合と同等でした。)

    以下に検証したときのコードを載せておきます。この機能を使ってみようという人は、ソースをダウンロードするなり、コピーするなりして検証してみると良いと思います。


    へぇーという感じですが、まさしくそれだけです。

    このページのトップヘ