プログラマーの尾関です。今回は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」をレベルに配置します。(※これは確認用なので実際にゲームを動かすときには不要です)
そして「ライティングあり」をクリックして「バッファビジュアライゼーション > カスタムステンシル」を選びます。
- (※) UE5.3では「バッファを可視化」という項目名でしたが、UE5.4からは「バッファビジュアライゼーション」という項目名になったようです
すると以下のような表示となり、「カスタムステンシル」の「1番」がキャラクターに適用されています。
このように特定の描画物の「抜き」の部分を作れるのが「カスタムステンシル」の特徴となります。
シーン深度について
また、遮蔽部分で重なっている部分は「シーン深度」を使って判定します。
シーン深度を理解するために再びライト設定から「バッファビジュアライゼーション > シーン深度」を選びます。
すると画面が真っ暗になってしまいましたが、これには理由があります。
右クリックしながら「Sキー」を押すなどしてカメラを引きます。
するとレベル全体に対して、フォグのようなものがかかった見た目となります。
シーン深度は「遠くなるほど値が大きく」なる値で、UEのレベルエディタ上の見た目では「白」に近づきます。
つまりデプス(深度)値を使うことで、そのオブジェクトが遮蔽物より手前または奥にあるかどうかを判定できます。
カスタム深度(キャラの深度) が シーン深度よりも “小さい” 場合 |
→ | 遮蔽物より手前にある |
カスタム深度(キャラの深度) が シーン深度よりも “大きい” 場合 |
→ | 遮蔽物よりも奥にある |
シルエットマテリアルの作成
深度の説明をしたので、実際にマテリアルを作成します。
名前は「M_Silhouette」としました。
マテリアルを開いて詳細タブから “Material Domain” を「Post Process」にします。今回のマテリアルはポストプロセスで処理するためです。
マテリアルのグラフを以下のように組みます。
なお SceneTextureノードは「CustomStencil」「PostProcessInput0」「CustomDepth」「SceneDepth」というように、それぞれ異なる設定となっているので、詳細タブから正しく設定する必要があります。
少し難しいマテリアルなので、簡単に説明すると「上のブロック」では本来のモデル描画とカスタムステンシルを合成しています。ここはシルエットまたは本来のキャラクターの合成を行っています。
下のブロックについては重なり部分を求める処理です。「シーン深度」の項で説明した通り、プレイヤーと遮蔽物の前後関係を調べています。
プレイヤーが遮蔽物に隠れていたらシルエット表示を優先し、そうでなければ通常のキャラ表示を行います。
カメラのポストプロセスマテリアル設定
作成したマテリアルは、深度に関するポストプロセスなので、カメラに設定します。
「BP_TopDownCharacter」を開いてコンポーネントからキャラクターにアタッチしているカメラを選びます。
詳細タブから “postprocess” で検索して、「ポストプロセス > Rendering Features > ポストプロセスマテリアル > Array」のところで+ボタンをクリックするなどして、”M_Silhouette” マテリアルを設定します。
後は実行して動作確認をします。
キャラクターが遮蔽物に隠れると、その部分がシルエット表示になります。
シルエット表示の使い道について
このシルエット表示は、遮蔽物の多い TPS でプレイヤーを見失わないようにするために役立つ方法だと思います。
また隠れている敵をスキルによってシルエット表示する、といった使い方も考えられますね。
以上、UE5でのシルエット表示の実装方法でした。