FreelyApps

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


    ブログを
    https://freelyapps.net/
    に移転する予定です。
    リンク切れがある記事はこちらに移動した可能性もあります。

    カテゴリ: 開発

      このエントリーをはてなブックマークに追加 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

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

    このページのトップヘ