UE 知识卡片PCGWorld Building
PCG 框架速览
从 PCGPoint 数据流、关键节点、子图模块化,到 C++ 自定义节点与开放世界性能策略。
这篇讲什么
把 UE5 Procedural Content Generation 从概念、节点类型、子图、C++ 扩展、运行时集成到性能优化串成一张可落地的知识卡片。
它是什么
PCG 是一套非破坏性、基于节点图的程序化生成系统:用规则生成/放置植被、岩石、建筑、道路等。结果随时可改图重生,不永久改坏源数据。常与 World Partition、Nanite 搭配做大世界。
PCG Graph节点可视化规则图
PCGPoint位置/旋转/缩放/密度/种子
PCG Component挂 Actor 上执行图
确定性Seed 保证可重复结果
关键节点类型
| 类别 | 代表节点 | 用途 |
|---|---|---|
| 生成 | Surface / Volume / Spline Sampler | 地形表面、体积内、沿样条采样点 |
| 过滤 | Density / Bounding Box / Self-Pruning | 疏密、区域裁剪、防重叠 |
| 变换 | Transform Points | 随机化变换,制造多样性 |
| 生成资产 | Static Mesh / Actor Spawner | 实例网格或带逻辑的 Actor |
模块化:Subgraph
把“森林生成器”“岩石地貌”等封装成可复用子图,经输入/输出针脚交换点集与参数——类似蓝图函数,显著提升可读性与协作。
自定义节点(C++ 思路)
继承 UPCGNode / Settings,实现 Element 的 ExecuteInternal:读入 PointData → 改点 → 写出。引擎入口参考 Engine/Plugins/.../PCG/Public/PCGNode.h。
// 高度偏移节点的核心循环(示意)
for (FPCGPoint& Point : NewPoints)
{
Point.Transform.SetLocation(
Point.Transform.GetLocation() + FVector(0, 0, HeightOffset));
}
运行时与蓝图
- 编辑器烘焙为静态网格/Actor,或运行时动态生成;
- 参数暴露给蓝图,进区再生成细节、破坏后重生植被等;
- 与 World Partition Bounded 模式配合流式管理。
性能策略
- 分层:大树 / 灌木 / 草地拆图或子图分别优化
- 早过滤:Bounding Box / Volume / 自定义过滤尽早砍点
- 密度当 LOD:远距降密度
- 异步:后台执行,避免卡主线程
- 烘焙:稳定内容 bake,降运行时开销
- 少拷贝:C++ 节点尽量原地改点,少分配
迷你案例:程序化森林
Surface Sampler+ 地形层过滤拿初始点;- 树木子图:坡度/高度调密度 → Transform → Self-Pruning → Mesh Spawner;
- 分支灌木/草地:树下加密、空地铺草;
- 岩石:区域过滤 + Noise,再 Spawn;
- 末端按需烘焙 / HLOD。
价值主张:把“数天手摆”变成“分钟级迭代”,同时保留艺术方向的规则控制权。