【Unreal Engine】PCG入門:木を自動配置し、小道の周りだけ空ける

作成: 2026-07-23最終更新: 2026-09-06

PCGで地面に配置候補の点を作り、木や箱を並べるところから始めます。Foliageとの使い分け、点を確認するDebug、急斜面の除外、SplineとDifferenceで小道の周りを空ける手順を、ノードの接続と図で解説します。

森の中に道を通したあとで、「もう少し右に曲げたい」と思うことがあります。道の近くの木を消し、空いた場所にまた木を足す。配置を整える作業は、地形や道を直すたびに繰り返すことになります。

PCGは、配置を作るためのルールを残せる仕組みです。「この地面に木を置く。ただし急斜面と道の周りは空ける」と組んでおけば、道の形を変えてから、そのルールで配置を生成し直せます。

この記事では、まず地面に物が並ぶところまで作り、そこに「置かない場所」の条件を足していきます。木の素材がなくても、UEに入っている箱で同じ手順を試せます。

丘の上に木が並び、その間に木のない帯が通っている完成イメージ

この記事でわかること

  • 配置候補の「点」と、そこに置くメッシュの関係
  • PCG Volumeとグラフで、地面に物を並べる手順
  • 急斜面の候補を取り除く方法
  • 曲線の周りを空け、道の変更に合わせて配置を作り直す方法

Sponsored

PCGは「点を作って、そこに置く」

PCG(Procedural Content Generation)は、手順や条件からコンテンツを生成する仕組みです。今回は、地面に木を配置するために使います。

ここで大事なのが、最初に作るのは木ではなく、木を置く候補の点だということです。点には位置だけでなく、向きや大きさなどの情報もあります。まず候補を作り、置きたくない場所の点を取り除き、最後に残った点へ木を置きます。

地面に候補の点を作り、道の周りの点を除き、残った点へ木を置く3段階

この手順を、PCGグラフにノードをつないで作ります。ノードは「点を作る」「点を取り除く」など、一つの処理を担当する部品です。線に沿って配置のデータが流れます。

木が多すぎたら候補を減らし、道を広げたければ除外する範囲を広げる。配置結果を一本ずつ直す代わりに、配置を決める条件を直せるのがPCGの使いどころです。

Foliageツールとの使い分け

Foliageでも、ブラシで木や草をまとめて配置できます。PCGとの違いは、本数よりも「配置する場所をどう決めるか」です。

Foliageはブラシで範囲を描き、PCGは地面や道の条件から配置を作る比較
方法配置を決める操作向いている作業
Foliageブラシで配置する場所を描く景色を見ながら、道端の草や岩を足していく
PCG地面・傾斜・道などの条件をグラフにする道や地形を変更しながら、同じルールで森を作り直す

たとえば、森全体はPCGで作り、入口の草をFoliageで足す使い方もできます。ただし、PCGの除外条件が、別に手で置いた木や草まで消すわけではありません。それぞれの方法で置いたものを、別々に調整します。

最初のPCG:地面に物を並べる

ここからはエディタ上で作業します。まずは、Landscapeの一角に箱か木が並べば成功です。急斜面や道は、並ぶことを確かめてから扱います。

地面とプラグインを用意する

Landscapeがあるレベルを開きます。まだなければ、Landscape入門の手順で地面と小さな丘を作ってください。最初は地面の一角だけを使います。

「Edit → Plugins」で Procedural Content Generation Framework を有効にし、求められたらエディタを再起動します。PCGはUE5.7でProduction-Ready(本番制作に使える段階)になりました。以下では、この世代の基本的なノードを使います。

配置するものには、手元の木の Static Mesh を使えます。Static Meshは、木や岩などの立体モデルのアセットです。素材がなければ、コンテンツブラウザの設定で「Show Engine Content」をONにして、Engine/BasicShapes/Cubeを選べる状態にします。箱で配置の仕組みを確かめてから、木に差し替えても構いません。

範囲とグラフを用意する

PCG Volumeは、このグラフで配置する範囲を囲むActor(レベルに置くオブジェクト)です。地面の上だけに浮かせず、箱の中に地面が入るように置きます。

  1. 「Place Actors」でPCG Volumeを検索してレベルへ置き、PCG_PracticeVolumeと名付けます。
  2. 拡大ツールで、平地と丘の斜面が一部ずつ入る大きさにします。まずは数十mほどの範囲で十分です。高さも含めて地面と重ねます。
  3. コンテンツブラウザで右クリックし、「PCG → PCG Graph」からPCG_ForestPracticeを作ります。テンプレートを選ぶ画面が出る場合は、空のグラフから始めます。
  4. レベルのPCG Volumeを選び、詳細のPCGコンポーネントで「Graph」にこのグラフを指定します。今回は「Is Partitioned」をOFFにして、範囲を分割しない構成で試します。
