ちょっと長いので先に要点を書いておくと、「ライトマップを再利用するためには MaterialPropertyBlock を書き換える!」です。

Unity 3.5で作られた古いプロジェクトをひっぱりだしてきて、Unity 5に移行する作業をしていたのですが、困ったことがおこりました。

このプロジェクトではライトマップを焼くためだけのシーンがあって、そこで作ったライトマップを別の複数のシーンで再利用していて、Unity 3.5ではLightmapSettingsとRendererのlightmapIndex, lightmapScaleOffsetを適切にセットしてやれば全然問題なかったのですが、Unity 5.4ではうまくいきません。

ライトマップを使いまわすコードは以下のようなものでした。これをアッセトとして保存しておいて、Load関数やAppend関数を使ってライトマップを使いまわしています。

Unity 3.5では(たぶん Unity 4でも)、Editorスクリプトを使って上のスクリプトをエディタ上で適用してやれば、書き換えられた情報はシーンに保存されて、その後は何もしなくてもよかったのですが、Unity 5.4では2つの問題がありました。

  1. エディタ上で上のスクリプトを適用するとライトマップが有効になるが、LightmapSettingsがシーンに保存されず、シーンをリロードするとライトマップがはがされてしまう。またシーンを実行してもライトマップがはがされてしまう。
  2. シーンを実行後に上のスクリプトを適用してもシーンに反映されない。

どうもUnity 5ではライトマップ作成時にできる LightingDataAsset がシーンに関連付けられていて、その情報がシーンに適用されるようです。なのでLightmapSettingsはシーンに保存されず、リロードするとライトマップは消えてしまうわけです。

今のところ LightingDataAsset をスクリプトで編集することはできなさそうなので、次のような [ExecuteInEditMode] をつけたスクリプトを使って毎回ライトマップの情報をロードすることにします。

これでエディタ上ではライトマップが反映されるようになったのですが、まだシーンを実行するとライトマップがはがされる(正確にはライトマップが崩れる)という問題が残っています。

どうもライトマップの情報はシーンがロードされた時点で MaterialPropertyBlock に格納され、それ以降にライトマップの情報を書き換えてもライトマップが更新されないようです。ためしに、上記の LightmapSettingsSaveData クラスに MaterialPropertyBlock を書き換えるコードを加えたら無事ライトマップが適用されるようになりました。こんな感じでいけるかと思います。(Unity 5.4用です。Unity 5.3以前だと変数名が違うので注意!)

コメントを残す

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

Anti Spam Code *