目标
最近了解到5.2版本推出了实验性的功能PCG框架,以及用它做的范例 Electric Dreams。
本篇我简单学习它的一些基础概念,做一些记录。
0. 启用插件
此功能相关的类型都在PCG插件中,因此首先要确保启用了PCG插件:
 
1. PCGGraph
PCGGraph是一种可创建的资源:
 
 它里面存储了一个PCG节点网络。外表看起来像蓝图,但不是蓝图。
 一个最简单的PCGGraph如下:
 
 它从输入端获得地形,采样其表面得到一些点,然后根据点生成模型。模型路径是在StaticMeshSpawner节点上配置的。
2. PCGComponent
PCGVolume是PCG插件所定义的Actor类型,它拥有一个PCGComponent。可以直接拖入场景。
  。
。
 (我实验发现PCGComponent放在一个空Actor上,而非PCGVolume上,也可以工作。可见PCGComponent并不强依赖于PCGVolume)
PCGComponent会引用一个PCGGraph。
比如,这里测试创建一个PCGVolume放在地形上,然后将PCGComponent指向上一步创建的简单的PCGGraph。点击Generate按钮后就可以看见效果:
 
3. PCG节点的内部逻辑在哪?
显然,PCG核心逻辑由PCG节点构成。
 虽然很多节点的行为是好理解的,可以作为黑盒看待。但要想进一步研究节点内部逻辑该看哪儿呢?
可以双击节点来看内部逻辑,我注意到有两种情况:
一种是跳转到C++界面,比如 SurfaceSampler 节点:
 
 这些节点似乎都继承自UPCGSettings类(待查证)
另一种是跳转到一个蓝图资源,比如 SetPointColor 节点:
 
 蓝图资源似乎都是UPCGBlueprintElement的子类(待查证)
(准确来讲,还有另一种情况是 SubGraph (子网络)节点,即另一个PCGGraph)
总结
- 核心PCG逻辑由PCGGraph的PCG节点所组成。
- PCG节点的逻辑可能由UPCGSettings类的C++代码定义,或者是UPCGBlueprintElement的子类蓝图所定义。
- PCGComponent负责运行- PCGGraph的逻辑将内容生成到场景中。
后续学习
- 学习更多的PCG节点用法。
- 本篇所测试的PCG逻辑过于简单,其实也能在蓝图中实现。那么为什么PCG框架不以扩展蓝图节点为方向来开发呢?我相信官方使用新的节点框架而非蓝图必然有其意义。那么后续去研究那些“用新PCG框架能实现,而蓝图节点不方便实现的逻辑”,会有助于理解这个问题的答案。
- 相比于Houdini,此方式一个显著的优势就是“快速”,毕竟少了数据传入传出Houdini的时间。但我想Houdini肯定有其优势。后续可以思考哪些内容/逻辑只能用Houdini实现(或者说更好实现)?(至少目前没看到它可以修改地形高度/材质层,和生成Mesh数据)
一些学习资料:
本篇主要参考的官方文档:
 程序化内容生成概述 | 虚幻引擎5.2文档
UE官方范例项目 Electric Dreams 的深入讨论:
 Deep Dive into the Electric Dreams Project | Inside Unreal - YouTube
UE官方公众号的4篇关于 Electric Dreams 中PCG技术的讨论:
 Electric Dreams PCG技术详解



















