FreelyApps

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


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

    2015年06月

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity AnalyticsをUnityのバージョン4.x/5.0で入れた場合、5.1にアップデートするときに対応が必要です。公式ではフォーラムにやり方が書いてあります。ここでの説明もこれに則ったものです。英語が読める人は公式ページを見てやっていけば良いと思います。

    手順は以下の通りです。
    1. Unity AnalyticsのSDKを消す
    2. 管理サイトの設定を行う
    3. PlayerSettingsにIDを設定する
    4. スクリプトの修正
    Unityを5.1にした時点でUnityを起動すると、Unity Analyticsに関する警告ダイアログが出ると思います。 Unity AnalyticsのSDKが入っているために出る警告です。これを消すことが最初に行うことです。
    Unity AnalyticsのSDKを全て消します。消すものがどれかは次の全てです。Assets/Pluginsの中にあるはずです。
    • Android/unityengine-cloud-1.0.0.jar
    • iOS/UnityEngineCloudiOS.mm
    • Metro/UnityEngine.Cloud.Analytics.dll
    • Metro/UnityEngine.Cloud.Analytics.Util.dll
    • UnityAnalyticsフォルダ全て
    • UnityEngine.Cloud.Analytics.dll
    • UnityEngine.Cloud.Analytics.Util.dll
    • WP8/UnityEngine.Cloud.Analytics.dll
    これらを消して、Unityを再起動したときに警告ダイアログが出なければSDKの消去は完了です。

    管理サイト上でUnity5.1への対応を行います。既に使っているプロジェクトをそのまま使う場合はプロジェクトの設定ページに行き、対象とするUnityのバージョンを5.1に設定してSaveします。

    管理サイトに載っているProject IDをPlayerSettingに追加されたCloud Project Idというところに入力してください。これを設定することでUnityが自動でAnalyticsを実行します。
    cpid

    スクリプトの対応をしないとおそらくエラーが出ていると思います。
    初期化のために今までUnityAnalytics.StartSDKを呼んでいたと思います。これは必要ないので消してください。

    カスタムイベントやユーザー情報の設定などを行っていた場合は、初期化以外にもエラーが出ているはずです。
    using UnityEngine.Cloud.Analytics;はSDKを消したのでエラーになります。これは全て消してください。代わりにusing UnityEngine.Analytics;が5.1で新しく追加されているので、これを使います。Analyticsクラスの静的メソッドとして今までの処理が実装されるようになりました。
    UnityAnalytics.CustomEventというように書いていたところをAnalytics.CustomEventとすれば正しく動くようになります。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityをインストールする方法についてです。
     
    まずUnityをインストールするためこちらのページからダウンロードする必要があります。 ダウンロードが終わったら実行してウィザードの指示通りに進めていってください。基本的にはデフォルトの設定のままでかまいません。以下のインストールするものをどうするか聞かれるページでExample Projectも入れても良いと思います。
    最低限必要なのは一番上のUnity 5.1.1.f1という本体だけです。Web Playerはウェブブラウザでの実行環境です。これはブラウザ向けのゲームを作らないなら、入れなくてもいいです。Standard AssetsはUnityが用意しているゲーム用の素材集みたいなものです。これは入れておいた方が良いと思います。どれも後で入れることはできます。

    choose-co

    インストールは10分くらいはかかるかと思います。インストールが終わるとUnityを起動できますが、 最初はアカウントのサインイン、ライセンスの選択、アンケートの解答を行わなければいけません。

    起動して最初の画面はサインイン画面です。
     signin

    (Unity5.1ではUnity Accountを作る機能がなくなり、Webページに飛ばすようになっていました。Unity4ではUnity上でアカウントの作成ができました。)
    アカウントの作成はこちらを参考にどうぞ。 アカウント作成サイトにはcreate oneと赤字になっているところをクリックして飛ぶことができます。
    登録したアカウントがあれば、EmailとPasswordにその情報を入れてSign inすれば次に進みます。

    次の画面はライセンス選択画面です。ProfessionalかPersonalかを選びます。
     license

    Professionalを使うにはあらかじめUnityの購入が必要です。シリアル番号を入力して認証するようです。
    Personalは無料で使えるバージョンです。機能的にはProfessionalと同等のものです。多少サービスの内容の質に差があるだけです。個人でUnityを使って稼いだ年間収入が$100000(約1200万円)を超えていなければいつまでも使えます。
    Personalを選択して次に進むを押すと、同意するかというウィンドウが出ます。
    agree
     
    Personalの使用可能条件が書いてあります。使用条件は使用者が個人なのか会社の一員なのかによって微妙に変わります。 いずれの場合も使用条件を満たさなくなったら、Professionalにしなければなりません。

    同意画面が終わったら、アンケートに答える画面になります。
     question

    答えても答えなくても次に進めます。私の場合は、よくわからない質問とかもあったのでわかるものだけ答えて次に進みました。

    これでUnityを使うための最初の設定が終わりました。今後はこの設定はすることはありません。アップデートをするときもこの設定が保存されているので、再度設定する必要もありません。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity4ではモバイル版のAudioClipの圧縮はMP3で行われるようになっていました。MP3はライセンス的に厳しいです。ここに具体例が挙がっていますが、ゲームで5000本以上配布したら$2500という料金というものです。タイトルごとということなので、1作ごとに約30万円程度の利益がでないと赤字です。

    Unity5ではモバイル版のAudioClipの圧縮がOgg Vorbisに変わっています。すべてのプラットフォームでOgg Vorbisがデフォルトになったようです。

    公式の解説はまだ更新が遅れているようで、Unity4のときの解説が残っています。いずれ更新されると思います。
    以下は2015/6/25時点でスクリーンショットを撮ったものです。一番下のPlatform specific detailsという項目があり、モバイルの音データの圧縮はMP3になると書いてあります。

    audioclip-miss

    ライセンス料が発生すると困る場合もあるでしょう。私も困る一人です。
    気になったのでUnityに問い合わせたところ問題なかったということでした。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity Analytics の使い方を説明します。実装についてはUnity 5.1以前のものになります。

    Unity Analytics というサービスがあります。これはUnity で作ったゲームに組み込むもので、ユーザーの情報を取得できるようにするものです。ユーザーの情報といっても個人情報というものではありません。
    ゲーム内の特定の処理を通ったところで通信し、 サーバーにその情報を記録するというものです。ゲームの開発者が任意のタイミングで通信を発生させられるので、どういった使い方をするかによって得られる情報は異なります。
    ごく一般的にはある重要なボタン(ゲーム開始とかツイートするとか)を押したときを記録するといった使い方やゲームのステージクリアごとに記録するということが考えられます。ゲームごとに異なるこのようなイベントをUnity Analytics ではCustom Event というものを使って記録することができます。一人の情報だけではあまり意味がなく大勢のデータを集めて、統計的な情報を得るというのがUnity Analytics の目的になります。

    統計を取ることによってどのような利点があるのかということが知りたくなるでしょう。
    例えば面をクリアして次の面を解放して進行していくゲームの場合、どこまでユーザーは遊んでいるのだろうかということが知りたくなります。あるところで大量のユーザーが遊ぶのをやめている場合、そこは難しすぎたりバグがあったりするのかもしれません。
    純粋にどれくらい遊ばれているのか知る以外にもゲームの改善にも使えます。分析することで発見や予想の裏付けを行うことができることがあります。
     


    Unity Analytics はこのページにリンクがあります。Unity アカウントが必要です。
    管理ページに入ったら、PROJECTSというページの右上にあるAdd Project を押します。
    ua-addp
     
    下のような画面になるので必要な情報を入力します。
    Nameは必須なので、とりあえずここをわかりやすい名前(アプリの名前など)にします。Google API Key は課金の情報をUnity Analytics で取得する場合に使います。私は使いませんので、使用する方はこちらの説明を参照してください。Organization は入力しなくてもUnity アカウントに登録してある情報が自動で入力されると思います。
    Unity Engine Version は4.x / 5.0 を選んでください。(いずれUnity をアップデートしたらそのときにまたそのバージョンでの解説を書こうと思います。今回はUnity 5.0.2 を使っているので、Unity 5.1 以降とは違います。)
     ua-np
    最後に一番下の質問に答えます。Unity Ads でも似たような質問がありました。子供向けに作ったゲーム以外であれば下の方を選ぶことになると思います。Unity Ads の場合と異なり、後で変更できるので間違ってもすぐに直せます。
    登録する情報を書き終えたら、SAVE を押して完了です。



    登録したプロジェクトを選んで、Dashboad の中のINTEGRATION を選ぶと実装についての説明が載っています。これに沿って行けば良いだけですが、英語で書いてあるので一応説明しておきます。
    ua-inte

    まず実装についてはSDK が必要です。(Unity 5.1 以降では必要なくなります。)
    INTEGRATION の初めのページにボタンがあるので、そこからダウンロードしてください。パッケージのインポートが終わったら、
    というコードをゲームオブジェクトにアタッチすれば、Unity Analytics の初期化ができます。
    "Project IDが入ります"と書いてある所には登録したプロジェクトごとに固有のIDを入れます。

    スクリプトをアタッチしたら、Unity Editor 上でゲームを開始してください。BASIC INTEGRATION の5ページ目でUnity Analytics が正しく動いているか確認できます。
    とりあえずここまでがUnity Analytics を使うのに必須です。この状態だとユーザーがゲームをしているかくらいの情報しかとれません。
    この後、行うのがCustom Event(カスタムイベント)というもので開発者が取得したいデータを実装できるものです。

    今回は長くなってしまったので、Custom Event については今度説明することにします。Custom Eventの記事はこちらになります。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    先日リリースした『Pick Up A Diamond』の紹介動画を作ったのでリンクを張っておきます。
    動画の撮影はPC で行っています。音声を録音するため、PC 版で撮影しました。Android 端末の実行画面を取りつつ音も録音できればいいのですが、今のところその方法は知りません。

    Android 4.4 で画面の録画ができるようになりましたし、そのうち録音もできるようになるかもしれません。そうなるとだいぶ楽になります。



     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    FPS を変えるところだけ知りたい方は、横線が引かれた下の部分だけお読みください。

    Unity で作ったゲームはFPS が自動的に設定されます。端末ごとに自動で決まるので意識しないことも多いかと思います。
    FPS は処理の更新頻度と考えることができますが、当然処理が重くなれば高いFPS は出しにくくなっていきます。PC とモバイルの性能差は大きいもので、開発中(PC で作業)のときは問題ないのに実機(モバイル)では動きが滑らかでないということが起きます。 それは描画の処理はハードウェアの仕組みで常に一定のタイミングで変更がなされるためです。(ここでそれについては深く触れないので、Unity で作ったアプリで処理が描画の更新に間に合わなければカクカクした動きになるということだけ認識してください。)
    Unity のFPS は変動するので、可変フレームレートの設計で作らなければいけません。Update 関数の呼び出しのタイミングが一定ではないので、前の呼び出しから何秒経ったかを取得しその時間を考慮して更新を行うということです。例えばキャラクターの移動を(速度)×(Time.deltaTime) の値を足していくことで実現していれば良いのです。このように作られていれば、フレームレート(FPS) を変更してもそのままゲームが動くはずです。 

    Unity でゲームを作れば可変フレームレートの設計になります。更新のタイミングがどうであろうとゲームが動くように作られているなら、FPS の目標値を下げたりする必要があるのかという疑問を思うかもしれません。FPS の目標値が60である場合、FPS は0 ~ 60 までの値を取り得ます。十分に処理に余裕があれば60 の値になり、余裕がないときは10 とかになるでしょう。60 のときは滑らかで10 のときは動きがぎこちない。それを行ったり来たりしてしまうと、非常に見た目が悪くなります。頻繁に低いFPS を取ってしまう場合、処理が重すぎるので目標とするFPS を下げる必要性が出てきます。
    FPS の変動が小さくなればそれほど見た目に差は出ません。目標とするFPS が下がると、当然取りうる範囲が狭くなるので変動する可能性が減ります。また更新頻度が下がることで処理にかける時間を増やすことができます。



    Unity でFPS を動的に変更する方法は以下のようになります。
    Application.targetFrameRate = 30;
    というようにして目標とするFPS を指定できます。60 か30 が無難だと思います。
    もうひとつ変えなければいけないところがあります。QualitySettings のV Sync Count という設定をDon't Sync にしなければいけません。これはハードウェアの画面の更新に更新(Update)をあわせるかという設定なので、あわせてしまうとFPS を設定できません。
    動的に変えられるといってもゲーム起動時に30FPS に設定してあとは何もしないとかでもかまいません。その場合は単にFPS を半分にしているだけなので、QualitySettings のV Sync Count をEvery Second V Blank にするだけでスクリプトで制御しなくても同じことが実現できます。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    6/19に4作目のアプリとして『Pick Up A Diamond』をリリースしました。
    こちらで公開されています。

    PUAD

    ゲームの内容はシンプルなものです。プレイヤー(ボール)を端末の傾きで操作して、ダイアモンドを全て集めるというものです。ステージごとに色々な配置がしてあり、それらをクリアしていくゲームになっています。

    短時間で少しずつクリアするといった暇つぶし用の遊ばれ方を想定しています。いっぺんに遊ぶこともできますが、うまい人だと一時間もかからずに全部クリアできてしまうのではないでしょうか。分量については少ないかもしれないので、アップデートで増やしていくということも考えています。

    Unity 5を使用していて技術的な参考資料として眺めるのも悪くないと思います。広告があるので研究するのに邪魔かもしれませんが、それは広告の出し方を参考にできると前向きにとらえてほしいです。
    Unity 5のグラフィックス機能が全て入っているわけではないですが、Skybox の表現とかはUnity 4にはない表現です。3Dモデルの表示がスタンダードシェーダーになり、物理的に正しいであろう表現に近づいています。反射の表現は結構良いと思います。
    外から見れる機能としてはUnity Ads、Everyplay も実装されています。これらがどういったものなのか知りたい場合、実物を見る方が良いです。Everyplay を使って動画投稿をしている日本製のアプリをあまり見かけないので、Everyplay の実装例となったらいいなと人知れず祈ることにします。
    Everyplay 上でのリンクをここに張っておきます。投稿されている動画や意見交換のページが見れると思います。

    もともとUnity のチュートリアルプロジェクトの『ROLL-A-BALL』を改造して作られたものです。
    見た目はオリジナルのものを少し調整したものなので、そっくりです。私が手を入れたのはジャンプとか加速度センサーを用いた操作性とか障害物を用意したといったことです。中心となる物体を集めるということは同じです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity でAndroidやiOS向けのアプリを作っている場合は画像に圧縮をかけていると思います。ストアにおけるファイルサイズに制限があるので、それに収まるようにするには無圧縮だと厳しいからです。(Androidは50MBまで

    アプリのアイコンに使う画像については圧縮しない方が良いです。 小さいもの(大きくても192x192)なので圧縮されると非常に汚くなりやすいです。アイコンはアプリの見た目の印象を決めるくらい重要なものなので、これを汚くするくらいなら他のところを減らした方が良いと思います。

    アイコンテクスチャを選択し、インスペクターで表示される圧縮フォーマットをAutomatic Truecolor とすれば無圧縮になります。
    nocomp
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『Pick Up』というアプリ名で開発してきたアプリを『Pick Up A Diamond』に変えます。Everyplay にゲーム名の登録をしたときにすでにPick Up は存在していたのです。そのため、Everyplay 上のゲーム名がアプリの名前と食い違ってしまうことになっていました。
    わかりにくいし、間違う元なので名前をもう少し長くして既存のものと異なる名前にしました。 

    名前を変えると色々な所に影響が出てしまいました。アプリ名は表示だけでなく結構重要なものなので気軽に変えることはできないと思っていた方が良いです。
    私の場合は広告の申請を再度することやアプリ名を使っているところをすべて修正する必要がありました。タイトル画面も以下のように作り直しました。

    title
     

      このエントリーをはてなブックマークに追加 Clip to Evernote
    この前の記事はテストをするということでした。
    今回はゲームによって任意のタイミングでEveryplay の録画を開始し、終了するということを実装します。これにより動画にして面白い部分だけを録画することができます。また録画されたくないところを制御するということができます。

    まずは以前は 有効にしておいたEnable test buttons のチェックを外します。これで自動でテスト用のウィンドウが開かなくなります。
    Everyplay の設定はクライアントID、クライアントシークレット、リダイレクトURLとプラットフォームをどれにするかというものを入力している状態になっているはずです。 

    Everyplay の実装は機能をサポートしているか確認、撮影開始、撮影終了、動画確認といったものを入れれば完了です。実装すべきものは以下で赤字にしてあります。

    デリゲートを使ってEveryplayの初期化とサポート端末かのチェックが終了したことのイベントを受け取ります。
    Everyplay.ReadyForRecording += ReadyForRecording;
    上ではvoid ReadyForRecording(bool bReady); という関数を渡しています。Everyplay の初期化等が終わったタイミングでReadyForRecording に引数が渡されて呼ばれるようになります。
    ReadyForRecording 内で機能をサポートしている端末かどうかの判定を行い、どこかにEveryplayが使えるということを保存しておけば良いと思います。  


    わかりづらいと思うので初期化の部分を例として挙げておきます。あとはEveryplay が有効であったら、動画の撮影処理を呼び出せばいいだけです。

    動画の撮影を始めたいところでEveryplay.StartRecording(); を呼びます。これが呼ばれてからEveryplay.StopRecording(); を呼ぶまで撮影が行われます。

    Everyplay.StartRecording(); とEveryplay.StopRecording(); をセットで呼び終えたら、動画の投稿処理を行います。投稿処理といってもEveryplay.ShowSharingModal(); を呼ぶだけです。ボタンを押してからこの関数を呼んでも良いですし、処理の流れで呼んでもかまいません。
    これで一通りの実装が終了になります。

    Everyplay.ShowSharingModal(); を呼ぶと、動画を投稿するためのダイアログが画面に重なって表示されます。ユーザーがこのダイアログ上でSNS の選択をするなどして動画を投稿することができます。

    一度はこのドキュメントに目を通してみてください。足りないところ古いところがありますが、機能的な解説は十分されています。

    このページのトップヘ