FreelyApps

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


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

    カテゴリ: 開発

      このエントリーをはてなブックマークに追加 Clip to Evernote
    私は会社員をやっているので、開発時間を長く取ることは難しいことです。平日は定時に退社したとしても18時30分程度にはなるので、そのあと開発しようとすると相当短いです。

    まず最も重要なことなのですが、残業をしません。 これを守らないと開発時間は全くと言っていいほどとれません。なので残業はしないものと決め、終わらなかった仕事は明日に回します。
    適当に仕事を終わらして、とっとと帰ることが大事です。(まあ終わらなくても帰れば良いんです。)決まった時間働いていれば解雇なんてできませんから、大した問題はありません。

    定時に退社して、18時30分には帰ります。おなかがすいているので、夕食をとらなければいけません。自分で作ると時間がかかるので、外食に行きます。夕食後には開発があるので、あまりにも待つものや胃が持たれるものは避けます。 
    夕食に1時間くらいかかるので、落ち着いてくるのは19時30分~20時くらいになります。そこからゲームを作り始めると、2時間くらいが限界です。2時間でも22時くらいになりますから、金曜日でなければ明日の準備があります。
    掃除やお風呂、そして就寝。できれば0時には寝ていたいので、やはり22時くらいまでが限度です。ゲーム開発だけするわけでもないので、このように時間がとれないことも普通です。

    2時間でできることは少ないです。アイコンを考え始めて作るだけでも終わらないかもしれません。作業は区切りが良いところで終えておかないと、次にやるときに大変になります。制限時間内に終わらすため、発想を要求されるような作業や長くかかると思われるものはやらないようにしています。そういったものは時間の取れる週末にやったほうが私は効率的だと思います。
    細かな作業ごとでどれくらいかかりそうかを予想してから行う癖はついたように思います。これによりやる前からやる気がなくなることもあります。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    アプリをAndroid/iOSで出そうとすると、Google PlayとApp Storeに置くことになります。このアプリへのリンクをSNSなどでシェアするというのは、宣伝にもなるのでよく行われています。

    アプリへのURLは以下のように
    https://play.google.com/store/apps/details?id=com.FreelyApps.Game.Trump.AmericanPageOne」 
    とても長くなります。 
    これをTwitterなどに載せてしまうと、かなり文字数を圧迫してしまいます。リンクをそのまま含めるとTwitterではその先のページの情報を載せてくれるようで利点もあります。しかしながら、文字数を使いすぎて本文が足りなくなってしまうし、 Android/iOSの両方のリンクを載せるのは相当厳しいです。(ほぼリンクだけになってしまうので。)

    Google URL ShortenerのようにURLを短くするサービスを使うと、なんとか載せることができるようになります。短くしたURLをAndroid/iOSの2つ分載せるというのが多いと思います。この方法は簡単ですが、あまりよくないと思います。リンク先の情報がわかりにくいこととユーザーがどちらかのリンクを選ぶ必要があるからです。

    AppStoreかGooglePlayに振り分けてリダイレクトする方法」 Sawalogより
    で紹介されているユーザーをあるHTMLファイルへ行かせ、そこのJavaScriptでリダイレクトさせるというのが良い方法だと思います。この方法であれば、リンクは一つになりユーザーが意識しなくても自分にあったページへと行くことができます。このHTMLファイルを置くところは公開されたサーバー上ならどこでも良いでしょうけど、その場所を用意することと、HTMLファイルを編集しなくてはならないことが少し欠点でしょうか。

    私の場合はリダイレクト用のHTMLファイルをこのブログのファイル置き場に置き、そのURLを短縮して使おうと考えています。ファイルを置き換えてもURLが変わらなければ問題ないので、途中でリダイレクト先を変えることも問題なさそうです。

    このURLはGoogle PlayとApp Storeへのリンクとして使う予定です。(この記事を書いているときはGoogle Playへしか行きませんが)

      このエントリーをはてなブックマークに追加 Clip to Evernote
    MacBook Proの購入予定」でMacBook Proを買うつもりだったのですが、新型がでるかもという噂だけがあり本当に今年に新しいものがでるのかわからない感じです。MacBook Proを買うことが目的ではないので、MacBookという機種を買うことにしました。MacBookは小さくてとても軽いようです。

     macbook
    本体の性能は2つ選べることがあって、モデルとCPUがそれぞれ2つから選べます。全部で4種類です。モデルというのはCPUとSSDの違いです。
    macbook-storage

    下はCPUをCore m7にするオプションで高い方のモデルを選んだ場合の選択肢です。148800円のモデルの場合はCore m7にするには30000円追加で必要です。
    macbook-cpu
    Core m7にするオプションの差額からモデルの金額の差の内訳を計算してみると、CPUの差の分が12000円だと思われます。よって、SSDの差の分は24000円となります。

    高いけれど性能が低いと嫌なので、最高の性能で注文することにしました。202800円でした。ノートパソコンの値段としてはかなり高いと思いますが、ブランドなのでそういうものでしょう。かっこいいパソコンだと思います。


    iOSアプリの開発が目的なので、ついでにiPod touchも買っておきました。Appleのページの上のタブにiPodがなくなっていてページ下部のリンクから行くようです。iPod touchには、あまり力を入れてないのかもしれませんね。
    ipod-link

    iPod touchはストレージの量だけ違い、4種類あります。(性能に関係ありませんが、色もいくつか選べます。)
    ipod

    MacBookとiPod touchで合計232600円でした。 
    MacBookはCPUの変更オプションがあるため1週間ほど後に来るようです。iPod touchは翌日に来るそうで早いですね。 

    Macを買うのは初めてなので、わくわくしています。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ゲームをした日ごとのデータを保存して、どのように変化しているかを表示しようと思っています。最終的にはグラフで勝率を出したいのですが、データの蓄積部分が必要です。

    日付と保存したいデータの組み合わせをクラスにして、それをリストで持てばやりたいことは可能そうでした。日ごとのデータクラスをDaily、それを保持するリストを持つクラスをLogとして話を続けましょう。
    Dailyクラスは日付として、年、月、日の3つを持っていても良いし、DateTime構造体を持っていても良いです。DateTime構造体は日付の計算を楽にしてくれるので、計算のために使います。年、月、日の3つのパラメータからDateTime構造体が作れるので、どちらで保持しても情報は同じです。Dailyクラスは例えばスコアといったゲームの情報も持たせます。この情報は1日ごとに集計するものになります。
    Logクラスの中にいくつものDailyが保持されているわけですが、日が進むにつれてDailyクラスは増えていきます。ゲームの開始からずっと保持していくとどれだけのデータが必要が決められないので、日数を区切って保存することにします。例えば30日分とかです。このように決めると、リストの要素は30が限界になります。 セーブする領域も30個のDailyクラスを保持できるようにしておけばいいです。(要素数が確定すると配列でも良いような気はします。Listを使う方が便利なので、Listを想定していますけど。)

    日が進むと要らないDailyデータがリストに現れます。それは現在時刻から判断して、30日以前のものはいらないということです。
    保持しているリストにあるDailyデータの日付と現在の日付の差をとって、何日間の差があるか調べればいいです。DateTime構造体同士の差を取ると、TimeSpan構造という間隔を表す構造体が得られます。この構造体はDaysで何日間の差があるか取得できるのでこれを使います。0であれば今日であり、正であれば未来になり、負の場合は過去です。今日を含めた過去30日分のデータを取るなら、0から-29までのデータを残します。
    このようにして必要な期間のデータをリストに残すことができます。このリストの更新は今日のデータがあるかLogクラスに問い合わせて、新しく今日のデータを追加するときにリストの更新をすると効率的だと思います。

    時間をごまかすチートの対策は記録程度では要らないですが、必要であればセーブに最終更新した日付を残しておけば良いです。この最終更新日時は常に過去であるはずなので、もし現在日時が最終更新日時よりも過去であったらチートしているということになります。
    サーバーとか外部のものが使えるのであれば、そこの時刻と端末の時刻が正しいかを判定すれば良いでしょう。何かセーブするときに時刻を調べておかしくないか判定すれば、不正はできないと思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    エイジングテストとは(発音的な問題でエージングとも呼ばれます)長時間製品を稼働させて動作に問題がないかをテストするものです。工業製品などでは耐久性を見るために行われていていたりします。

    ゲームの場合でもエイジングテストがあります。これは長時間ゲームを動かしっぱなしにして問題が起きないかを調べます。ある画面で何時間も放置するとゲームが停止するといったことが起きないか調べたり、自動でゲームを進行させるようにしてエラーが起きないかをチェックします。
    エイジングでは特に後者の自動でゲームプレイを行わせ、バグがないかの検査に使うことが役に立ちます。放っておくだけでゲームをPCが自動で遊んでくれると、自分で何回もテストするよりも何倍も効率的にテストが可能です。人間がやると飽きてしまうのでどうしてもテストの精度は悪くなっていきます。これが機械にやらせれば延々と正確にテストを繰り返してくれます。
    テスト結果を見るためにログに出力するようにしたり、ゲームの進行具合を確認すると良いです。 

    エイジングを行うためにはプログラムにそれ用のコードが必要になります。ただしこれらのコードは製品には不要なので、定義があるかないかでコードを抹消できるようにしておくのが重要です。ユーザーの入力が必要な時にプログラムで模倣するようにすれば良いのです。模倣といっても人間らしくする必要性はありません。可能な選択肢の中からランダムで選択するようにしておけば十分です。選択肢が多いならまだ行っていない選択を優先して選ぶというようにするのも有効です。要は可能な組み合わせを全て行えればテストとして十分なわけです。ランダムの場合は数を増やせば自動的に全ての可能性をテストできるため、意外と良い方法です。

    人間の入力がなくてもゲームが動くようになればテストが開始できます。 この時点でエイジングテストが可能な段階になりますが、いろいろな省略を実装するとより効率的にテストが行えます。動作のバグを見つけるといったときは演出関連の処理を省いたりすると短い時間でチェックが増やせます。

    以下の例はアニメーションを最低限にしているチェックです。 高速に対戦が行われているのが見て取れます。このテストではトランプゲームのルールが正しく作れているかと、AIが学習して強くなるかを試しています。
    対戦結果のUIの表示が一瞬されるため視覚的にもゲームの進行が行われているかなんとなく把握できます。

    エイジングテストは放っておいてもずっとテストをし続けてくれるということ重要です。ゲームを起動したままにしておくことができないといけないのですが、Unityのエディターは他のアプリを選択しているときには動作を停止してしまいます。つまりエイジングテスト中はUnity以外のプログラムをPCで操作することができなくなるのです。
    エイジングテスト中にはPCで他のことをしたかったりするので、これは困ったと思っていました。
    Unityのエディターを他のアプリを選択しているときでも動作しておく方法が、ハルシオンシステムの気ままBlog「【Unity】Unityが非アクティブでも動作を進めさせておく。 」にあったので試してみました。結果は期待通り、他のアプリケーションを操作しながら、Unityエディターを動かすことができました。

    Player SettingsのRun In Backgroundをチェックすればいいのですが、このチェック項目はPCやWeb Playerなどの共有設定です。Androidにはこの設定はないので、ビルドターゲットがAndroidでもいいのかと思っていましたが普通に裏で動いてくれました。本来このプロパティは実行プログラムが一時停止されないための設定だと思いますが、エディターの動作もこれで設定されているようでした。
    ps-rib

    実はこの記事を書いているときもエイジングテストを行いながらでした。何回も繰り返すとログにもエラーが出なくなり、それなりの品質になると思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityのビルドを行いAPKファイルを作ります。できたファイルのサイズが大きかった場合どうすればよいでしょうか?
    50MBを超えないようにするだけでなく、より小さいファイルになっている方がダウンロードが早く終わり好ましいです。APKに含まれるアセット(テクスチャ、サウンド、スクリプトなど)を小さくするということがAPKファイルを小さくすることにつながります。
    効果的なのは大きなアセットを削減することです。例えば1MBのテクスチャと1KBのサウンドがAPKに含まれている場合、前者を減らす方が効果があります。容量が1000倍違うので当たり前なんですが、PC上で見れるファイルサイズがAPK内でのファイルサイズと異なるためどのファイル(アセット)を削減すべきなのか調べるのはそれほど簡単ではありません。
    もちろん元々大きなファイルはAPK上でも大きいはずですが、どれくらいの割合を占めているかを知ることはできません。あくまでも元のファイルサイズは目安です。APK上でアセットがどの程度のファイルサイズなのかを知る方法は以下の通りです。(公式に発表されている方法ではなく、私が調べてみて実際に推測通りだと思われる方法になります。) 

    test.apkというようにAPKファイルができているとします。
    拡張子をzipに変えて、解凍します。解凍したら以下のようなフォルダ構成になっているかと思います。(Unityのバージョンによっては多少変わるかも知れません。)
    apkunzip

    assets以外のフォルダは削減することができないので、assets以下にあるリソースのうち容量の大きいものを探します。assets/bin/DataにRESOURCEファイルというものがあります。これはプロジェクトのResourcesフォルダ以下にあるアセットのバイナリだと思われます。
    この中の大きなものを削減すると効率的です。ファイル名がGUIDと一致するため、プロジェクトフォルダ内をgrepすることで元のファイル名を調べることができます。
    シーンに置いているゲームオブジェクト等はシーンの方にまとめられてしまうようで個別にサイズの大小を測ることができません。
    apkres
     
    上の画像で言うと、3番目の1f2c3a...とかいうファイル名がGUIDです。

    かなり手間がかかる方法なのですが、極端に大きなファイルがResourcesにあり、それがアプリを圧迫している場合には有効です。それ以外の場合だとResourcesを使っているときが有効だと思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    人月とは1人が1月に行う作業量(工数)のことです。作業量の見積もりでよく使われる言葉です。直感的にわかりやすい単位なので良く使われるのだと思います。
    人月でいう1月は20日間のことであり、1日は8時間の作業を行うとしているのが普通です。1人が1日に行える工数は1人日。1人が1時間に行える工数は1人時となっていきます。
    どれも求め方は(人数)×(時間)で簡単に求められます。速さと時間と距離の関係と同じなので小学生でもわかる計算です。速さが人数、時間は時間、工数が距離となります。
    1日が8時間となったりするところだけが変換をややこしくしますが、難しいのはそれくらいです。

    作業をするのに2人で3日かかるなら、6人日。
    1人で6日作業しても6人日です。

    2人でやった方が効率の良い作業とか個人の能力差とかは考えないので、あくまでも大雑把な見積もりです。見積もる人の能力で人日をはじきだすのがその人には使いやすいですが、他の人には使えないことに注意が必要です。

    自分のスケジュールを決めるのには使える方法だと思いますが、これを元に料金を決めているのはかなりの馬鹿者だと思います。 なぜならこれは作業の量を測るだけの話であって、作業ごとの単価はまるで関係ないことだからです。作業量が多いのだから料金が高いというのなら、受け手は無意味に作業をゆっくり行うでしょう。
    とはいえ、時給という考えが日本には根強く浸透しているため、前述の主張は通ることが少ないのが現実です。特に年を取るほどそのような時間に対して対価を考えがちです。(あくまでも傾向です。年齢を経ても新しいことに理解を示す人もいるでしょう。)
    そうなっている以上は仕方がないので、ちょうど良い時給を決めるだけです。難しいことや簡単なことを入れたうえで平均をとります。
    例えば、難しい作業の場合は時給3千円。 簡単な作業の場合は時給1千円とします。この場合、同じ時間だけ難しい作業と簡単な作業を行えば時給は2千円です。必要な分だけの時給を請求すればいいのです。

    人月は大雑把な費用を出すのには使えます。人月が多ければそれだけ費用は大きくなります。細かい数字を出すために使われていたら、それは疑った方が良いです。

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

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

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

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

      このエントリーをはてなブックマークに追加 Clip to Evernote
    PCの操作を撮影したいことがあります。それもそんなに大容量なファイルに書き出さないようにしたいときです。具体的な例で言うと、TwitterにPCの操作画面を載せるときなどです。Twitterは3MBまでの容量制限があるので、普通の動画ファイルをアップすることは無理なことが多いです。
    要望を満たすスクリーンのある範囲を軽いファイルで録画できるフリーソフトを紹介します。

     以前、ロイロゲームレコーダーを使い動画を撮ることを記事にしました。ゲームプレイの動画を撮る以外にも操作しているウィンドウの録画ができるので、PCの操作画面も撮ることができます。
    スクリーンのある範囲を録画しているわけではないので、下のように複数の異なるソフトを同時に撮るといったことはできません。
    mulwin

    画面上のある範囲を録画するレコーダーは、スクリーンレコーダーとかで検索すると見つかると思います。私が使っているソフトは、ScreenToGifというものです。
    ウィンドウの枠だけのような見た目のソフトでこの枠がそのまま録画できる範囲を表しています。ウィンドウのサイズと位置を調整したら、Recordボタンを押して録画できます。簡単に録画ができるのがすごく便利です。

    stg

    録画をやめたくなったら、Stopを押して録画終了です。終了後には下のような編集画面が開きます。色々な編集ができますが、特に何もせずDoneを押せばそのまま録画がGifとして保存されます。操作画面を撮っていると、動画の初めと終わり部分はいらなかったりすることが多いのですが、ScreenToGifではある時点の前もしくは後ろを全てカットする機能があり簡単に邪魔な部分を消せます。

    stgedit

    GIFファイルは画像なので、音声を入れることができません。操作中の音を入れたいという場合はこのツールでは対応できないので、その場合はロイロゲームレコーダーを使うとか他のツールを使う必要があります。

    このページのトップヘ