地面と交差するPCG Volumeと、そのPCGコンポーネントに割り当てるグラフ

Volumeはレベルに置く範囲、グラフはその中で使う配置ルールです。同じものではないので、グラフを作ったらVolumeへ割り当てるところまで行ってください。

3つのノードをつなぐ

PCG_ForestPracticeを開き、空白部分を右クリックして、次の3つのノードを追加します。

Get Landscape DataのOutからSurface SamplerのSurfaceへ、OutからStatic Mesh SpawnerのInへつなぐ
ノード今回の役割接続
Get Landscape DataLandscapeの面を取得するOut → Surface SamplerのSurface
Surface Samplerその面に候補の点を作るOut → Static Mesh SpawnerのIn
Static Mesh Spawner各点へメッシュを置く配置するアセットを設定する

Surface Samplerを選び、詳細を次の値から試します。

設定最初の値意味
Points Per Squared Meter0.11m²あたりの候補数の目安。値を上げると密になる
Point ExtentsX/Y/Zともに50点が持つ範囲の半分の大きさ。ここでは既定の小さな範囲を使う
Looseness1点の位置にばらつきを持たせる
UnboundedOFFVolumeの範囲内に絞る

「Bounding Shape」入力は今回はつながなくて構いません。UnboundedがOFFなら、別の範囲を渡していない場合に、このPCG Volumeの範囲を使います。

次にStatic Mesh Spawnerを選びます。「Mesh Selector Type」をPCGMeshSelectorWeightedにし、「Mesh Entries」ので項目を1つ追加します。その「Descriptor → Static Mesh」に木かCubeを指定し、「Weight」は1にします。

グラフを保存し、レベルのPCG Volumeへ戻って、PCGコンポーネントの 「Generate」 を押します。Volumeの中の地面に、指定したメッシュが並べば成功です。Cubeは中心を地面の位置に合わせて置かれるので、半分ほど埋まって見えても、候補が生成されたことは確認できます。最初から置かれているInput・Outputノードは、この配置例では未接続のままで構いません。

出ないときは、木より先に「点」を見る

何も出ないとき、原因を一度に探す必要はありません。まずSurface Samplerが点を作れているかを確かめます。

グラフでSurface Samplerを選び、Dキーで Debug(途中の結果の表示) をONにします。デバッグ対象の選択欄や「Debug Tree」でPCG_PracticeVolumeのコンポーネントを選び、Generateします。ビューポートに小さな箱などの印が出れば、それが配置候補です。もう一度Dを押すと表示を消せます。

候補がない場合は地面と範囲、候補がある��のに物がない場合はメッシュ指定を見る
  • 点もない:Volumeと地面の重なり、Graphの割り当て、Get Landscape DataからSurfaceへの接続、候補数を確認します。
  • 点はあるが、物がない:Surface SamplerからSpawnerへの接続と、Mesh EntriesのStatic Mesh指定を確認します。

配置できたら、Points Per Squared Meterを0.1から0.05にしてGenerateしてみてください。間隔が広がれば、配置する量を調整できています。

別の並びも試したい場合は、PCGコンポーネントの Seed を変えます。Seedは、ランダムな配置のパターンを決める数値です。同じ環境で地形・設定・Seedをそろえると、同じ配置を再現しやすくなります。好みの並びが出たら、Seedも残しておきましょう。

Sponsored

急斜面の候補を取り除く

次は、木を置きたくない急斜面を除きます。使うのは、その場所の 法線 です。法線は「地面から垂直に伸びる向き」で、平地なら真上、斜面なら斜めを向きます。この向きと真上を比べれば、平らな場所を選べます。

平地の法線は真上を向き、斜面の法線は斜めを向く。平ら��な場所の候補だけを残す

Surface SamplerとStatic Mesh Spawnerの間に、Normal To DensityDensity Filter を追加します。

Normal To Densityは、法線が指定の向きにどれほど近いかを、点の Density に書き込みます。Densityは点が持つ数値で、今回は「真上に近い向きか」を表す値として使います。先ほどの「1m²あたり何点作るか」とは別の設定です。

Surface SamplerからNormal To Density、Density Filterを通してStatic Mesh Spawnerへ渡す接続

接続はすべて、前のノードのOutから次のノードのInです。Normal To Densityは次のように設定します。

