読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Unity5でレースゲーム】車体の下に影を付けて接地感を向上

Unity オープンワールドレーシングゲーム

現在作成中のカーレースゲームですが、建物の影の中に入ると車の影が見えなくなり、下の写真のように接地しているのかいないのか良くわからないのが気になっていました。
f:id:takujidev:20150722202013j:plain

現実の世界では車の下は影の中でもさらに暗く見えるはずです。これはアンビエントオクルージョンと言う方法を使ってCGで再現できるらしいです。

参考:ambientocclusion.hatenablog.com

UnityのスタンダードアセットにSSAO(Screen Space Ambient Occlusion)をするためのスクリプトがスタンダードアセットのEffects>Image Effects>Scriptsの中に用意されているので、早速メインカメラに取り付けて走らせてみました。

確かに車の下に影が付いていい感じになったのですが、フレームレートがずいぶん下がってしまいました。

SSAOを掛けないときは48fpsでした。
f:id:takujidev:20150722203314j:plain
SSAOを掛けると36fpsに下がってしまいました。
f:id:takujidev:20150722203335j:plain

さらに悪いのが、意図せぬところに影ができてなんだか画面が汚くなってしまった事です。
路面に描かれた矢印やラインの周囲に汚い影ができてしまっています。これは元々街のモデルに隙間があるのが原因なのでSSAOが悪いという訳ではないのですが、見た目が良くありません。普通の影も同じようになるのですが、これらのオブジェクトのMesh RendererのCast ShadowsをOFFにしてごまかすことが可能です。
f:id:takujidev:20150722203527j:plain

TravelShooting JPのように影のオブジェクトを車の下に置くことも考えましたが、調べてみるとUnityにはBlobShadowProjectorという便利な物がある事がわかりました。影の投影装置ですね。
これを車オブジェクトの子オブジェクトにして、車の真上に置いて下を向ければOKです。
こんな感じの設定にしてみました。
f:id:takujidev:20150722204926p:plain
車の影の形は四角い方がしっくり来るのでClip Studio Paintで四角を描いてガウスぼかしを掛けてこのようなCookie用テクスチャーを作りました。
f:id:takujidev:20150722205216p:plain
車のオブジェクトに影が落ちないように車のボディにCarBodyというレイヤーを与え、Ignore Layersパラメーターで無視するようにしています。
Near Clip Plane とFar Clip Planeパラメーターで影の濃さや車が地面から離れたときの影の薄くなり方を調整する事ができるようです。
一番最初の絵にBlobShadowProjectorで影をつけるとこうなりました。
f:id:takujidev:20150722205749j:plain
車が宙に浮くにしたがい影が薄くなって行きます。いい感じになるようにNear Clip PlaneとFar Clip Planeパラメーターを調整しました。
f:id:takujidev:20150722210205j:plain
f:id:takujidev:20150722210656j:plain
Blob shadowを付けたときのフレームレートはどうでしょう。
f:id:takujidev:20150722211438j:plain
影を付けていないときと同じ48fpsでした!
また、車の下以外のところに影は付きませんので画面が汚くなる事はありません。

今回の動画です。