Decal Projectorとは?

Decal Projectorは、テクスチャやマテリアルを3Dオブジェクトの表面に投影する機能です。メッシュを加工せずに汚れ、傷、マーキング、ステッカーなどを表現できます。

代表的な使用例:

  • 地面への影響マーク(爆発跡、血痕)
  • 壁や床のステッカー・落書き
  • キャラクターへのダメージ表現
  • UIを3D空間に投影

Decal ProjectorはUnityのURP(Universal Render Pipeline)固有の機能です。

Built-inレンダラーには存在しないため、URPプロジェクトでのみ使用できます。

事前準備

Decal Rendererの追加

Decal Projectorを使用するには、URPのレンダラーにDecalレンダラーフィーチャーを追加する必要があります。

  1. Projectウィンドウでレンダラーアセット(UniversalRenderer)を選択
  2. Inspectorの「Add Renderer Feature」をクリック
  3. 「Decal」を選択して追加

Decalレンダラーフィーチャーのパラメータ:

パラメータ説明
Techniqueデカールの描画方式(Automatic / DBuffer / Screen Space
Max Draw Distanceデカールが描画される最大距離

DBufferはアルベド・法線・金属感などに影響を与えられますが、プラットフォームによっては非対応の場合があります。

迷った場合はAutomaticで問題ありません。

デカール用マテリアルの作成

デカールには専用のシェーダーを使ったマテリアルが必要です。

  1. Projectウィンドウで右クリック → 「Create > Material」
  2. シェーダーをShader Graphs/Decal(またはURP/Decal)に変更
  3. Base Mapにデカールとして投影したいテクスチャを設定

テクスチャの投影

Decal Projectorの追加

  1. ヒエラルキーで右クリック → 「Rendering > URP Decal Projector」
  2. 作成したDecal Projectorオブジェクトを選択

または、既存のGameObjectにDecal Projectorコンポーネントを追加することもできます。

パラメータの解説

パラメータ説明
Width / Height投影エリアの幅・高さ
Projection Depth投影する奥行き(この範囲内のオブジェクトに投影される)
Pivot投影の基点。デフォルトは中央
Materialデカールに使用するマテリアル
Draw Distanceカメラからの最大描画距離
Fade Factorデカールの不透明度(0で完全透明、1で完全不透明)
Start Fadeフェードが始まる距離の割合

Materialに先ほど用意したマテリアルを割り当てています。

ここから新規に作成することもできます。

基本的な投影手順

  1. Decal Projectorを投影したいオブジェクトの上に配置
  2. Materialに作成したデカールマテリアルを設定
  3. Width / Height / Projection Depthを調整して投影エリアを設定
  4. SceneビューのGizmoで投影範囲を確認しながら調整

Depthの値が小さすぎると、厚みのあるオブジェクトには投影されないことがあります。対象オブジェクトを十分に覆う深さに設定してください。

投影方向はDecal ProjectorのTransformの回転を調整することで、斜め方向や側面への投影も可能です。

応用:TextMeshProの文字列を投影する

テクスチャではなく、TextMeshProで生成したテキストをリアルタイムにデカールとして投影できます。

RenderTextureを中継することで実現します。

仕組み

TextMeshPro → カメラ → RenderTexture → Decalマテリアル → Decal Projector → 3D空間に投影

専用カメラがTextMeshProをオフスクリーンに描画し、その結果をRenderTextureに書き込みます。そのRenderTextureをデカールマテリアルに設定することで、3D空間のオブジェクトに文字を投影できます。

RenderTextureの作成

  1. Projectウィンドウで右クリック → 「Create → Rendering → Render Texture」
  2. Sizeを用途に合わせて設定(例:512×256)

TextMeshPro用カメラのセットアップ

  1. ヒエラルキーに新しいカメラを追加(「Camera」)
  2. Inspectorで以下を設定:
    • Output Texture:作成したRenderTextureを設定
    • Background TypeSolid Colorにして背景を黒(Alpha=0)に設定
    • Culling Mask:TextMeshPro専用のLayerのみを設定

TextMeshProオブジェクトのセットアップ

  1. ヒエラルキーにTextMeshPro(3D Text)オブジェクトを追加
  2. 専用カメラの正面に配置
  3. LayerをTextMeshPro専用のLayer(例:「TextDecal」)に設定
  4. メインカメラのCulling Maskから「TextDecal」レイヤーを除外(メインカメラには映さない)

CanvasRenderModeを変更して、Render Cameraに描画用カメラを割り当てるといいでしょう。

Decalマテリアルへの設定

  1. デカール用マテリアルのBase Mapに作成したRenderTextureを設定

これでTextMeshProに設定した文字列が3Dオブジェクトに投影されます。

スクリプトから文字列を動的に変更する

using TMPro;
using UnityEngine;

public class DecalTextProjector : MonoBehaviour
{
    [SerializeField] private TextMeshPro _textMeshPro;

    // 投影する文字列を変更する
    public void SetText(string text)
    {
        _textMeshPro.text = text;
    }
}

TextMeshProtextプロパティを変更するだけで、RenderTextureの内容が自動的に更新され、投影される文字列もリアルタイムで変わります。

注意点

パフォーマンスへの影響

Decal Projectorは投影範囲内のすべてのオブジェクトに対して追加の描画処理が発生します。大量に配置するとDrawCallが増加するため、以下の点に注意してください。

  • シーン内のDecal Projectorの数を必要最小限にする
  • Draw Distanceを適切に設定し、遠距離での描画を省く
  • 動かないデカールはUpdate処理を持つスクリプトで管理しない

透明マテリアルとの相性

DBufferテクニックを使用した場合、透明(Transparent)マテリアルが設定されたオブジェクトにはデカールが投影されません。

透明オブジェクトへの投影が必要な場合はScreen Spaceテクニックを使用してください。

投影対象の制限

デカールが投影されるのはDecal ProjectorDepth範囲内にあるオブジェクトのみです。

Rendererコンポーネントを持つオブジェクト(MeshRendererなど)が対象で、TerrainParticle Systemには投影できません。

まとめ

Decal Projectorを使うと、メッシュを変更せずにテクスチャを3Dオブジェクトに投影できます。

  • URP専用機能で、Decal Rendererフィーチャーの追加が必須
  • Shader Graphs/Decalシェーダーのマテリアルを使用する
  • 投影方向はGizmoで範囲を確認しながら調整
  • RenderTextureと組み合わせることでTextMeshProの文字列をリアルタイムで投影できる

テクスチャの投影だけでなく、TextMeshProと組み合わせれば動的なテキスト表示にも使えます。

演出やUI表現の幅が広がるので、覚えておくと役に立つかもしれません。