設定
NormalX=0、Y=0、Z=1(真上)
Offset0
Strength1
Density ModeSet(この値で置き換える)

Density Filterは Lower Bound=0.85、Upper Bound=1、Invert Filter=OFF にします。「Keep Zero Density Points」「Normalize Output Density」が表示される版では、どちらもOFFにします。これで、指定した範囲の値を持つ点だけが先へ進みます。

Generateして、急な斜面のメッシュが減り、平地のメッシュが残るかを見ます。もっと平らな場所に絞りたいなら、Lower Boundを上げる方向に調整します。0.85は出発点なので、実際の丘を見ながら決めてください。

木をまっすぐ立て、大きさを変える

点は地面の向きも引き継ぎます。続けて、木を上へまっすぐ立てるために、Density FilterとSpawnerの間に Transform Points を追加します。これは、点の向きや大きさを変えるノードです。Density FilterのOut→Transform PointsのIn、Transform PointsのOut→SpawnerのInへつなぎ直します。

設定
Absolute RotationON(地面から受け継いだ回転を置き換える)
Rotation MinX/Y/Zともに0
Rotation MaxX=0、Y=0、Z=360(上向きの軸の周りだけ回す)
Uniform ScaleON(縦横の比率を保つ)
Scale Min / Max各軸0.8 / 各軸1.2

地面の傾きを調べてから、木の向きを変える順番が大切です。Transform Pointsを先に置いて回転をそろえると、傾斜を調べるための向きまで変わってしまいます。

ここまでで、平らな場所を中心に、大きさと向きが少しずつ違う木が並びます。

Splineで小道の周りを空ける

森の中に、木がない帯を通します。使うのは Spline(スプライン) です。いくつかの点を結んで形を調整できる曲線で、今回は「道の中心線」にします。

ただし、線を置くだけでは、道の幅は決まりません。線に沿って点を並べ、各点に幅のある範囲を持たせることで、木を置かない帯を作ります。

曲線上の点が持つ四角い範囲を重ね、道の周りを除外する帯にする上面図

この記事で作るのは、木が生えない空間です。地面の色や高さは変わりません。 土の小道にしたい場合は、あとでLandscapeのPaintなどで塗ります。

道の中心線を作る

  1. コンテンツブラウザで「Blueprint Class → Actor」を作り、BP_PCGRoadと名付けます。
  2. Blueprintを開き、「Add」で Spline コンポーネントを追加します。「Closed Loop」はOFFにします。
  3. 「Class Defaults」の詳細で、Actorの TagsPCG_Roadを1つ追加します。これは、このActorをPCGから見つけるための目印です。SplineのComponent Tagsではなく、Actor側へ付けます。
  4. コンパイル・保存して、レベルのPCG Volumeの中へ1体置きます。ActorとSplineのScaleは1, 1, 1のままにします。
  5. レベル上でSplineの点を選んで移動し、森を横切る線にします。点を選んでAltを押しながら移動すると、点を増やして曲げられます。

今回は上面から道を描き、Splineの各点は同じZの高さにそろえます。点ごとのScaleも1, 1, 1にします。曲線全体の高さを丘のふもと付近に置けば十分です。このあと上下に長い除外範囲を作るので、地面の起伏を細かくなぞる必要はありません。

BP_PCGRoadにSplineを追加し、Actor TagsのPCG_Roadを目印にグラフから見つける

線の周りに、幅と高さを持たせる

PCGグラフへ戻り、木を置く流れとは別の行に、Get Spline Data → Spline Sampler → Bounds Modifier を作ります。接続はそれぞれOutInです。

Get Spline Dataは「Actor Filter」をAll World Actors、「Actor Selection」をBy Tag、「Actor Selection Tag」をPCG_Roadにします。今回は道が1体なので「Select Multiple」はOFF、「Must Overlap Self」がある場合はOFFにします。

Spline Samplerは「Dimension」をOn Spline、「Mode」をDistance、「Distance Increment」を100にします。UEの距離は通常cmなので、線に沿って1mおきに点を作る設定です。

Bounds Modifierは、点が持つ範囲を変えるノードです。「Mode」をSetにし、次の値を指定します。

設定
Bounds MinX=-300、Y=-300、Z=-3000
Bounds MaxX=300、Y=300、Z=3000
Affect SteepnessON
Steepness1

これは、各点を中心に横へ約3mずつ、上下へ30mずつ広がる箱です。Steepnessは境界付近の値の落ち方で、ここでは箱の内外をはっきり分けるために1を使います。1mおきの箱が重なり、曲線に沿った除外範囲になります。

