ずいぶん前 (まだ Unity 5 を使っていた頃) に「Unity 5 でライトマップを別のシーンに再利用する」というのを書いたけど、今試してみると色々変わっていることがあったので書き直すことにしました。

ここで書くことは Unity 2019.3.7f1 で試したのだけど、たぶん Unity 2017 以降 (もしかしたら Unity 5.6以降かも) で通用すると思います。

まず、変更点としては、Unity 5 ではシーンがスタートした後にインスタンスを作成してライトマップのパラメータを変更してもライトマップは適用されず、MaterialPropertyBlock をセットする必要があったけど、Unity 2019 ではその必要がなくなりました。

つまり、LightmapSettingslightmapsRendererlightmapIndexlightmapScaleOffset を適切にセットするだけで、ライトマップがその Renderer に適用されるようになります。

ただし、もうひとつの変更点として、Light のプロパティで、インスペクタービューでは Mode と表示されて Realtime, Mixed, Baked の中から選ぶやつが、LightingDataAsset に保存されるようになったみたいです。
Script Reference をたどると、このあたりの使用変更があったのは Unity 5.6 なので、それ以降の Unity ではちょっと問題が起こる可能性がでてきました。

どんな問題かというと、Light オブジェクトの Mode を変更しても、ライトマップを焼くまではその変更が反映されないということです。例えば、次のような場合を考えてみます。

Mixed Lighting を使って、static なライトの情報をライトマップに焼き込みつつ、キャラクターなどの動的オブジェクトの影も落とすような場合で、Bake 用のシーンで static なオブジェクトのライトマップを生成してプレハブを作り、ライトマップを再利用するシーンでプレハブをインスタンス化して使うとします。

この場合、どちらのシーンでも同じライトを配置して、ModeMixed にするわけですが、再利用するシーンで LightingDataAsset が作られてないと、Mixed 用のライトとして扱われずに Realtime 用のライトとなって、インスタンシ化したオブジェクトにはライトマップに焼き込まれたライトと Realtime 用のライトが二重に当たってしまうことになります。

回避方法として考えられるのは2つ。

まずひとつは、Bake 用のシーンを「名前を変えて保存 (Save As)」して再利用シーンを作成すること。そうすれば、Bake 用のシーンで作成した LightingDataAsset に含まれているライトのインスタンスIDと再利用シーンに含まれているライトのインスタンスIDが一致するので、ライトが正しく Mixed モードとして扱われます。

もうひとつは、再利用シーンでもライトマップを作成すること。これはシーンにライト以外なにもない空の状態で行なってもOKです。ライトを static にして、ModeMixed にしたあと、ライトマップの生成を行ないます。シーンが空なのでライトマップは何も作成されませんが、LightingDataAsset には、そのライトが Mixed ライティング用のものだという情報が書き込まれるので、他のシーンで作ったライトマップを再利用しても問題がなくなります。

個人的には2番目の方法の方が好みです。この方法だと、シーンの初期状態で参照するライトマップがないので、色々なシーンで作成したプレハブを実行時にインスタンス化して動的にマップを構築するのに適しているからです。

ところで、static なオブジェクトをプレハブ化してライトマップを再利用する場合、ライトマップの情報も一緒にプレハブに保存しちゃえばいいんですね。ここのソースが参考になります。

さて、ここからちょっと宣伝ですが、せっかくライトマップでソフトシャドウを焼き込んでも、Mixed Lighting でリアルタイムシャドウを落とすとくっきりな影になってしまって馴染まないですよね。そんなときは Dynamic Shadow ProjectorFast Shadow Receiver がオススメです。

Dynamic Shadow Projector を使うと、キャラクターなどの動的なオブジェクトのソフトシャドウを作ってプロジェクターで投影することができます。

そして、Fast Shadow Receiver を使うとプロジェクターで投影した影とライトマップに焼き込まれた影をきれいにブレンドできるようになります(詳しくはこちらをご覧ください)。

イメージとしてはこんな感じになります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Anti Spam Code *