ゲーム制作技術録

主にUnity/Godot4関連の技術ブログです

【Unity】【URP12】RendererFeatureを使って遮蔽物に遮られて見えなくなった部分をシルエットで描画する

壁にキャラクターが隠れてしまって見えなくなった時などになるあれです。

Unity 2021.3
UniversalRP 12.1
Forward

シルエット表示

はじめに

新年初記事です。
明けましておめでとうございます。

プレイヤーが見えなくなる問題は結構深刻な問題ですね。

プレイヤーがオブジェクトに遮られて見えなくなると、なんとプレイヤーが見えなくなってしまうのです。

対策が必要ですね。

Layerの設定

見えなくなってしまうと困るオブジェクトのLayerを設定します。

ここではSphereをプレイヤーと仮定して、Sphereが物陰に隠れたら隠れた部分をシルエット表示したいと思います。

Sphereを選択してPlayerレイヤーを設定します。

ちなみにLayerの作成方法、設定方法は解説しません。

マテリアルの用意

シルエットを描画する際の、シルエット用マテリアルを作成します。

今回はUnlitを使用してベタ塗りで描画するようにします。
シルエットなので。色は赤です。

プレイヤーを描画対象から外す

まずはプレイヤーが普通に描画されるのを防ぎます。

Unityversal Renderer DataFiltering欄のOpaque Layer MaskからPlayerレイヤーを外し、Playerレイヤーのオブジェクトをフィルタリングします。

するとPlayerレイヤーのオブジェクトが消失します。
描画から外しているので当たり前ですね。

Renderer Feature を追加する

次はRenderer Featureからシルエットとプレイヤーを描画します。

Unityversal Renderer Dataを編集してRenderer Featureを追加します。
(Experimental) とか書いてありますが気にしません。

シルエット用とプレイヤー用の2つ作成します。

名前はそれぞれ

  • Silhouette
  • Player

とします。

順番はどっちでも良いです。
設定を間違わなければ。

 

肝心の設定はこんな感じになります。

やってることとしては、Depth TestがGreater、つまり手前にオブジェクトがある場合は「Behind Colorマテリアル」で上書き描画し、それ以外は普通にプレイヤーを描画するというものです。

Depth Testで描画を分けている感じです。

実行結果

しっかりシルエット表示されていることが確認できました。

特許

こういった「見えない部分はシルエットで表現する」技術は特許が既に登録されています。

www.j-platpat.inpit.go.jp

参考

tsubakit1.hateblo.jp

r-ngtm.hatenablog.com