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

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

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

【Unity5でレースゲーム】リアルタイムリフレクションでより綺麗に景色を映り込ませる

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

前回は固定のReflection Probeを使用した静的な環境マッピングで車のボディに周囲の景色を映り込ませました。tf.hateblo.jp

この方法はプログラム実行前に反射マッピンング用のキューブマップを焼いておくので実行時の負荷は軽いのですが、前回書いた通り、よく見ると若干ウソっぽい反射なのがバレてしまいます。

今回は、AE86にReflection Probeを載せ、毎フレームキューブマップを更新するリアルタイムリフレクションを試してみました。

まずは、前回と同様Reflection Probeを付けたEmptyオブジェクトを作ります。
なお、GameObject>Light>Reflection Probeでも同じ物が作れます。

次に作ったProbeを自車の子オブジェクトにして車内に配置します。子オブジェクトにする事で、自車と一緒に移動するようになります。
Reflection ProbeコンポーネントのTypeはRealtime, Reflesh ModeはEveryFrame, Time SlicingはAll faces at onceにします。こうする事で、毎フレームキューブマップの全方向のテクスチャーが更新されるようになります。
ただ、負荷によっては必ずしも毎フレーム更新されるとは限らないようで、映った景色が若干ガクガク動きます。

ガクガクは負荷ではなくTime Slicingの設定によるようです。Time Slicingの設定をNo time slicingにすることでキューブマップの全面が毎フレーム更新され滑らかになります。ただし、処理が重いためフレームレートがかなり下がります。Individual facesだと負荷は軽めですが更新がガックガクになるので、All faces at onceがバランスが良いようです。

Importanceは固定Probeより高い値を設定します。(例えば他のProbeが1なら2にするなど。)
こうする事でリアルタイムリフレクションが固定の環境マッピングより優先して適用されるようになります。

Sizeは適当に20m四方にしました。こうする事で自車の近くにいる敵車にもそこそこいい感じのリアルタイム反射が適用されるはずです。

Culling Maskで自車のボディやタイヤがキューブマップに入らないように設定します。
何もしないと右下の球状の部分にタイヤやフェンダーの内側などが映ってしまいます。
f:id:takujidev:20150827215415p:plain

Culling Maskを正しく設定することでそれらがキューブマップ生成用のカメラに映らないようにできます。
f:id:takujidev:20150827215458p:plain

早速走らせてみます。

前回と違い、自車のボディ映る景色が前から後ろに流れています。
また、高架部分の下では高架の暗い色が反射しているのがわかります。

難点は、負荷が非常に高い事です。Clipping Planeを100にして遠くの景色は映らないようにしていますが、それでも重いです。Unityの内部処理的にはカメラを6個追加したような感じなのでしょうか?

f:id:takujidev:20150827222709j:plain
リアルタイム反射無しの場合のフレームレートが35fpsなのに対し、リアルタイム反射を適用すると、
f:id:takujidev:20150827222739j:plain
Unityエディター上で23fpsまで下がってしまいました。また、ボディに映る景色の違いにも注目して下さい。

この重さだと、モバイルデバイスだとリアルタイム反射はちょっと無理かもしれませんね。
実際、デフォールトでモバイル用に設定されているSimpleのQuality LevelではRealtime Reflection Probeにチェックが入っていません。従って、そのままの設定でiPhoneなどで実行すると、
f:id:takujidev:20150829084447j:plain
このように車が真っ黒になってしまいます。
このようになったときは、Edit>Project Settings>QualityのInspectorでSimpleのQuality Levelをクリックし、Realtime Reflection Probeにチェックを入れるとリアルタイム反射が適用されます。
ちなみにiPhone 5だと6fpsくらいしか出ませんでした。

今はもう実行環境としてモバイルデバイスはあきらめかけているので、最悪GeForce GT 650M付きのMacBook Proで30fps出ればOKかなと思っています。

今回はこちらの動画チュートリアルを参考にさせて頂きました。
素晴らしいチュートリアルをありがとうございます!