Get Spline DataからSpline SamplerとBounds Modifierへつなぎ、道の除外範囲を作る

この方法は箱を重ねるので、曲がり角まで厳密に一定幅の帯にはなりません。まずはおよそ6m幅の通り道を空けるための作り方として使います。木の葉が大きければ、X/Yの範囲を広げて余裕を取ります。

Differenceへ、候補と除外範囲を渡す

最後に Difference を追加します。Differenceは「元の候補から、指定した範囲を引く」ノードです。どちらを引くのかが分かるように、2つの入力を区別して接続します。

Density Filterの候補をSourceへ、Bounds Modifierの除外範囲をDifferencesへ渡し、残った候補をTransform Pointsへつなぐ
接続元Differenceの接続先
木の流れにあるDensity FilterのOutSource(元の候補)
道の流れにあるBounds ModifierのOutDifferences(引く範囲)

Differenceは「Density Function」をBinary、「Mode」をDiscrete、「Keep Zero Density Points」をOFFにします。今回は、道の範囲に入った候補を取り除き、残った点を次へ渡すための設定です。

以前つないだDensity Filter→Transform Pointsの線を外し、DifferenceのOut→Transform PointsのInへつなぎ直します。Transform Points→Static Mesh Spawnerは、そのままです。

これで「地面から候補を作る→急斜面を除く→道の周りを除く→向きと大きさを変える→置く」という流れになります。

Sponsored

道を曲げて、配置を作り直す

グラフを保存し、PCG VolumeでGenerateします。木の間に、Splineに沿った空きができれば成功です。まずは上から見て、曲線と空いた場所が合っているか確かめます。

道の中心線を曲げてGenerateすると、木のない帯も曲がった形になる比較

次にSplineの点を少し横へ動かし、もう一度Generateしてみてください。道の形に合わせて空きが変われば、配置を一本ずつ直さずに、小道を調整できています。設定によって自動更新されることもありますが、変化が見えないときはGenerateで確かめます。

最後にプレイヤーの高さから見ます。木の幹がなくても、枝葉が道へ大きく張り出しているかもしれません。その場合は除外範囲を広げるか、木の大きさを抑えます。上面では整って見える森も、実際に歩くと必要な余白が分かります。

困ったこと確認する場所
急斜面にも木があるNormal To Densityの設定とDensity Filterの範囲。向きをそろえるTransform Pointsは、その後に置く
道の周りが空かないActor TagsがPCG_Roadか、Get Spline Dataがそのタグを探しているか。Spline SamplerのDebugで点が出るか
平地では空くが、高い丘に木が残る道の箱が地面まで届いているか。Splineの高さか、Bounds Min/MaxのZを調整する
空けたはずの道に草や木が残る手で置いたActorやFoliageではないか。Differenceの対象は、このグラフの配置候補
配置が多すぎて操作しづらいVolumeを小さくするか、Surface SamplerのPoints Per Squared Meterを下げる

おまけ:先に知っておくと良いこと

Generateは、配置を作り直す処理です。 条件を変えやすいのがPCGの利点ですが、広い範囲や多数の候補では処理時間がかかります。小さな範囲でルールを固めてから広げると、調整を続けやすくなります。今回はエディタ内で生成し、実行中の動的な生成は扱いません。

木が増えれば、描く負荷も増えます。 Static Mesh Spawnerは同じメッシュをインスタンスとしてまとめて扱いますが、葉の重なりや影まで無料になるわけではありません。広げたときに重くなったら、stat unitで確かめ、LOD・カリングも調整します。

配置と衝突は別に確認します。 木が見えていても、通り抜けられるかどうかはメッシュの衝突形状やSpawner側の設定で変わります。背景の森として置くのか、プレイヤーを遮る木にするのかを決めてから、ゲーム内で歩いて確認してください。

一度この流れを作れば、木を岩へ差し替えたり、道端の空きを広げたりして、同じ地形でも違う景色を試せます。まずは一本の小道を動かし、森の中にどれくらいの余白があると歩きやすいかを探ってみてください。

まとめ

  • PCGは「点を出す → 絞る → メッシュを置く」の流れ
  • 急斜面や道の上は、点の段階で取り除く
  • 元の地形や曲線を変えれば、配置は作り直せる

使う前の問いかけは、「これは手で置くほど大事な物か」 です。大事な物は手で、量でごまかす物はPCGに任せます。

同じ物を大量に描くときの負荷は Instancing、地形そのものは Landscape入門 で扱っています。

さらに学ぶために

Unreal Engine このセクションのノート98