FreelyApps

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


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

    タグ:グラフィックス

      このエントリーをはてなブックマークに追加 Clip to Evernote
    通常はカメラは1つでゲームを作ることができます。Unityで新しいシーンを作れば、Main Cameraが作られていてこれをそのまま使うだけで物体の表示が可能です。

    複数のカメラを使うと単体のカメラではできない表現が可能になります。例えば一部のオブジェクトを常に前面に表示したり、画面を上下で分けた2P対戦といったことが可能です。
    これはCameraコンポーネントのプロパティのうち、Clear Flags、Culling Mask、Viewport Rect、Depthをいじることで実現できます。 (画面の分割についてはViewport Rectを適切に設定したカメラを複数用意しておくだけで実現が可能なのでここでは詳しく取り上げません。)

    一部のオブジェクトが常に前面に表示するということを今回は試してみたいと思います。 といってもよくわからないのでまずは結果を示します。
    uc-aftereye uc-default

    左の方は最終的に得られた結果です。右の方は1つのカメラ(通常の表示ということです。)でユニティちゃんを表示したものです。
    前者は眉毛が髪に隠れないで表示されています。(アニメ的な表現らしいです。目が見えると印象がはっきりしていますね。)
    目と眉毛が他のモデルよりも後に描かれることでこのように前面に表示することができます。とくにプログラムで制御せずに設定を変えることでこのような表示が可能です。


    ヒエラルキーの構成は以下の通りです。unitychanはユニティちゃんモデルのプレハブを置いただけで、Directional Lightも単なる光源です。Main CameraとSubCameraがあるのがポイントでSubCameraが前面に表示するオブジェクトだけを描画するカメラです。Main Cameraがすべてのオブジェクトを描画した後で、SubCameraが特定のオブジェクトを上書きすることでそのようになります。
    uc-2cam-hi

    Main CameraとSubCameraの設定は以下の通りです。
    uc-2cam-hi-main uc-2cam-hi-sub

    Main CameraとSubCameraは同じ位置にいるように設定し、Main CameraとSubCameraのCameraの設定は基本的に同じです。これは同じもの対象として描画しているためです。
    Main CameraではClear FlagsがSkyboxであり、Skyboxで以前の結果をリセットしています。これはMain CameraのDepth(カメラ同士の描画の順番のこと。Depthという名前はややこしい。)が-1であり、SubCameraよりも先に描かれるためバッファクリアの処理を指定しています。描画物の制限も特に行わず全てのものが描画されます。(最初に示した通常の絵が描かれているということ)
    SubCameraはMain Cameraの後に描画したいため、Depthの値が0で大きくしてあります。SubCameraはMain Cameraの描画結果を消してしまわないようClear FlagsにはDepth onlyが指定されています。これによりデプス(深度、Zとも)がクリアされ、SubCameraの描画結果は上書きされます。特定のゲームオブジェクトを描画するためにCulling Maskが設定されています。Subというのはレイヤーの名前です。

    ユニティちゃんモデルを構成するゲームオブジェクトのうち目と眉毛のもののレイヤーをSubにすれば、それだけがSubCameraでも描画されることになるということです。
    SubCameraの描画しているものはこんな感じです。
    subcamera-eye

    unitychanはモデルなので、複数の階層で構成されています。以下で選択されているものが目と眉毛の表示に関係するレンダラーをもつゲームオブジェクトなので、それらのレイヤーをSubにします。
    uc-2cam-hi-model

    以上の設定すると最初に載せた絵が作れます。
    uc-aftereye

    この方法はお手軽ですが、欠点もあります。言わなければ気付かないかなーと思いましたが、モデルを動かしたりするとすぐにバレるので言っておきます。
    SubCameraにとっては目と眉毛のオブジェクトしか見えないため、顔のモデル(頬とか鼻とか)に隠れて欲しい左目が表示されてしまいます。またモデルの作りによりますが、前面に表示したためにユニティちゃんの目がおかしくなります。
    この解決はかなり大変です。モデル自体がメッシュの前後関係を変えても破綻しにくい作りになっていること、描画する物体がカメラにとって表側に向いているかの判定をカスタマイズするといった対応が要ると思います。
    uc-aftereye-bug

    最後にユニティちゃんを回転させた動画を載せておきます。モーションさせたり、動かしたりするといろいろ問題が出てきます。(左の方の滲みは画像の都合なので無視してください。)
    uc-2cam-anime

    今回はモデルを使って見た目を変えてみましたが、ゲームでは重要なものを目立たせるといった使われ方があるでしょう。

    © Unity Technologies Japan/UCL

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

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

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

      このエントリーをはてなブックマークに追加 Clip to Evernote
    GI(Global Illumination) はUnity 5 から使えるようになったライティングの機能です。
    光源からの光が物体に当たり、物体が反射する光がさらに周りの物体を照らす様子を再現するという機能です。
    具体的に言うと、青い立方体に白い光を当てた時周りにある物体は白い光と青い立方体が反射した青い光が当たりうっすらと青くなるということが起きます。どれくらいの影響があるかは反射光の相対的な強さ次第なので、調整が必要です。
    GI を使えば万能かというと違います。なぜならGI は現実の法則に則っていないからです。物理的な法則を計算するには計算しなければならないことが多すぎて現実的な時間では解けないのです。そのため、それらしい絵を作ることができるのがGI ということになります。

    GI の説明をしたところでなんですが、今回はGI を無効化する話になります。Unity 5 ではデフォルトでGI が有効になります。シーンごとにこれは設定できるものです。GI 自体もそれなりに重い処理なので、あらかじめテクスチャに計算結果を書き込んでおきそれを実行時に使うということをして高速化を図っています。
    そのテクスチャはシーン内の情報を書き込んだものなので、かなり大きなテクスチャになりがちです。シーンを多用したモバイル向けのアプリではこれを見過ごすことができないくらいの容量になっていくと思います。(私の場合だとシーンごとで1MB くらいとっていました)

    アプリの大きさが大きくなるのは提出できなくなる恐れもあるので困ります。Google Play に提出するなら50MB が限度です。描画の質を下げたとしてもGIを切ることで容量制限を回避できるので、GIを切ろうということになります。以下がその手順です。



    Menu からWindow->Lighting を選びます。

    lighting-window

    Lighting Window が開くので、ここのPrecomputed Realtime GI とBaked GI のチェックを外します。

    invalid-gi

    これによりGIを実行しなくなり、ビルドした後のファイルにGI用のテクスチャが作られなくなります。GIは当然機能しなくなりますが、出来上がったファイルの容量は小さくなります。

    AndroidやiOSではGIを切った方が容量的な問題を回避できるため、切っておいた方が良いと思います。GI用のファイルが作られる条件というのは、Lightmap Static なゲームオブジェクトがいる場合などになりますが、良くわからなければLighting Window から設定した方が簡単です。 【GI(Global Illumination) を無効化する】の続きを読む

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unityではシーンにライトを置いてShadowの設定を行えば、影が出ます。
    LightコンポーネントのShadow TypeがNo Shadows出なければいいということです。

    エディター上で確認しているときはオブジェクトの動きに合わせて影が表示されるはずです。
    これをAndroid用に出力して実機で見ると、 影が出ていないということが起きます。

    Quality Settingsで影を無効にする設定があるので、それを確認すると直ることがあります。
    影を出さなければその分処理が速くなります。画面の質と処理のどちらをとるかという設定をするところなのでこのような設定ができます。

    Quality Settingsではゲーム全体に対する有効・無効を設定できるので、 影が出るはずにもかかわらず全ての場所で出ないとすれば、その設定が原因の可能性が高いです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『走れユニティちゃん!』のアップデートを行いました。
    ver.1.1.0になります。

    更新したことは前回の記事で挙げたように敵にぶつかっても操作不能にならない条件を追加したことです。

    unitychan-KR-ver1.1.0

    上の画像の左上のところにハートの絵が出ています。
    これがHPのようなものです。HPが0でもゲームオーバーにならないですが、敵に当たると操作不能になります。
    HPがあるときは敵に当たってもそのまま走り続けられます。



    今回、アップデートについて一番大変だったのが画像の用意です。
    ハートの画像なのですが、自分で描いています。
    『走れユニティちゃん!』の絵は、基本的にユニティちゃんの公式ページからDLできるパッケージから持ってきています。
    その中にはハートの画像が含まれてなく、自前で何かを用意する必要がありました。
    フリー素材で使いやすそうなものがなかったため、自分で描くということを選びました。

    heart.png

    これを作るときに使ったエディターがあります。
    EDGEというツールです。
    ドット絵を描くためのツールでフリーソフトです。
    インストールがファイルの解凍だけですし、直感的に使えるので良いと思います。
    また解説動画などが多いので、困ったことがあっても調べられます。

    なんとかハートっぽい絵が描け、そんなに違和感なく馴染んでいると思います。
    このハートの絵を描くのに2時間くらいかかってます。
    時間がかかりすぎなのにそこそこの出来です。

    絵を描いて用意するというのはやはりハードルが高いです。
    納得いく絵やゲームに合ったものを使いたいということは当然あるのですが、それを行うには自分で描くしかありません。
    ただ見た目にこだわりすぎてもゲームができるわけではないので、ほどほどにしておくことが必要です。

    自分で絵を描いてみることで難しいということを実感しました。
    体験することで次回以降どうしようかと考えさせられるのだと思いました。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ロゴを作ろうと思ってペイントソフトを調べていました。
    色々なものが見つかり、すぐに使えるようにはなりそうもありませんでした。
    時間をかけて使えるようになる必要がありそうです。

    ロゴに求めることは以下のことです。
    1.FreelyAppsと表示されている
    2.いかにも手抜きと思われない
    3.ゲームをしたいと思わせられれば

    1があるのでどのように文字を出すかということを考えました。
    絵を描くと難しいので、Unity上でオブジェクトを並べてロゴができないかな~と思って……やってみました。
    アイコン

    シーン上でCubeをたくさん用意し、それが文字列に見えるように配置していくだけです。
    時間はかかりましたが、ライティングがなされたりしてまずまずの見え方になります。
    Cubeの一つ一つにRigidbodyをくっつけたりすると、崩れていくアニメーションができたりします。
    Unity内のゲームオブジェクトなので、色々と制御できるわけです。

    リリースするアプリではアニメーションは使わないと思います。
    使う場合はここで表示しているように静止画を使うと思います。
    それは初期化のところで出すのが最も都合が良いと考えているからです。
    初期化の処理によっては画面が固まってしまうようなことがあります。
    それでも不自然にならないためには、画面が止まっていなければなりません。
    したがって、もったいないですが絵として保存したものを実際には使用することになります。

    私としては、結構うまくいったというところですが、いかがでしょう。

    このページのトップヘ