FreelyApps

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


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

    タグ:Tips

    • カテゴリ:
      このエントリーをはてなブックマークに追加 Clip to Evernote
    10/6に「トランプ・17ポーカー」の公開ボタンを押しました。この記事を書いているときにはまだストアには上がっていない状況です。もうしばらくすればストアから配信されるでしょう。

    Android/iOSの同時リリースなのですが、iOSのリリースについて問題が少し起きました。トランプ・17ポーカーの審査は問題なく通ったのでアプリではなくiTunes Connectの問題です。

    手動で配信時期を決めるようにしていたのですが、審査が終わってあとはリリースボタンを押すだけというところでリリースボタンが押せなくなりました
    disable-release-button

    リリースボタンが押せないことをGoogleさんに聞いてもAppleのことだからか知らんぷり。そんなわけで今日は無理なのかもと思いつつ、適当にいじっていたら押せるようになりました。

    【解決方法】

    デベロッパによるリリース待ちという状態は、覚悟ができたらリリースボタンを押してくれという意味です。しかしながら押せないことが起こりました。
    この状態では審査が通った後なので、ストアの情報はほぼ変更できません。変更できないところをいじるとエラーと警告されます。

    以下のバージョンのリリースという項目が変更可能でした。手動か自動でリリースです。手動でリリースが選択されていたのですが、これを自動にして保存すると、”このバージョンをリリース”ボタンが押せるようになりました。自動にしたものを手動に再び戻しても、リリースボタンが押せるようになっていたので、これで問題なくなりました。
    howto-release

    ”このバージョンをリリース”ボタンが押せないときは、バージョンのリリースという項目を変更し、保存するとリリースボタンが押せるようになるのかもしれません。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    最近気付いたことなのでいつからある機能なのかわかりません。少なくとも今使っているUnity5.3.4f1 Personalには以下の機能があります。

    シーンビュー上で3D/2Dに関わらずゲームオブジェクトが重なってしまうことがあります。選択したいものの一部がクリックできれば選択状態にできますが、大きいものが手前に来るなどしているとクリックできず選択できないことがあります。

    シーンビュー上でクリックを繰り返すと、選択されるゲームオブジェクトが切り替わっていきます。クリックしたところにレイキャストして貫通したゲームオブジェクトを順番に選択しているような挙動をします。
    以下はUIでの例です。キャンバスが複数あり、UIは階層構造を持っています。クラブのQを選択したいのですが、上に重なっているUIがあるため直接は選択できません。何回かクリックすることでクラブのQが選択状態に切り替わりました。


    3Dでも同じようなことができます。2つのときはうまくいったのですが、3つ以上のゲームオブジェクトが重なっているときはうまくいくこともあれば、選択できないこともあったのでよくわかりません。
    あと位置移動のためのギズモをクリックしたときは選択切り替えは起こりません。それはゲームオブジェクト平面上で動かすためのショートカットが優先されるからです。


    重なったゲームオブジェクトをシーンビュー上で選択するには、そのゲームオブジェクトがあるところを何回かクリックしてみると良いです。これに慣れるとUnity UIを作るのが楽になります。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityで新しいC#スクリプトを作成すると以下のような状態になっていると思います。
    これをそのまま使っても、編集しても良いのですが、いつも使う名前空間などはテンプレートに入っていると楽で良いと思っていました。System.Collections.Genericを使うのでSystem.Collectionsは使ったことがないですし、英語のコメントも慣れてくると要らないです。

    あるC#スクリプトをDuplicate(Ctrl+DかEdit->Duplicateでアセットの複製ができます。)してリネームするでも良いのですが、ちょっと手間なのでテンプレートを変更することでより便利になります。
    スクリプトのテンプレートを追加する」 Unityな日々(Unity Geek)より
    でその方法を解説がされているので参考に試してみました。
    スクリプトのテンプレートが保存されているのは、私の場合
    C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplatesでした。Unityのインストール先を見つけてEditor\Data\Resources\ScriptTemplatesと探していけば良いでしょう。
    script-template
    フォルダには以上のようなテンプレートが並んでいます。C#のスクリプトのテンプレートは81-C# newScript-NewBehaviourScript.cs.txtです。これを自分の好きなように編集して上書きしてやると、Unityで作られる新しいスクリプトが変更されます。(Unityが読み込むファイルの変更なので、全プロジェクトに影響します。)

    このファイルを「81-C# newScript-NewBehaviourScript.cs」という名前でスクリプトのテンプレートが保存されているフォルダにコピーすると、Createメニューに項目が以下のように追加されるはずです。(別名にすることで元々のテンプレートを保持したままメニューに新しいものを追加されるようです。古いのが要らなければ上書きでも構いません。テンプレートのファイル名はハイフン区切りで意味を持つようです。)
    myTemplate
    この新たなメニューでスクリプトを追加すると以下のようになります。 
    usingにSystem.Collections.GenericやUnity5になってから追加されているよく使う名前空間を入れています。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity Analyticsの管理サイトでDATA EXPLORERを選ぶと、カスタムイベントの情報を見ることができます。

    下の図は、ナポレオンを1ゲームするときに呼び出しているカスタムイベントのグラフです。個のイベントを呼んだユーザー数の変化が表されています。(本来は左端にユーザー数が表示されますが、ここでは消してあります。)
    tn-analytics-1page

    これだけだとアプリを起動した人数とほぼ一致するはずです。なぜなら、このアプリを起動して遊ばずに抜けることはほぼないと思われるためです。DAUと比較してどれくらいの人が何もせずにアプリを落とすのかを知りたいときには役立つと思います。

    カスタムイベントが呼ばれた回数を知りたいことがあります。ユーザーごとではなく、各々のユーザーが呼び出したカスタムイベントの総量です。
    これの見方についての説明は載っていないのですが、おそらく以下で説明する方法で見れると思います。(正しいやり方かの保証はないのでご注意ください。)

    Add Custom Eventで見たいイベントを追加するなりして、特定のカスタムイベントを選んだら、対象となるユーザーを選び、View Parametersボタンを押します。
    そうすると2枚目のページにいけます。このページはあるカスタムイベントの詳細を見れる画面です。ここでパラメータの指定をunity.nameにします。どうもこれはカスタムイベント名を表しているようです。countというのは数字型のパラメータを指定したときの呼び出し回数です。つまりこれが発生回数になります。
    (本来は左端に回数が表示されますが、ここでは消してあります。)
    tn-analytics-2page

    何回か検証したところカスタムイベントの発生回数と一致したので、この方法で発生回数を調べられます。
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    知っている人も多いと思いますが、Android6.0でも隠しゲームがやはりありました。
    ゲームの内容がAndroid5.0と変わらなかったのは残念ですが、相変わらず難しいゲームです。

    遊び方は設定画面の一番下にある端末情報を開きます。
    m6settings

    次にAndroidバージョンと表示されている項目を連打します。それなりに早く連打しないと認識しないようにできています。裏技みたいなものなので、偶発的に起こる可能性を低くしているのでしょう。
    m6terminalinfo

    コマンドが認識されると以下のようにマシュマロっぽいドロイド君が現れます。
    m6fb

    このイラストをタップしたりタッチしたりすると反応します。これをいじるとゲームが始まるようになっています。何故こんな風になっているのかは遊び心の結果だと思います。

    ゲームを始めまでが非常に長いです。
    マシュマロをタップしたり、タッチし続けたりしていると突然ゲームが始まります。何を条件にスタートしているかわかりませんが、いじった回数とかもあるんじゃないかと感じます。 

    Android6.0でのゲーム画面は以下のようになります。マシュマロによってプレイヤーが止められます。
    タッチしている間ドロイド君が浮いていきます。障害物を潜り抜けられそうになるタイミングで放すことでゲームは続きます。何回通り抜けられたかを競うゲームです。
    m6fb3

    このゲームは「Flappy Bird」というゲームを元に作られているらしいです。難しくて本家の方も話題になったようです。
    超難しい設定になっているので10回くらいくぐれたらすごいと思います。

    ちなみにAndroid 4.4とかでも同じ手順で隠し機能があります。 いつからあるんでしょうか?

      このエントリーをはてなブックマークに追加 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
    Unity 5.2が公開されてログの表示が強化されていました。Stacktrace loggingというようです。使い勝手は今のところ実験的な機能というところです。今のところ必要かわかりませんが、詳細を見れるようになったということでデバッグに活用できるかもしれません。

    3種類のログの出力形式を選べるようになります。
    None、ScriptOnly、Fullです。このうちScriptOnlyというのが従来のログと同じ形式です。インストールしたときのデフォルトがこの設定でした。
    コンソールを開き、設定ボタンをクリックします。Stack Trace Loggingという項目があるのでそれを選ぶと、ログの表示形式を選ぶことができます。
    stl


    どのような見た目になるかは以下の画像のようになりました。

    Noneの場合
    simlog

    ScriptOnlyの場合
    nlog
     
    Fullの場合
    stlog

     
    Noneはログがそのまま出ているだけの表示なので、見やすいですが情報が少ないです。余計な情報が出ないのであまり重要でないところではこの表示にしておくとログ全体が見やすくなります。 

    ScriptOnlyは今までの表示と同じです。慣れている人はこの設定が良いでしょうし、表示される情報もちょうどいいので特に気にならなければこの設定が良いです。

    Fullは多くの情報が出ているのがわかります。表示の先頭にある0x~というのはおそらくメモリのアドレスを表しているのだと思いますが、詳しいことはわかりません。(64bit分の表示なので、可能性は高いと思います。)


    現時点で役に立ちそうなのは、Application.stackTraceLogTypeをスクリプトでいじるとログの表示を動的に変えて見やすくすることくらいでしょうか。それをやるにしてもリリースするものにこの処理が入るのは無駄なので、定義を使わなければ駄目かと思います。
    Editorスクリプト用ならリリースに含まれないので、それに活用するくらいかもしれません。 

      このエントリーをはてなブックマークに追加 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がない場合と同等でした。)

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


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

      このエントリーをはてなブックマークに追加 Clip to Evernote
    プロジェクト(Unityの作業フォルダの意味の方)が大きくなってくると、どのアセット(ファイル)を使っているのかわからなくなってきます。
    あるプレハブが別のプレハブを参照していたり、シーン内のゲームオブジェクトの深い階層からアセットが参照されていたりすることになっていると、もう管理しきれなくなります。
    参照がされているということはそれが必要だということです。間違えて参照がされているアセットをプロジェクトから消してしまうと、それを参照できなくなり何らかの問題が起こるでしょう。

    不必要なアセットをプロジェクトに入れておくことは良くないです。不要なアセットを手違いで使ってしまったり、余計な作業の発生があり得るからです。
    できることなら不必要なアセットは定期的に削除してしまい、必要なものだけを残していくというのが理想的です。特に大きなプロジェクトだと重くなっていくので、要らないものは極力なくす方が作業を効率的に行うためには重要です。

    解決策は2つあります。
    ひとつはプロジェクトに追加はしても消すことはしないことです。このルールを守るだけで参照できなくなることはありません。解決というよりは臭いものにふた的な発想です。しかしながら、意外と悪くない方法なのです。Unityは使っていないアセットをビルド時に除外するということをやっています。したがって不要なアセットを参照さえしていなければ、ビルドしたものにおいてそれは存在していないのと同じなのです。(Resourcesフォルダにある場合は例外。)
    もうひとつはプロジェクトで確実に使われていないことを調べたうえでアセットを削除することです。 これを行うのは少し難しいです。また労力もかなりかかります。
    アセットのそれぞれにはGUIDと呼ばれる識別子が与えられていて、Unityはそれでアセットを区別することができます。リネームしたり、移動したりしても参照が切れないのはこのGUIDを使ってUnityが参照を管理しているからです。
    このようなUnityの管理方法をそのまま自分で再現すれば、どのアセットが使われているのかがわかります。少し手順が複雑になりますが、以下がその手順です。決まった作業なので、頑張れば自動化も可能だと思います。

    メニューEdit->Project Settings->Editorを選び、Version ControlのModeをVisible Meta Filesにし、Asset SerializationのModeをForce Textにします。(バージョン管理をしている場合はこれらが設定されているかもしれません。バージョン管理については、ここの記事を参考にどうぞ。)
    Version ControlのModeをVisible Meta Filesにすることによりmetaファイルができ、対応するアセットのGUIDを調べることができます。下のようにCube.prefabに対応してCube.prefab.metaというファイルが同じ場所に存在します。
    metafile

    Asset SerializationのModeをForce Textにする理由は、デフォルトでバイナリファイルであるシーンやプレハブのファイルをテキスト形式で保存するためです。これにより全てのアセット内を検索することが可能になります。GUIDを検索できるようにするために必要というわけです。

     metaファイルを開いてみると、こんな感じです。
    meta
     2行目にguidというものがあり、これがGUIDになります。0c65~でフォルダ内をgrep(複数のファイルを同時に検索)して、どこに同じGUIDがあるかを調べます。
    見つかったファイルが検索したGUIDに対応するファイル以外であれば、そこからは参照があるということです。Unityのヒエラルキーやインスペクタ―を使って参照がされていることを確認してみてください。
     
    検索したGUIDに対応するファイルしか見つからなかった場合、それを参照しているアセットは存在しません。よって、それは削除してもかまわないものと見なせそうです。
    最後に調べるべきこととして、Resources.Loadを使用して動的なアセットの読み込みを行っていないか調べなくてはいけません。Resources.Loadを使うにはResourcesフォルダ以下にアセットが置かれていなくてはならないので、消そうとしたアセットがResourcesフォルダ以下にないことを確認します。
    以上が確認できれば、そのアセットは使われることはないので削除しても問題はありません。 

    まとめると、安全にアセットを消したい場合は次の2つの条件を満たす必要があるということです。 
    1. 対応するmetaファイルにあるGUIDでプロジェクトフォルダをgrepし、検索結果に他のファイルが現れないこと
    2. Resourcesフォルダ以下にアセットがないこと
    ひとつのアセットを消すのにこれだけの手間がかかるので、アセットの参照関係を忘れてしまうと大変です。覚えていれば、上記の作業を省けます。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityではいくつかの文字コードでスクリプトを書くと問題が起こることがあります。
    UTF-8 BOM付きにしておくと全く問題が起こりません。全てのスクリプトと文字列データをUTF-8 BOM付きにすることでコンパイルエラーや文字化け防ぐことができます。
    (他の文字コードでうまく行く場合もあるようです。)

    Windowsであれば、文字コードがSJISになったファイルを保存していることが普通だと思います。日本語のコメントや文字列をいれたときにUnityのコンパイルがエラーを出すようになった場合、文字コードが原因のことがあります。
    適当なエディター(サクラエディタとか)でエラーが出ているスクリプトファイルを開き、文字コードを 「UTF-8 BOM付き」と指定して保存し直してください。

    いちいちファイルを保存し直すのが面倒だという人はここの記事が参考になるかと思います。 ファイルを更新するたびに自動で文字コードを変換してくれます。

    このページのトップヘ