【UE5】 隠れている部分をシルエット表示する方法
プログラマーの尾関です。今回は隠れている部分をシルエット表示する方法について解説をしたいと思います。
- 確認バージョン:Unreal Engine 5.4.2

プロジェクトの作成
プロジェクトは「トップダウン」のテンプレートだとキャラが遮蔽物に隠れる挙動が確認しやすいので、これを使います。

プロジェクトの設定
シルエットを実装するには「カスタム深度」を有効にする必要があります。
メニューの「編集 > プロジェクト設定」を選びます。

検索欄に「customdepth」と入力して、「ポストプロセス > カスタム深度ステンシルパス」を「Enabled with Stencil」にします。

ポストプロセスとカスタム深度/カスタムステンシルについて
シルエットを実装するにはカスタム深度についての理解が必要となるので、簡単に実験をします。
コンテンツドロワーで「bp_topdown」で検索するとキャラクターBPが見つかるのでこれを開きます。

「BP_TopDownCharacter」を開いたら、詳細タブから「Mesh > Render CustomDepth Pass」にチェックを入れ、「Mesh > CustomDepth Stencil Value」に「1」を設定します。

レベルエディタに戻って「BP_TopDownCharacter」をレベルに配置します。

そして「ライティングあり」をクリックして「バッファビジュアライゼーション > カスタムステンシル」を選びます。
(※ UEのバージョンによっては、「バッファビジュアライゼーション」が「バッファを可視化」という項目になっていることもあります)

すると以下のような表示になり、キャラクターに「カスタムステンシル」の「1番」が適用されていることがわかります。

シーン深度について
また、遮蔽部分で重なっている部分は「シーン深度」を使って判定します。
シーン深度を理解するために再びライト設定から「バッファビジュアライゼーション > シーン深度」を選びます。

すると真っ暗になってしまいましたがこれには理由があります。

右クリックしながら「Sキー」を押すなどしてカメラを引きます。
するとフォグのようなものがかかった見た目になります。

シーン深度は「遠くなるほど値が大きく」なる値で、UEのレベルエディタ上の見た目では「白」に近づきます。

つまりデプス(深度)値を使うことで、そのオブジェクトが遮蔽物より手前または奥にあるかどうかを判定できます。
- カスタム深度(キャラの深度) がシーン深度よりも “小さい” 場合 →遮蔽物より手前にある
- カスタム深度(キャラの深度) がシーン深度よりも “大きい” 場合 →遮蔽物よりも奥にある
シルエットマテリアルの作成
深度の説明をしたので、実際にマテリアルを作成します。
名前は「M_Silhouette」としました。

マテリアルを開いて詳細タブから “Material Domain” を「Post Process」にします。今回のマテリアルはポストプロセスで処理するためです。

マテリアルのグラフを以下のように組みます。

なお SceneTextureノードは「CustomStencil」「PostProcessInput0」「CustomDepth」「SceneDepth」というように、それぞれ異なる設定となっているので、詳細タブから正しく設定する必要があります。

少し難しいマテリアルなので、簡単に説明すると「上のブロック」では本来のモデル描画とカスタムステンシルを合成しています。ここはシルエットまたは本来のキャラクターの合成を行っています。

下のブロックについては重なり部分を求める処理です。「シーン深度」の項で説明した通り、プレイヤーと遮蔽物の前後関係を調べています。
プレイヤーが遮蔽物に隠れていたらシルエット表示を優先し、そうでなければ通常のキャラ表示を行います。

カメラのポストプロセスマテリアル設定
作成したマテリアルは、深度に関するポストプロセスなので、カメラに設定します。
「BP_TopDownCharacter」を開いてコンポーネントからキャラクターにアタッチしているカメラを選びます。

詳細タブから “postprocess” で検索して、「ポストプロセス > Rendering Features > ポストプロセスマテリアル > Array」のところで+ボタンをクリックするなどして、”M_Silhouette” マテリアルを設定します。

後は実行して動作確認をします。
キャラクターが遮蔽物に隠れると、その部分がシルエット表示になります。
