Unity6で新規プロジェクトを作るとビルドがやけに長い時の対処法。ネタバレ:Forward+はシェーダーコンパイルが長いよ。

Unity6で新規URPプロジェクトを作ると、ビルド時間がやけに長く、
ログを見るとシェーダーコンパイルが遅くなっていることが分かります。
(以下、実測結果はM1 Max MacBook Proによるもの)

Unity2021LTS(2021.3.43f1)、Unity2022LTS(2022.3.47f1)、Unity6(6000.0.20f1)の3バージョンで、
それぞれ新規URPプロジェクトを作成します。
Shader Graphで空のLit Shaderを作り適当なシーンに配置、
何もキーワードがないと流石に一瞬で終わってしまうため適当にGraphics設定をいじります。

Standaloneビルドを行い、先ほど作った空のShader Graphのコンパイル時間をログから調べると以下のようになりました。

2021と2022はほぼ同じ・・・とは言えない差が出てしまっていますが、
問題は2022と6の差、空のShader Graphにも関わらず2倍もの差がでてしまっています。
実験できていないのですが、複雑なShader Graphになるほど(variant数が増えるほど?)さらに差が広がる印象です。

原因

Unity6では新規URPプロジェクトを作った時にForward+ Renderingが使用されます。
Forward+自体はUnity2022でも使えますが、新規プロジェクトではForwardが使用される設定になっていました。
この違いから、ちょっとしたシェーダーを書いた時のコンパイル時間が倍以上になっています。

対処法1: Forward Renderingに戻す

「別に今まで通りのForward Renderingで間に合ってます・・・」という方向け。

方法

Universal Renderer Dataの設定でForward Renderingに戻すことができます。

実測

すると、約40秒とUnity2021LTSよりコンパイル時間が短くなります。(なぜ?)

対処法2: ライト数を減らす

「せっかくUnity6なんだからForward+は使いたい!けどいくらなんでもビルドが長すぎる。」という方は、
使えるライト数の制限することでコンパイル時間を短くすることができます。
引用元:Unity Discussions: Improve shader compilation time using the URP Config Package

Forward+は、1つのカメラにつき256個のライトが使えます(デスクトップの場合。モバイルは32個。)が、
そのライト数を減らすことでコンパイル時間が短くなるそうです。

方法

  • "/Library/PackageCache/com.unity.render-pipelines.universal-config" を "/Packages/com.unity.render-pipelines.universal-config" にコピーする。
  • その中の "Runtime/ShaderConfig.cs.hlsl" と "Runtime/ShaderConfig.cs" に書いてあるライト数を変更する。
  • Unityを再起動。

実測

ライトを半分の128個に制限した場合は約140秒
ライトを32個に制限した場合は約50秒という結果になりました。