UnityのURP(Universal Render Pipeline)において、壁の落書きや床の水たまり、弾痕、キャラクターの足元の影(丸影)などを表現する際、「URP Decal Projector」コンポーネントは非常に重宝します。しかし、デカールを実際に配置した際、「斜面に投影すると画像が不自然に長く伸びて歪んでしまう」「配置した壁の裏側にまでデカールが貫通して表示される」「動いているキャラクターの表面にデカールが張り付いて移動してしまう」「そもそもシーン内にデカールが一切描画されない」といったバグや設定ミスに直面することが頻繁にあります。

これらは、デカールプロジェクターの物理的な「バウンディングボックス(照射範囲)」の設計や、URPにおけるデカールレンダリングの仕組み(DBufferとScreen Space)への理解不足が原因です。本記事では、URP Decal Projectorで発生する歪みや突き抜け、非表示バグの根本原因を解説し、美しくクリーンにデカールを投影するための設定と調整手順を詳しく紹介します。

1. 根本原因①:投射角度と「Angle Fade」のミスマッチ

デカールプロジェクターは、指定された投影方向(ローカルZ軸)に向かってテクスチャを投影します。この投射方向に対して、投影される側のメッシュ(受け皿)の傾斜が急角度(法線と投射ベクトルが直交に近い状態)になるほど、デカールのピクセルは物理的に極端に引き伸ばされ、歪んで表示されます。

例えば、真上から地面に向けて投射しているプロジェクターの範囲内に、直立した壁が存在する場合、その壁の側面には引き伸ばされた奇妙な縦線状のデカールが張り付いてしまいます。これを「デカールのブリーディング(にじみ・突き抜け)」や「角度の歪み」と呼びます。

2. 根本原因②:Z軸(奥行き)サイズが深すぎる設定

Decal ProjectorのSizeプロパティには、幅(X)、高さ(Y)、そして奥行き(Z)があります。Zサイズは「デカールが届く深度」を表します。

このZサイズが過剰に深く設定されていると、壁にデカールを貼り付けた際、その壁を突き抜けて「壁の裏側の部屋の壁」や「壁の裏を歩いているキャラクター」にまでデカールが投影されてしまいます。また、壁の手前ギリギリに配置したはずが、壁の手前を横切るプレイヤーキャラクターの体にデカールがベッタリと張り付いて一緒に動いてしまうバグも、このZサイズ(奥行き)が手前側に飛び出しすぎていることが原因です。

URP Decal Projectorの不具合発生メカニズムと解決アプローチの概要図

図:デカール投影のZサイズ(深度)設定による突き抜けバグと、角度制限による歪み回避の概念図

3. 根本原因③:デカールが一切表示されない原因

デカールを設定しても全く表示されない場合、以下の2大原因が考えられます。

  1. Renderer Featureの未登録:
    URPのレンダリングパイプラインに「Decal」を処理するための機能(Renderer Feature)が追加されていないため、描画コマンド自体がスキップされています。
  2. Receive Decals設定の無効化:
    デカールを受ける側(地面や壁など)のマテリアル、またはShader Graphで「Receive Decals(デカールを受け取る)」のチェックボックスがオフになっているため、デカールがマスクアウトされています。

4. URP Decalの歪み・突き抜けを防ぐ正しい調整手順

これらの不具合を解消し、意図した場所だけにデカールを綺麗に投影するための調整手順は以下の通りです。

ステップ1:プロジェクターのZサイズ(奥行き)を極限まで薄くする

突き抜け(ブリーディング)を防ぐ最も効果的な方法は、デカールプロジェクターのZサイズ(奥行き)を、投影対象のサーフェスがギリギリ収まる最小値に絞り込むことです。

  1. 対象の Decal Projector コンポーネントを選択します。
  2. Size プロパティの Z 値(またはギズモ of 奥行き方向の厚み)を、例えばデフォルトの 1.02.0 から、0.10.05 などの極薄サイズに縮小します。
  3. プロジェクターの位置を壁や床の表面に近づけ、Bounding Boxが壁の表面をわずかにまたぐ(壁の表皮がボックスのちょうど中間になる)ように配置します。

これにより、壁の裏側や手前のキャラクターに投影が届かなくなり、突き抜けバグが完全に解消されます。

ステップ2:「Angle Fade」による急斜面の歪みカット

投射方向に対して角度がある傾斜面にデカールが引き伸ばされるのを防ぐには、Decal ProjectorAngle Fade 機能を使用します。

  1. Decal Projector コンポーネントの Angle Fade パラメータを確認します。
  2. StartEnd の角度(度数法)を調整します(例:Start = 30, End = 60)。
  3. これにより、投射ベクトルと面の法線の角度が指定の角度を超えると、デカールのアルファ値が自動的にフェードアウトし、極端に伸びて歪んだ境界部分が綺麗に消去されます。

ステップ3:動的キャラクターから「Receive Decals」をオフにする

地面に貼ったデカールの上をキャラクターが歩いた際、キャラクターの足や体にデカールが張り付いてしまうのを防ぐには、キャラクター側のマテリアル設定を修正します。

  1. キャラクターが使用しているマテリアル(LitやSimple Litなど)を選択します。
  2. インスペクターの Advanced Options(詳細設定)を展開します。
  3. Receive Decals のチェックボックスを オフ(無効) にします。

これで、そのマテリアルが適用されているオブジェクトはデカールの影響を受けなくなり、プレイヤーキャラクターがデカールまみれになる不自然さを回避できます。

5. レンダリング方式(DBuffer vs Screen Space)の特性比較

URPアセットの Decal レンダリング設定には、2つの方式があります。プロジェクトの描画負荷と求める品質に応じて選択する必要があります。

方式 設定内容 メリットとデメリット
1. DBuffer(デカールバッファ)方式 デカール用の深度・法線バッファを用意し、ライティング計算の前にデカールを合成する。 メリット: ライティングの影響(影や光沢、法線マップ)がデカールにも完璧に適用され、最も美しく自然に馴染む。
デメリット: 追加のビデオメモリ(VRAM)と、モバイル・VR環境では帯域幅負荷が増大する。
2. Screen Space(スクリーンスペース)方式 カメラの深度テクスチャを利用し、不透明オブジェクトの描画後に画面上にデカールを直接焼き付ける。 メリット: 特殊なバッファが不要で、モバイルやVR環境でも極めて軽量に動作する。
デメリット: 屈折や半透明との相性が悪く、ライトの当たり方(特にスペキュラ光沢など)の再現度が落ちる。

6. Shader Graph製カスタムシェーダーでのReceive Decals対応

Shader Graphで自作したカスタムシェーダー(Unlitや独自のライティングモデルなど)では、デフォルトでは「Receive Decals」が機能しないことがあります。Shader Graph内でデカールを正しく受け取るためには、以下の設定を行います。

  1. Shader Graphを開きます。
  2. Graph Settings タブ(右側の設定パネル)を選択します。
  3. マテリアルの設定項目において、Receive Decals のトグルスイッチを有効(True)にします。
  4. マテリアルのビルド時、デカールバッファ(DBuffer)からカラーや法線情報をサンプリングしてライティングにブレンドする処理コードが自動生成されます。

※自作の完全なカスタムUnlitシェーダーなどでデカールの影響を受けたくない場合は、逆にこのトグルをオフにしておくことで、レンダリング負荷を最小限に抑えることができます。