FreelyApps

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


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

    2015年10月

      このエントリーをはてなブックマークに追加 Clip to Evernote
    タブレットを使っている人がGoogle Playを使っているとアプリが見つからないことがあります。

    タブレットを使っている場合、Google Playでは検索時にタブレット向けに設計というフィルターがかかっています。タブレット向けに設計というのは、その名の通りアプリがタブレット用にも作られているかです。このフィルターによりアプリがタブレット向けに作られていないものは検索に引っかからなくなります。
    tab-search

    タブレット向けに設計というところをクリックすれば、すべてのアプリという項目が選べて全部のアプリを表示することができます。この操作を知らない人や面倒な人はデフォルトのまま使うでしょうから、タブレットを使っている人はタブレット向けに設計されたアプリ以外のアプリを目にすることは少ないでしょう。

    アプリを作る側の都合で言うと、自分のアプリが多くの人に知られることは重要です。まず目につかなければアプリがダウンロードされることもありません。ダウンロードされなければランキングも上がらず、ますますダウンロードされにくくなります。
    タブレットからもダウンロードされるようこの検索に表示されるようにすることはしておきたいと思うわけです。単にアプリを作って公開しただけではタブレット向けに設計されたと判定されずGoogle Playでは携帯電話向けに設計とされてしまいます。 
    以下は私のアプリですがアイコンの下に携帯電話向けに設計と表示されています。もちろんこの表示はタブレットからしか表示されません。
    forcellphone


    どうやったらタブレット向けに設計されたアプリだと認定されるのかというのがずっと疑問に思っていました。確証があるわけではないのですが、今回原因と思われるものを突き止めたのでそれを備忘録として残しておこうと思います。

    Unityでアプリを作った場合はタブレット向けにも設計されているようです。ここでの意味はAPKファイルはタブレット向けになっているということです。
    実はこれだけでは駄目なのです。Developer ConsoleでアプリのAPKをアップロードして公開したときに以下のような警告が発生していました。
    tab-op

    レイアウトにはタブレットで利用可能なスペースを使用すること。
    と警告が出ています。
    Unityでアプリを作ると画面に合わせてUIが拡大されるなどの対応をすることができ、タブレットだからといってスペースができるわけではありません。つまり全画面を使用しています。それにもかかわらずスペースを使用せよとのことなのでわけがわからなかったのです。

    Google Japan Developer Relations Blogの「タブレット向けアプリ品質チェックリスト」という記事にタブレット向けに作るアプリはどのような条件を満たすべきなのかが解説されています。
    この中の「3. タブレット上の余っている画面領域を活用する」がどうやら満たされていないと判断されているようでした。

    ただどうやってこれを解決するかが具体的に載っていないのです。タブレット用のレイアウトを作れと言われてもUnityで解像度ごとのレイアウトを作るのは難しいのでやれませんし……
    また私のアプリの一部ではタブレット向けに設計せよとの警告が出ていないのもあり、どうすればいいのかわからず放置していました。

    最近気付いたのですが、スクリーンショットが問題なのではないかと思ったのです。タブレット向けに設計されていないアプリの登録情報を見るとスクリーンショットのところに問題があると表示されていたのです。
    アプリのスクリーンショットで問題が起きるのかどうかを検索したところ次のような記事を見つけました。この記事を書いた方はCocos2d-xでのタブレットの対応ということでしたが、問題としては全く同じでした。
    スクリーンショットに余白があると判断されると、タブレットでスペースを使ってないとみなされてしまうようです。参考のために携帯電話向けに設計になっているアプリのスクリーンショットを以下に載せておきます。基本的に黒い画面なのでスペースだらけです。このアプリはどうしようもありませんが、対策するなら背景を出したり、上下に適当なイラストでも載せるといったことをすれば良いと思います。
    tttitle ttresult ttmain

    結論としては、Unityで作ったアプリがタブレット向けに設計されていない場合はスクリーンショットに問題があるということです。
    7インチや10インチのタブレット用のスクリーンショットを余白が生まれないようにして撮り、アップロードすれば解決します。
    APKに問題があるような書き方で修正してと警告するのは誤解を生むのでやめてほしいと思いました。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Debug.Logやprintはデバッグのために非常に役立ちます。
    重要な処理をする前後に置いて処理が正しく終了まで到達したかを調べたり、 UIがない画面での処理結果を表示したりして確認に使えます。

    使いやすくて色々な所に書きすぎることになるかもしれません。そうなってくると便利なはずのログがとたんに牙をむきます。どのログが重要なのかがわからなくなり、あまりに多くなってくると無視しても良いのだろうかと疑念を抱くことになります。
    作るときに仮に置いたものなどは役目を終えた時点で破棄していくべきですが、そう簡単に消しきれないこともあります。

    Debug.Logをそのまま使うのではなくこれをラップしたメソッドを作って、それを呼び出すようにするのが良いと思います。

    public void MyLog(string message)
    {
    Debug.Log(message);
    }
    とかでも十分です。 こうやってDebug.Logを呼ぶだけだと変わらないと思われるでしょうが、MyLogを通して呼び出していることが重要なのです。
    色々な拡張ができますが、MyLogの中のDebug.Logをコメントアウトすれば、ログが出なくすることもできます。 前後に余分な情報をつけるといったことも簡単です。自分で改造できるメソッドなので、直接Debug.Logを呼び出すよりも融通がきくわけです。

    ログをカスタマイズするという意味では上の方法で良いと思います。ログをリリースまでは出しておき、リリース時になくすというような使い方をする場合はConditional属性を使うとより良いと思います。 

    [System.Diagnostics.Conditional("MY_LOG")]
    public void MyLog(string message)
    {
    Debug.Log(message);
    }
    というように書きます。 このようにするとMY_LOGというシンボルが定義されているときにMyLogは実行されます。色々なところでMyLogは他のメソッドと同じように呼び出すことができます。使う側では特に意識することなく使えるのにシンボルが定義されているかによって呼び出しが行われなくなるというのが使いやすいのです。

    #ifを使っても似たようなことはできます。
    #if MY_LOG
    public void MyLog(string message)
    {
    Debug.Log(message);
    }
    #endif 
    とすればいいのですが、呼び出す側でも#ifで囲わなければなりません。Conditional属性を使うと、これがなくても良いのでコードが読みやすくなり、書く分量も減ることになります。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    少し前にツイッターで他の開発者の方のアプリでBackキーでアプリが終了しないとのクレームが来たというのを耳にしました。
    nback
     
    Androidの画面の下の方にある3つのボタンの左側のものです。このBackキーというのはUnityでアプリを作ると特に機能が割り当てられず押せるだけのボタンになっています。真ん中のホームボタンと右側のメニューボタンはAndroidの本体の機能がついているので、特に何もしなくても普段通りの機能をします。

    Backを押したときにどのような機能をするかは開発者が自由に決められます。前の画面に戻っても良いし、
    アプリを終了するボタンにしても良いです。わかりやすく多い機能としてはこんなところでしょうか。
    Android4.4以降ではこのボタンたちを消すことができてフルスクリーンを利用できるようになっています。以前書いた記事があるのでリンクを張っておきます。

    Unity5ではデフォルトでフルスクリーンなのですが、それをやめてナビゲーションバーを出すようにも設定できます。それについても以前解決したことなので記事にしていました。ある画面ではフルスクリーン、別の画面ではナビゲーションバーを出すということも可能になっています。
    ゲーム中は全画面を使えた方が良いと思うのでフルスクリーンにして、メニューではゲームを止めることも考えナビゲーションバーを出すようにするのが良いと思います。

    Backキーを押したときにアプリを終了したい場合は以下のコードを適当なゲームオブジェクトにつけておけば良いです。全シーンにわたって同じ挙動をするなら、破棄されないゲームオブジェクトにつけておくと簡単です。
    KeyCode.EscapeというのがBackキーに割り当てられているようです。GetKeyUpでなくてももちろん構いません。

    void Update()
    {
    if (Input.GetKeyUp(KeyCode.Escape))//backキー.
    {
    Application.Quit();
    }
    }
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    10/28に「トランプ・ナポレオン」を2.0にアップデートしました。

    今回のバージョンアップは通信対戦の追加です。 その名の通りインターネットを使ったオンラインゲームを行えるようになりました。ナポレオンをすることに変わりはないので、対戦する人数は2~5人になります。

    ナポレオンは元々トランプゲームであり、対人戦が面白いものです。アプリを作ったことで手軽に遊べることは良かったのですが、やはり対戦したいという気持ちがありました。今回はそれを実現できたと思うので非常に良いアップデートだと思っています。
    後はどれくらいのユーザーが使って対戦できるかというところです。現在だとユーザーが少ないので対戦できるだろうかという心配があります。ダウンロードが増えてくれればいいのですがそう簡単ではないので、このアプリを遊んでくれた人が一緒に遊ぼうというように広まってくれることを期待しています。(各レビューサイトにレビューの申請とかできることはしていきます。)

    Screenshot_2015-10-25-19-19-27
     上のように通信対戦を行う人がルーム(待ち合わせ場所)に入ってくるとリストに追加されていきます。2人以上が参加すると開始ボタンが押せるようになり、ゲームを始めることができます。2人の場合は3人がAIにより処理されます。
    ここに表示されている名前は設定の中に「名前変更」 を用意したので、そこで設定した名前が表示されています。(レイアウトの関係で6文字まで、全角にするとレイアウトがそろいます。)

    トランプ・ナポレオンではUnity Multiplayerを使って通信対戦を実装しています。Unity5.1から入った機能ですが、まだ試験的というか使っている人も少ないと思います。クライアントサーバーモデルのゲームを作れるように設計されたり、マッチングサーバーが用意されたりしています。
    ドキュメントだけしかない状況で資料が少ないため、このアプリが参考になるかもしれません。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    アプリ『トランプ・ナポレオン』の通信対戦の説明です。

    1. 概要
    2. ルーム検索
    3. ルーム参加
    4. ルーム作成
    5. 備考

    1.概要
    通信対戦とは、インターネットを介して他のプレイヤーと対戦することができるものです。2~5人のプレイヤーが参加することでゲームを開始することができます。通常の対戦と異なり操作には時間制限があります。
    通信対戦を行うにはルームが必要です。ルームとはプレイヤーがゲームに参加するための待ち合わせ場所のことです。プレイヤーはルームを作るか、ルームに参加するのが基本になります。
    ルームを作る場合は他のプレイヤーが参加してくるのを待ちます。後述の4.ルーム作成をお読みください。
    既にルームが存在している場合は、ルームに参加することができます。後述の3.ルーム参加をお読みください。
    ルームに2人以上のプレイヤーが集まったらゲームを開始することができるようになります。
    ルームを作った人をホスト、ルームに参加する人をクライアントと呼びます。ホストがいなくなるとルームがなくなるので、ホストのプレイヤーは通信がなるべく途切れないようお願いします。
    アプリが中断してしまうと通信が切れるので、アプリが中断しないよう定期的に画面をタップしてください。
    通信が切れた場合は通信対戦を続けることはできませんが、そのまま通常の対戦に移行して遊び続けることができます。通信対戦が行われているときは画面左上に紫色のアンテナのアイコンが表示されています。
    Screenshot_2015-10-25-19-17-03

    2.ルーム検索
    ルームの名前を指定して検索することができます。特定の人と遊ぶためにあらかじめルーム名を決めておいて一緒に遊ぶといった使い方が可能です。
    ルーム名を入力し、「ルーム検索」ボタンを押すとそのルーム名でルームがあるか検索をします。ルームの一覧は定期的に更新されます。
    ルームが見つかった場合は、ルーム名と参加人数が表示されるボタンが現れるのでそれを押してルームに参加することができます。
    Screenshot_2015-10-25-19-17-47 Screenshot_2015-10-25-19-18-09 Screenshot_2015-10-25-19-20-07

    3.ルーム参加
    存在しているルームを見つけて表示します。ルームの一覧は定期的に更新されます。
    ルームが見つかった場合は、ルーム名と参加人数が表示されるボタンが現れるのでそれを押してルームに参加することができます。
    Screenshot_2015-10-25-19-18-15 Screenshot_2015-10-25-19-20-16

    4.ルーム作成
    ルーム名を指定してルームを作ることができます。ルーム名はなくても問題ありませんが、他の人と違う名前をつけることで区別しやすくなるためつけることをお勧めします。
    ルーム作成後はホストとして他のプレイヤー(クライアント)が参加してくるのを待ちます。真ん中の画像のようにはじめ自分の名前だけが表示されていて、このときは戻るを押して通信対戦をやめることができます。
    クライアントが1人でも参加すると、開始ボタンが表示され戻ることはできなくなります。誰かが開始を押すことでゲームが開始されます。5人まで参加可能です。
    Screenshot_2015-10-25-19-17-53 Screenshot_2015-10-25-19-19-08 Screenshot_2015-10-25-19-19-27
     
    5.備考
    プレイヤーの名前は設定から行えます。初期設定では「ユーザー」になっていますので、お好きなものに変更をしてください。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』に通信対戦機能を作っていると以前の記事で書きました。

    現在は通信対戦の機能を作り終え、テストを行っているところです。早ければ来週か11月の初旬にリリースできるかと思います。はじめは試験版と銘打っておこうと思っています。
    マッチングをルームの作成、参加で通信対戦を行っているので、少し面倒かもしれないと感じています。全自動で通信対戦を行う機能を追加すると自分の参加したいルームに参加できなくなってしまいます。これだと誰かと遊ぶということが難しくなります。ユーザーの意見があれば対応というところですが、まずはルームの作成・参加という方式でリリースします。

    通信対戦を作っていてわかったことは、進行不能になることや通信の切断への対処が難しいということです。どのような対応をするのが良いかはアプリによるので、以降の話は『トランプ・ナポレオン』についてということになります。

    トランプゲームでは誰かが札を出さなくするだけで進行不能になります。通信対戦ではこれが起こると遊ぶのが苦痛になります。
    対処としては時間制限をかけることで解決します。一定時間が経ったら、自動でカードを出すようにしてしまえば良いのです。
    『トランプ・ナポレオン』では全員の進行を止めるような判断を行うところでは必ずそのように作ることにしました。
    宣言、副官指定、カード交換、トリックでのカード選択のときには時間制限を設けています。時間制限が来たら、AIで勝手に処理を行うことにしています。

    切断の対処は、注意をダイアログで表示して「なるべく切らないようにしてね」とお願いしています。これだけで済めば良いのですが、おそらくそうはいきません。

    お願いしても切断されるでしょうから、その時はなんとかゲームを続けられるようにしています。ホスト(サーバーの役割があるクライアント)がいなくならなければ、クライアントが抜けても通信対戦が継続されます。ホストがいなくなった場合はどうしようもないので、クライアントが個々にゲームを続けられるようにしてあります。

    まとめると、以下のような対応をしています。

    <通信を切った人(アプリの中断も含む)>
    • 通信対戦は終了し、そのままオフラインでゲームを継続する。

    <通信を切られた人>
    • ホストがいなくなった場合は通信対戦が終了し、そのままオフラインでゲームを継続する。
    • クライアントがいなくなった場合はそのプレイヤーはAIで処理されるようになるが、通信対戦は継続する。ただしホストだけになってしまった場合は通信対戦は終了し、そのままオフラインでゲームを継続する。
    書くとそんなに処理が多くないように思います。しかしながら実際にこれを対応するのはかなり骨が折れます。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    APPLIONというアプリを検索できるサイトがあるのですが、ランキングの推移を見るのに便利です。色々なアプリを探すサイトなので、レビューが載っているというわけではないですがストアの情報をきれいにまとめてあって複数の端末でアプリを探すのにも重宝するでしょう。

    Androidのアプリを検索するにはサイト上部のAndroidタブをクリックして検索したいキーワードを入れると良いと思います。タブを選択せずに検索するとiPhoneのアプリを検索するようになっています。
    applionsearch

    ランキングの推移についてですが、『トランプ・ナポレオン』を調べてみると次のようになっています。リンクはこちらです。トップのページではすべての情報がまとめられている用です。ランキングは以下のようになっています。
    tnrank

    次にランキングをもう少し詳細に見ようとした場合はページの上の方にある以下のタブでランキング推移を押します。
    appliontab

    これを押した先のページでは、アプリによって多少異なるようですがいくつかのグラフが見れます。『トランプ・ナポレオン』ではまだ新着アプリということもあり、
    • 新着無料ランキング推移と平均順位
    • 無料ランキング推移と平均順位
    • 売上ランキング推移と平均順位 
    という3つのグラフが表示されていました。新着アプリでなくなると、新着無料ランキング推移と平均順位はなくなるようです。『トランプ・ナポレオン』は広告を表示しているだけで課金や有料版というものがないので、売り上げのランキングは何も表示されていません。
    ランキングの詳細ページでは日付ごとの順位を見ることができたりして、アプリの人気の変化が一目でわかります。

    色々なアプリのランキングの変化を見るのも楽しいと思いますし、自分のアプリの変化を見て参考にするのも役に立つでしょう。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity Analyticsのカスタムイベントを呼び出すときにはイベント名だけでなく追加の情報を送ることができます。

    public static Analytics.AnalyticsResult CustomEvent(string customEventName, IDictionary<string,object> eventData); 

    というメソッドを使ってカスタムイベントを送信するのですが、 第2引数のeventDataにパラメータの名前と値をセットにした配列を渡すことでカスタムイベントに追加の情報がつけられます。
    つけた情報を見るにはウェブ上の管理ページのDATA EXPLORERで見ることができます。このあたりは以前の記事にも書いたのでご参照ください。 

    eventDataの個々のパラメータ名は日本語で書かない方が良さそうです。わかりやすさのため日本語で設定していたのですが、文字化けしてすべて?で表示されていました。
    aunk

    アルファベットで書いたところは正しく表示されていたので、ASCIIコードの文字だけに対応しているのだろうと思います。日本語のパラメータ名は全部こんな感じでわからなくなっていました。

    Unity Analyticsのメソッドの全てが対応しているかまでは調べていませんが、カスタムイベント名などでも日本語を使わない方が良さそうです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    副業とは主な収入を得る仕事があって他に仕事をする場合のことを指します。私の場合で言うと会社員として雇われているので、本業は会社員となります。
    副業はそれ以外の仕事なので、例えばアルバイトだったり他の会社の給料だったりします(私自身は本業以外の仕事はしていませんが)。副業という厳密な定義はわかりませんが、大体の意味としては収入を得る目的で行う本業以外のことになるのでしょう。

    色々理由はあると思いますが、仕事をしていると副業をして儲けたいというのは一度くらいは考えるのではないかと思います。私はしょっちゅう思っています。隣の芝生は青いということです。

    副業自体はいっぱいあります。ものによっては本業に影響が出るくらい大変なものがあります。深夜にコンビニでアルバイトするとかは時間的には可能でしょうが、体力的には辛いものだと予想されます。
    タイトルにあるように副業としてアプリを作って儲けるということはどうでしょうか。疲れることは当然あるのですが、自分で作ってリリースも自分で行うならスケジュールには融通がききます。誰かに雇われるとそうはいきませんし、自分の判断が絶対ということにもなりません。何かを作って世に出すというものは、自分の力で何とかするものになります。それが楽しいと感じるなら、アプリを作って儲けるということも楽しいと思います。

    私はゲームが作りたいので、アプリを作るということしています。市販のゲーム機向けに作るのは個人では厳しいし、儲からないでしょう。ゲームの市場としても近年はスマホ向けの売り上げが多くを占めるようになり、盛り上がりのある分野です。私にできそうでしかも大きな成功があるかもしれないという夢があるので、作ってみるかということで続けています。
    成功してアプリだけに専念したいと思っていますが、今すぐにアプリだけに専念しようという気にはなりません。それは単にリスクの取り方の問題です。今のところ専念したからといって生活できそうもないからです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ブログにツイートを載せる方法は以前「Twitterのつぶやきをブログに載せる」で説明しました。どのようなブログでも載せられるし、ホームページに載せることもできるので最も使い道が多い方法でした。 

    HTMLを知っている人からすれば使いやすくて良いのですが、人によってはわからないということもあるでしょう。 今回はこのブログで使っているlivedoor Blogで簡単にツイートを載せる方法を紹介したいと思います。
    一度設定をする必要がありますが、それを行えば次回以降は非常に簡単に載せることができるようになります。 

    まずTwitterのアカウントにログインしておいてください。

    ブログの管理画面にログインして、ブログ設定->外部サービスと押してください。
    bcon

     外部サービス連携というページになり、画面の上の方にTwitterのアカウントをブログに関連付ける設定があります。
    btset

    Twitterにログインというボタンがあるので、それを押すとTwitterのログイン画面になります。既にログインしていれば、Twitterとlivedoor Blogを連携させるか聞かれます。ボタンを押して連携すると
    bts
     
    上のようにブログと連携したTwitterのアカウントの情報が表示されます。
    ブログの記事を投稿したらツイートするといったことも設定できますが、「記事投稿時にTwitterへ通知メッセージを同時投稿する」にチェックをつけて画面下部の設定するボタンを押すだけです。


    設定が終わったら、いよいよ本題です。
    ブログの記事を各画面で文字の大きさや色を変えるなどの操作が行えるボタンが並んでいるところがあります。ここにTwitterバード(青い鳥のロゴ)があります。
    bteasy

    これを押すと設定したツイッターアカウントのタイムライン等が見れます。以下のように表示されます。
    ttl

    ブログに載せたいツイートを選んで、挿入するボタンを押せば記事にツイートが埋め込まれます。ツイートが埋め込まれる場所は文字が書かれていくカーソルのところです。

    試しにこの機能でツイートを以下に載せてみました。動画とか画像とかが埋め込まれたツイートの場合はそれも表示されるようです。

    このページのトップヘ