ミニマップ実装
RenderTargetをそのまま描写するのは味気ないので一工夫ほしい
一工夫の方法、とりあえず思いつくのは2つ
1.プレイヤー上空からのRenderTargetの部分にエフェクト(ポストプロセス)のせてなんとかする
2. マップ表示専用のオブジェクトを作っておいて(更新して)、そこを映す
2は単純な上に色々凝れたりできそうだけれど、マップの形が変更したら修正しないといけないし、明らかに作業量が増えて面倒くさそうなので、まず1でやってみる
実装したいもの
・マテリアルの変更
・移動可能部と不可能部の境界を描写
・特定オブジェクトの強調
・表示範囲外特定オブジェクトの方向をマップ外に描写
まず、SceneCaptureとRenderTargetを作成して、Widgetに表示するまでの準備をする
SceneCaptureにポストプロセスを載せたいのでCaptureSourceはFinalColorに変更しておく
Tickイベントでプレイヤー位置の上空にいるようにしておく、さらにプレイヤーカメラとYawを同期させておく
・マテリアルの変更
・移動可能部と不可能部の境界を描写
この2つは、Stencilを使用したCustomDepthでできそうなので、プロジェクト設定でStencilを有効にしておく
Stencilの数値は
000(未設定): マップ外
001: 地面(移動可能)
002: 移動不可
ということにして、ポストプロセス用のマテリアルを作成していく
Stencilの値を取得して、それによって色をふりわけるようにする、BPの関数だけで出来るのかもしれないけれど、とりあえずCustomでやってしまった。Switchを使用しているので遅そう
コード
float3 output;
switch(Stencil) {
case 1:
output = c1;
break;
case 2:
output = c2;
break;
default:
output = c0;
break;
}
return output;
このマテリアルを、TargetRenderに適応する
屋内マップで、天井がある場合などは、単に天井のオブジェクトをCustomDepthに書き出さなかったらよい、高低差がある場合や、フロアがある場合はまた考えないといけない
アウトラインを適用させたい番号には、ここから追加で載せていく
次に、特定オブジェクトの強調用アイコンを考える
これも色々やりかたがありそうだけれど、カスタムステンシルをベースに作っているので、特定オブジェクトの位置にミニマップ用にポリゴンを置くみたいなことができる
ただ、ミニマップ範囲が狭い時は、範囲外のアクターの上にあるのも微妙なので、プレイヤーが近づいた場合だけミニマップ用のアクタをスポーンさせるみたいなのでも良さそう、これだと例えば索敵範囲の設定も可能になる
今回は後者を作る、プレイヤーの周囲にでかめにBoxコリジョンを用意して、範囲内範囲外でアイコン用のアクターがスポーンしたりデストロイしたりするようにする
アイコン用アクターは親を変数にしておいて、Tickイベントで位置を同期させる
Minimapでアイコン表示させる特定オブジェクトにはタグを付けておく
最後は範囲外のアイコンを常に表示させる
クエスト目標とかは、ミニマップ外でも常に表示されているとありがたい
基本は上のと同じでいいとして、スポーンデストロイの管理はまた違うとこでやらせる
プレイヤー周囲のBoxコリジョン外にあるときは、コリジョンの境目に移動させる
ただ、今は単にScreenCaptureをそのまま描写しているだけなので、このやり方のままだと枠外にはみ出すアイコンみたいな演出ができない、アイコンと地図のマテリアルは別にして重ねるとかのほうが良いかも
問題点
・メイン操作側のエヘクトとStencil番号が競合する可能性がある
・ポリゴンを表示しているので、記号とかを表示させたいときにちょっと面倒くさい