ずいぶん前 (まだ Unity 5 を使っていた頃) に「Unity 5 でライトマップを別のシーンに再利用する」というのを書いたけど、今試してみると色々変わっていることがあったので書き直すことにしました。
ここで書くことは Unity 2019.3.7f1 で試したのだけど、たぶん Unity 2017 以降 (もしかしたら Unity 5.6以降かも) で通用すると思います。
まず、変更点としては、Unity 5 ではシーンがスタートした後にインスタンスを作成してライトマップのパラメータを変更してもライトマップは適用されず、MaterialPropertyBlock
をセットする必要があったけど、Unity 2019 ではその必要がなくなりました。
つまり、LightmapSettings
の lightmaps
と Renderer
の lightmapIndex
と lightmapScaleOffset
を適切にセットするだけで、ライトマップがその Renderer
に適用されるようになります。
ただし、もうひとつの変更点として、Light
のプロパティで、インスペクタービューでは Mode
と表示されて Realtime
, Mixed
, Baked
の中から選ぶやつが、LightingDataAsset
に保存されるようになったみたいです。
Script Reference をたどると、このあたりの使用変更があったのは Unity 5.6 なので、それ以降の Unity ではちょっと問題が起こる可能性がでてきました。
どんな問題かというと、Light
オブジェクトの Mode
を変更しても、ライトマップを焼くまではその変更が反映されないということです。例えば、次のような場合を考えてみます。
Mixed Lighting を使って、static なライトの情報をライトマップに焼き込みつつ、キャラクターなどの動的オブジェクトの影も落とすような場合で、Bake 用のシーンで static なオブジェクトのライトマップを生成してプレハブを作り、ライトマップを再利用するシーンでプレハブをインスタンス化して使うとします。
この場合、どちらのシーンでも同じライトを配置して、Mode
を Mixed
にするわけですが、再利用するシーンで LightingDataAsset
が作られてないと、Mixed
用のライトとして扱われずに Realtime
用のライトとなって、インスタンシ化したオブジェクトにはライトマップに焼き込まれたライトと Realtime
用のライトが二重に当たってしまうことになります。
回避方法として考えられるのは2つ。
まずひとつは、Bake 用のシーンを「名前を変えて保存 (Save As)」して再利用シーンを作成すること。そうすれば、Bake 用のシーンで作成した LightingDataAsset
に含まれているライトのインスタンスIDと再利用シーンに含まれているライトのインスタンスIDが一致するので、ライトが正しく Mixed
モードとして扱われます。
もうひとつは、再利用シーンでもライトマップを作成すること。これはシーンにライト以外なにもない空の状態で行なってもOKです。ライトを static にして、Mode
を Mixed
にしたあと、ライトマップの生成を行ないます。シーンが空なのでライトマップは何も作成されませんが、LightingDataAsset
には、そのライトが Mixed
ライティング用のものだという情報が書き込まれるので、他のシーンで作ったライトマップを再利用しても問題がなくなります。
個人的には2番目の方法の方が好みです。この方法だと、シーンの初期状態で参照するライトマップがないので、色々なシーンで作成したプレハブを実行時にインスタンス化して動的にマップを構築するのに適しているからです。
ところで、static なオブジェクトをプレハブ化してライトマップを再利用する場合、ライトマップの情報も一緒にプレハブに保存しちゃえばいいんですね。ここのソースが参考になります。
さて、ここからちょっと宣伝ですが、せっかくライトマップでソフトシャドウを焼き込んでも、Mixed Lighting でリアルタイムシャドウを落とすとくっきりな影になってしまって馴染まないですよね。そんなときは Dynamic Shadow Projector と Fast Shadow Receiver がオススメです。
Dynamic Shadow Projector を使うと、キャラクターなどの動的なオブジェクトのソフトシャドウを作ってプロジェクターで投影することができます。
そして、Fast Shadow Receiver を使うとプロジェクターで投影した影とライトマップに焼き込まれた影をきれいにブレンドできるようになります(詳しくはこちらをご覧ください)。