白黒羊

【Unity】URPで2D Lightを使う

Unityの Universal RP で 2D向けの Lightを使ったときの備忘録です。
基本的なことはすべて以下の公式マニュアルに書いてあります。

Introduction to the 2D Lighting system | Universal RP | 12.1.4

英語ですが、使い方だけでなく原理も説明してくれていて面白いです。
本記事は上記公式マニュアル(@12.1.4) の各項目に対応させて書いてあります。

Requirements and setup

2DプロジェクトでURPを使うには、そもそもプロジェクト作成時に2Dテンプレートを選択し、Rendering > URP Asset (with 2D Renderer) で Renderer アセットを作る必要があります。その辺りの手順は公式に書いてある通りなので省略します。

Preparing and upgrading

公式マニュアルの「Preparing…」の項目で、Edit > Render Pipeline > UniversalRP 2D Renderer > Upgrade Project To 2D Renderer をすることでプロジェクト内のすべてのPrefabとMaterialが 2D URPに対応すると書いてあるのですが、Unity Editor 2021.2.14f1 ではEdit以下に「Render Pipeline」を発見できませんでした。

Unity Forumでこれについて質問があり、URP @12.0.0以上では Window > Rendering > Render Pipeline Converter に移されているようです。いずれマニュアルも修正されるのでしょう。プロジェクト全体をURP 2Dに移行するという本来の目的を達成するためには、 Convert Built-in to 2D (URP) を選択すれば良いようです。Initialize Converters をしてから Convert Assets を押します。私の環境では変換しないといけないPrefab / Material がなかったのか、何も起きませんでした。

Window>Rendering>Render Pipeline Converter

Common Lights 2D properties

URP 2D用にプロジェクトがセットアップされていれば、あとは Hierarchy で右クリック > Light > XXX Light 2D を選択するだけで特別なことはありません。

試しにこのシーンのランプの絵が描いてあるところに、

Spot Light 2Dを置いてみると、

全体が黒くなってしまいました。 Sprite-Unlit-Default マテリアルを適用しているキャラクターだけは影響を受けていません。
これでは画面が見えなくて困るので、Global Light 2D も追加で置いてあげると、

ランプの絵のところだけ明るくすることができました。なお、Global Light は一度にひとつしか使えないようです。
ふたつ以上使おうとすると、

More than one global light on layer Default for light blend style index 0

というエラーメッセージが表示されます。

ひとつのGlobal Light 2DDestroy している間に、もうひとつを Instantiate するという使い方でもこのエラーメッセージが表示されたので、何らかの事情でふたつの Global Light 2Dを切り替えたい場合には DestroyImmediate を使いましょう。

そのほか

Normal MapShadowなど、使いこなせれば面白そうな機能がまだまだあるのでまた調べてみようと思います。