UE5.1 PCG plugin探索(UE5程序化生成/Procedural Content ...
这是我第一次在知乎上写文章,因自身能力的局限性,如有错误部分,恳请各位大佬不要爆喷,看一乐呵就好。前言
起源于我一次无意翻UE的官方插件时找到了一个名叫PCG的插件,这个插件只在UE5.1中有,在UE5.0中是没有的,说起PCG,第一反应就是Procedural Content Generation,中文叫程序化生成或者过程化生成。于是开始谷歌这个插件,发现一点关于这个插件的资料都没有,我就开始打开这个插件看看究竟是干嘛的。经过一番研究,我把目前的一些收获分享在这里,希望能够起到一个抛砖引玉的作用。
注意:该插件在UE5.1中叫PCG,在5.2改了个名字叫Procedural Content Generation Framework,5.2直接搜PCG是搜不到的
Procedural Content Generation
说起程序化生成,这是一个很大的概念,3D游戏像Farcry5孤岛惊魂houdini撒点地形道路属于程序化生成,2D游戏死亡细胞rogelike的关卡也是程序化生成,在死亡细胞中,你每死一次,复活后的关卡都是不一样的。
今天主要讲3D游戏野外的程序化生成。
先讲讲为啥要用PCG,以前的游戏,地图比较小,对于场景中的各种物件摆放啊,都是3D模型顺手给做了,现在的游戏场景越来越大,内容也越来越丰富,流行搞开放世界游戏,那么对于这么大的场景,不用pcg生成的话,要招一大堆的地编去刷。打个比方,如果要做一片可信的森林环境,首先要有草,石头,树,花,灌木,蕨类等等,刷一小片区域还行,要是很大很大的范围,岂不是要累死地编。所以便有了PCG工具,由程序去自动计算这个区域该生成啥,各种植物的密度又是多少等等,地编只需要输入参数即可,这样就会节省很多时间。
程序化植物
UE中很早就加入一个功能叫程序化植物,但是这个功能非常难用,而且很长时间没再维护了,一般项目都会使用houdini来做野外或者城市的程序化生成,这程序化植物多见在虚幻商城的一些资产中被使用,要求不高用用还行。
并且这个功能到UE5.1中还是experimental,不知在搞什么飞机,像是被放弃的赶脚。
houdini做法
据我所知,目前大多数对于开放世界的游戏程序化生成的部分是依赖于houdini的,TA会在houdini中做好HDA,然后通过houdini for unreal插件暴露参数给UE,然后地编只需要更改这些参数就行了。似乎非常的Easy,但是在实际使用过程中,可以说是地编的每台电脑都要安装houdini,如果出了啥问题还需要排查老半天,非常的蛋疼。当然不排除一些能力很强的地编自己进去改hda就完事了。
Post Apocalyptic Ruins in UE4
PCG plugin
那么PCG plugin和houdini比有啥优势,首先他本身就是在UE里的。。。不用让地编蛋疼的装houdini。。。
首先经过我的一顿实验,目前发现就撒点来说,他已经可以实现houdini的很多功能了。
下面是我的一些发现
注意:文章都是使用UE5.2版本,发布于2023年2月26日,该插件基本上在github上是一天好几次更新的状态,所以如果你发现文章里的内容和你自己用的不一样,这是很正常的。
开了了pcg插件之后会多出三个东西
一个是Tool里的列表
另一个是content browser右键可以创建一个PCG graph,这个类似houdini的Hda
最后则是place actor的中的PCG volume 这个和程序化植物的那个volume差不多,用这个volume来框住生成的PCG的内容。
示例
我们可以在引擎的插件路径找到PCG content内容,里边包含了许多已经封装好的蓝图和一些示例,其中SampleContent是一个非常好的入门示例。
从零开始创建
接下来我将演示从头创建一个PCG撒点,制作出一片森林的环境。
首先把PCGVolume拖进场景并创建一个pcg graph
打开pcg graph会发现有和蓝图界面有些相似,里面有非常多的节点,有一些是蓝图,有一些是C++写的。
现在已有的接口已经非常多,也可以自行拓展一些。
使用StaticMeshSpawner便可进行撒点,可以在mesh entries中选择不同的mesh(尽量不要乱连节点,一个错误操作就可以把引擎干蹦了)
在PCG Volume中选择generate即可生成出来,默认情况下只要改一下PCGGraph参数便会自动生成,如果想手动,只需要把 regenerate PCG Volume in editor关掉即可
这里一下生成出来了巨量的树,我们可以使用Surface Sampler并把looseness拉高来减少树的数量
这里树都长得一个尺寸很难看,我们使用transform point可以改一下它们的高度范围,rotation offset也可以通过这个节点改。
我们可以copy一份来创建草地和石头
发现有一颗树长在了石头下面,这不是我们想要的。
可以用difference节点排除
如果不希望自身离得太近也可以使用self pruning节点
接下来变到了喜闻乐见的在树下撒点环节,创建一个copy point并把target怼上树的sampler即可。
我们可以调整ImportDataTable的scale来增加或者减少范围
还可以通过density fiilter来做一些奇奇怪怪的效果
接下来到了在石头上长草
这里主要是参考的simple forest实例,首先依旧是copy point,target是石头,接着使用了normal to density节点,这里是在Z轴上长草。如果想调节密度可以改density filter。
在程序化植物功能中还有一个排除体积,用一个volume来排除一些区域不想要程序化植物的地方。使用PCG插件也可以实现。
可以拖进任意一个形状的模型或者actor,让其不在该区域生成,我这里拖入了一个box,并且在actor tag中取了一个名字叫block
创建IntersectWithTaggedActorGeo节点,怼在不想撒的mesh后面,并且把actor tag改为我刚才取得名字 block,即可排除掉。如果勾上了 keep inside point,则mesh只会撒在这个box内。
更多
PCG插件还有更多内容,比如撒点在顶点色上,获得地形的法线等等,这里由于篇幅原因不再一一赘述,感兴趣的朋友可以自行研究。
总结与展望
个人认为,这个插件很有可能替代掉之前的程序化植物,并且很有可能颠覆掉原来houdini to UE的工作流程,由程序写一些节点,然后TA连一些PCG Graph,美术调用参数就可以实现效果了,毕竟如果UE里功能如果都能实现,速度快效果还好,就没啥理由再用houdini了。
Landmass+PCG+Geometry Script,以后做开放世界场景生成可能90%的内容UE引擎就搞定了,大人,时代变了。
虽然Landmass还有诸多问题,比如做超过4K的地图有些蛋疼,不过暂时不在该文章的讨论范围内。
另外:UE官方今年在GDC上讲到 Procedural Content Generation,很有可能会用到该插件演示一些东西,感兴趣可以看看。
遗留问题
该插件很多节点都是C++写的,我不是程序,对于该插件可能止步于摸索着玩玩阶段,迄今为止我还没有搞懂怎么暴露参数给到detail面板,以及怎么把hism转换成foliage系统可供地编增删植被。如果有大佬对该插件也比较感兴趣,欢迎加入我的discord服务器互相交流学习。(需要富强)
页:
[1]