コンテンツにスキップ

Scale in Lightmap 0 の落とし穴

MeshRendererのScale in Lightmapを0にすると、オブジェクト自体にライトマップは焼かないが、オブジェクトの影はベイクするということができる。これを行うことで小さいためにベイクすることで汚くなってしまうモデルをライトマップから除外しつつベイク影は落とせ、かつライトマップテクスチャの節約になりいいことづくめなのだが一つ問題がある。

Mixed Lightでの挙動

リアルタイムライトとベイクドライトを併用できるMixed Lightモードにおいて、ベイク直後はScale in Lightmapが0のStaticオブジェクトはリアルタイム影はオフになるのだが、なんとビルド時にリアルタイムライトが復活し、ベイクの影とリアルタイム影が2重で重なってしまう。

これはUnity側のバグらしく、少なくともUnity2019では解消されていない・・・。

回避方法

現在のところ、Unityのバグなので直接的な方法でのこのバグの解決方法はない。回りくどい方法だが、ShadowOnlyでベイクするためだけのオブジェクトをコピーして作りEditorOnlyタグをつけてビルド時に含まれないように除外、かつ表示させるオブジェクトはCast shadowをオフにするという方法を取るしかない。

Bakeryでの問題

この回避策を使用するときにBakeryではEditorOnlyタグがついたオブジェクトはベイクされないという仕様なため使えない。しかし、以下の部分をコメントアウトすることでEditorOnlyのオブジェクトもベイクできるようになる。

Assets/Editor/x64/Bakery/scripts/ftBuildGraphics.csの3203行目

1
(obj.tag == "EditorOnly") continue; // skip temp objects

をコメントアウト