【UE5】PCGで道路同士の重なりを判定して、道路脇の柵メッシュを生成しないようにする
PCGの日本庭園作成中に出くわした問題です。解決方法の備忘録。
通路の両脇に生成する柵ですが、通路同士が交差するようにSplineを配置したとき、柵が出てきてしまって通れなくなってしまうんですよね。困った。
そこで、柵を配置する際に通路と干渉しているかをチェックして、柵を出さないようにする考慮の実装方法です。

やり方
前提として以下の条件の場合で説明します。
・Blueprint ClassにSplineとPCGのコンポーネントを持っていて、
・ワールドにBlueprintを配置して通路を設置する。
1.BlueprintにTagタグをセットしておく
これが一番簡単でしたので。
Blueprintの[Tags]に目印の文字列をセットしておきます。
今回は「BP_Road」という名前を付けておきました。
通路はすべて Tags = BP_Road をセットしておいてください。

2.PCG GraphでTagsを呼び出す
次にPCG Graphを開きましょう。
前提より、BlueprintにPCG Componentがあり、Instanceグループの[Graph]にはPCG Graphアセットがセットされています。
PCG Graphを開きましょう。

[Get Spline Data]スプラインデータを取得ノードを呼び出して、
・[アクタの選択]は[By Tag]にします。
・[アクタ選択タグ]は先ほどBlueprintにセットした[BP_Road]と入力します。

この状態で[Get Spline Data]ノードをデバッグしてみましょう。[A]キーを押します。
するとOutからワールドにタグ付きで設置した全ての通路のSplineが取得できました。結構簡単でしたね。

で、通路の数が多くなると処理数も多くなってしまうので、オプションで色々と簡略化ができます。
自身のオーバーラップを必須にする: 自分自身と干渉するSplineだけ取得してくれます。基本はONにした方がいいです、めっちゃ軽くなります。ただしうまくいかないケースがあるのでその時はOFFに。
複数選択: チェックすると全部取得できます。チェックOFFだと最初に見つかった1本だけ取得します。本使用法においては原則チェックONです。
自己および子を無視: 自分自身を取得しない場合にチェックを入れます。なんかうまくいかないことが多くて私はOFFにしています。
スクショのBlueprintでは[自己および子を無視]しないので、[Get Spline Data]で自分自身のSplineを取得して、[Difference]ノードを使って自分のSplineを除去しています。
・・・という一連の処理を、私は[Get All Roads]というPCG Graphアセットにしています。便利です。
3.柵のメッシュと通路の干渉チェックをする
さていよいよ引き算をします。[Difference]ノードを使います。
柵のメッシュの配置点Pointsをinの[Source]につなぎ、[Get All Roads]のoutをinの[Differences]に接続。
すると道路と重なるPointsが除去されます。

画像だとちょっと通路内に柵が出ちゃっていますが、それは[Get All Roads]の中で道路の領域のBoundsを調整すればそれなりにうまくいくようになります。

4.Boundsの調整
3についてもう少し具体的に言うと[Get All Roads]で最後に[Bounds Modifier]というのをやっているのですが、「干渉チェックする箱のサイズ」を決めています。
可視化して説明すると、自分の柵のメッシュ(4-2)が、自分以外の通路の箱(4-1)と重なったものを除去する。ということを[Difference]ノードがやってくれています
4-1.これが通路としてのサイズの箱です。



