【VRChat】ワールドのライトが焦げるときの対策【Unity2019】

この記事ではUnity2019におけるVRChatワールドのライトベイクについて、うまくいかないときの考えられる原因と対策をまとめたものです。私が経験したことしか書いてません。使っているBlenderは2.91です。

ライトベイクの基本

ライトベイクするならまずこの記事を読んでその通りにやってください。だいたいうまくいきます(書かれたのはUnity2018時代ですが2019でも一緒です)。

Unity2018でLightmapを綺麗にBakeする! (k-youhinten.com)

それでもうまくいかないときは以下の点を確認してみて下さい。

 

ライトベイク確認事項

特殊なシェーダーやmobileシェーダーを使っている

一部のシェーダーはライトマップに対応していない?ようです。Standardに変えてライトマップが正常に表示される場合はシェーダーの問題だと思います。シェーダー書ける人は中身をいじってどうにかできるかもしれませんが、できない場合そのシェーダーをライトベイクするオブジェクトに使うことをあきらめるしかありません。私はあきらめました。

オブジェクトの面が裏になっている

面が裏(Blenderでいうと赤くなってる方)だとライトを焼けません。面を裏返すか裏面を作りましょう。

SkinnedMeshRendererコンポーネントを使用している

SkinnedMeshRendererはライトベイクがうまくいかないことがあるようです(私はSkinnedMeshRendererをMeshRendererにしたら直ったことがある)。シェイプキーとかボーンの入っているオブジェクトには注意。

Materialでテクスチャのタイリングを設定している

Materialのパラメータでテクスチャのタイリングの数値をいじるとライトマップが反映されなくなることがあったような気がします。気のせいかもしれない。タイリングの数値を戻してライトマップが正常に反映されればそれが原因です。どうしてもタイリングが必要な場合はUV展開をやり直した方がいいでしょう。

UV展開に問題がある

何をどうやってもライトが焦げるときはだいたいこれのせい。UVに重なりがあると焦げます。たとえば、Blenderでミラーモデファイアや配列モデファイアをデフォルトの設定のまま使うと、複製された部分のUVがぴったり同じ位置に重なります。

こうなるといくらライトベイクの設定をいじっても焦げます。なので、ライトを焼く予定のオブジェクトのUVは重ならないようにしましょう。

では具体的にどうすれば回避できるかというと、ミラーモデファイアと配列モデファイアの場合は以下の設定にします。

ミラーモデファイア

「データ」→「ミラーU」または「ミラーV」にチェック、値を1(または-1)に設定→モデファイアを適用する

Uだと横に、Vだと縦にUVが並びます。両方1にすれば斜めに並びますが、どっちかでいいと思います。

 

配列モデファイア

「UV」→「オフセットU」または「オフセットV」にチェック、以下同文。

モデファイアによって微妙にパラメータの名前が違いますがやってることは一緒です。これらのモデファイアを併用する場合は、どっちかをUにしてどっちかをVでやると綺麗に並べられます。

 

とはいえ、市販の3Dモデルの中にはテクスチャの領域を節約するためにUVを重ねているものも多いかと思います。これらのUVやテクスチャを編集しなおすのは骨が折れると思うので、重なっている部分はオブジェクトかマテリアルを分割すれば焦げなくなる、ような気がします。試したことないのでわかりません。誰か検証して。

 

あと単色とかシームレステクスチャのモデルはUV展開をやり直しても見栄えはほとんど変わらないのでそういう奴は修正しちゃいましょう。手っ取り早いのはキューブ投影とかスマートUV投影です。UV展開について詳しいことは私もよく分からないので調べてください。

Lightオブジェクトを作り直してみる

たまに、「さっきまでうまくいってたのに突然焦げた」ってことがあります。そういうときはLightコンポーネントをコピーしてLightオブジェクトを削除し、新しくLightを作ってパラメータをペーストしてみると直ることがあります。