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 模式配合流式管理。

性能策略

  1. 分层:大树 / 灌木 / 草地拆图或子图分别优化
  2. 早过滤:Bounding Box / Volume / 自定义过滤尽早砍点
  3. 密度当 LOD:远距降密度
  4. 异步:后台执行,避免卡主线程
  5. 烘焙:稳定内容 bake,降运行时开销
  6. 少拷贝:C++ 节点尽量原地改点,少分配

迷你案例:程序化森林

  1. Surface Sampler + 地形层过滤拿初始点;
  2. 树木子图:坡度/高度调密度 → Transform → Self-Pruning → Mesh Spawner;
  3. 分支灌木/草地:树下加密、空地铺草;
  4. 岩石:区域过滤 + Noise,再 Spawn;
  5. 末端按需烘焙 / HLOD。
价值主张:把“数天手摆”变成“分钟级迭代”,同时保留艺术方向的规则控制权。