程序化内容生成框架(Procedural Content Generation Framework,下文简称PCG)可谓是UE5.2版本中最令人瞩目的新技术之一,老王也是在第一时间就关注了这个技术,以前尝试过用Houdini来实现UE5中的程序化内容生成,感觉还是很蹩脚的,毕竟Houdini是第三方工具,节点操作不如UE蓝图顺手,而且生成的资源需要插件来解析,调试以及场景资源的交互就更头疼了。有了原生的PCG,在程序化内容生成方面,可以和Houdini说拜拜了。
引言
网上有不少关于PCG的小教程,但基本都是从“小工具”层次的介绍。深扒《Electric Dreams》项目的代码,让我感到Epic Games这次给出的PCG是野心满满的,因为它不仅有很高的完成度,而且还为中大型项目直接定义了更加优化的PCG开发工作流程。
什么是PCGSettings
PCGSettings是PCG中的配置文件,PCGSettings有两种:
- 节点的PCGSettings
- 关卡的PCGSettings
其中节点PCGSettings
比较容易理解,把PCGGraph中选中的节点,右键Export Nodes to AssetData
就可以保存成对应的PCGSettings,它的作用就是可以复用这些节点的设置,直接拖拽到PCGGraph中就可以使用。
下面我们重点聊聊关卡PCGSettings
,在每个Level文件上右键通过PCG - Level to PCG Settings
都可以导出一个关卡PCGSettings
文件,它的名字由Level文件名+"_PCG"后缀组成,当我们更新了关卡中的内容,再次导出时,如果已有对应的关卡PCGSettings
文件,它会直接对旧文件进行更新。
关卡PCGSettings中有哪些内容
我们新建一个名为"PCG_DesignLevel"的关卡,在里面随便摆放一些东西:StaticMesh、SkeletalMesh以及SplineActor。顺便给两个StaticMesh更换一下材质,然后为白色的Actor添加ActorTag:White;为红色的Actor添加ActorTag:Red
导出关卡PCGSettings
新建一个PCGGraph,里面的内容非常简单,RCG_DesignLevel节点就是"PCG_DesignLevel_PCG"的Instance(直接拖拽到PCGGraph即可)
注意:
- 这里StaticMeshSpawner的
Mesh Selector Type
的类型要设置为PCGMeshSelectorByAttribute
Attribute Name
设为"Mesh"(字符串类型)- 勾选
By Attribute Material Overrides
并添加"Material"
再新建一个名为"PCG_GameLevel"的关卡,把刚刚写的PCGGraph拖拽到关卡中。
神奇的事情发生了,我们发现:
- "PCG_DesignLevel"中的静态物体(静态几何体,地面)都显示出来了,甚至还赋上了材质。
- 生成的静态几何体都成为了PCG_Demo的子组件。
- 但SkeletalMesh和SplineMesh都不见了。
这一切是怎么发生的呢?我们检查一下关卡PCGSettings
中点云(Point Cloud)的内容:
- 从列来看,关卡PCGSettings`的点云中包含着原关卡中所有静态网格体、层级实例化静态网格体(HISM)和实例化静态网格(ISM);
- 从行来看,点云中的每个点除包含初始属性,还包含着上述静态网格的体相对根节点(PCGVolume)的Transform,以及对应的Mesh资源和Material。这就是为什么StaticMeshSpawner可以通过属性生成网格并赋上材质。我们还可以看到,之前在原关卡中为红色和白色Actor分别添加的Tag(“Red"和"White”)也作为每个点的属性储存在点云中,这是一个Int32/64类型属性,拥有该属性的Actor值为1,否则为0。在PCGGraph中,我们可以通过Point Filter来过滤拥有某种Tag的Actor。
工作流
小小的PCGSettings文件,让PCG开发有了多元化而且松耦合的工作流程,比如:
- 工作流1:
这是一种纵向的工作流,关卡设计师可以现在一个初始关卡(暂称之为“锚定场景”),定义出一些重要的锚定网格体,然后导出它的PCGSettings,地编新建一个关卡(暂称之为“地编关卡”)通过PCGGraph进行视觉上的装饰
- 工作流2:
这是一种横向的工作流,《Electric Dreams》项目中大量使用了这种工作流。每个子关卡都分别导出PCGSettings,然后在组合关卡中进行组合,这样不但降低了各个模块开发的耦合度,还大大提升了关卡的复用性和灵活性。
小结
UE5.2中PCG被称为框架(Framework)而不仅仅是工具(Tools),是有道理的。因为它不仅仅是houdini的原生版本,还带来了一套针对PCG开发的工作流程,使用PCG制作游戏场景,效率实在太起飞了,我相信它会成为未来游戏开发的必修课。