【UE5】PCGでLandscape Splineを取得して道沿いの草木を除外する方法
UE5のPCG(Procedural Content Generation)フレームワークを使用して、Landscape上に草や木を自動配置する際、**「Landscape Splineで作成した道の上には木を配置したくない(除外したい)」**というケースがよくあります。
この記事では、Landscape SplineのデータをPCGで正しく取得し、指定した範囲のポイントをきれいに除外するまでの具体的なステップと、つまずきやすい「2つの罠」の解決方法を解説します。
動作確認環境
- Unreal Engine 5 (PCGプラグイン有効化済み)
Step 1: Landscapeアクターにタグを設定する
Landscape Splineは通常のBlueprintのSplineとは少し扱いが異なります。まずは対象となるLandscapeアクターをPCG側で見つけられるようにタグを付けます。
- アウトライナーからスプラインを作成した
Landscapeアクターを選択します。 - 詳細パネルの Actor > Tags に任意のタグを追加します。(例:
RoadSpline)
Step 2: PCG内でSplineデータを取得する
PCGグラフを開き、先ほどタグ付けしたSplineを取得します。
-
Get Spline Dataノードを追加します。 - 詳細パネルで以下の通り設定します。
-
Actor Filter:
All World Actors -
Actor Selection:
By Tag -
Actor Selection Tag: 先ほど設定したタグ(例:
RoadSpline)
-
Actor Filter:
⚠️ ハマりポイント:ポイントが全く取得できない場合
もしデバッグ表示(Dキー)でポイントが出ない場合は、詳細パネルの以下2点を確認してください。
-
Component Selection は「Default」にする
Landscapeにタグを付けても、内部のSplineコンポーネント自体にタグが付いているわけではないため、Component Selectionでタグ指定をしてしまうと取得に失敗します。 -
Track Actors Only Within Bounds のチェックを外す
Landscapeの原点(Pivot)がPCGボリュームの範囲外にあると無視されてしまうことがあるため、ここのチェックは外しておきます。
Step 3: Splineのサンプリングと道の幅(バウンズ)の設定
取得したSplineの線上にポイントを生成し、道の幅に合わせて判定エリアを広げます。
-
Get Spline Dataの出力をSpline Samplerノードに繋ぎます。 - その出力を
Bounds Modifierノードに繋ぎます。 -
Bounds Modifierの詳細パネルで、Bounds Min と Bounds Max の X・Y の数値を道の幅に合わせて調整します。(例:Minを-200, -200、Maxを200, 200など)。Z軸も地形の起伏に合わせて余裕を持たせてください。
Step 4: Differenceノードでポイントを引き算する
草木を生成するメインのポイント群から、道のポイント群を引き算します。
-
Differenceノードを追加します。 -
Sourceピン に残したい草木のポイントデータ(
Surface Samplerなどの出力)を繋ぎます。 -
Differencesピン に先ほどの
Bounds Modifierの出力を繋ぎます。 - 詳細パネルの Density Function を
Binaryに変更します。
Step 5: Density 0 の黒い点を完全に消去する
⚠️ ハマりポイント:道沿いに黒い点が残ってしまう場合
Step 4まで完了してデバッグ表示を確認すると、道沿いのポイントが消えずに黒く(または暗く)表示されたまま残ることがあります。
これは Difference ノードによってポイントの「Density(密度)」が 0 になっただけで、データとしてはその場に残り続けている状態です。これを完全に消去する必要があります。
-
Differenceノードの後にDensity Filterノードを追加して繋ぎます。 - 詳細パネルの Lower Bound を
0.01に設定します。(Upper Bound は1.0のまま)
これで、Densityが0になった(道と重なった)ポイントが完全に破棄され、きれいな道が完成します!あとはこの出力を Static Mesh Spawner などに繋げば完了です。
まとめ
Landscape SplineをPCGで除外する際は、以下のポイントを押さえておくとスムーズです。
-
Get Spline Dataのコンポーネントタグ指定を外し、Bounds外も許可する。 -
Differenceの後は必ずDensity Filterを使って Density 0 のポイントを消去する。
PCGを使ったレベルデザインの参考になれば幸いです!