目标
最近了解到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技术详解