找回密码
 立即注册
查看: 679|回复: 0

UE5.1 PCG plugin探索(UE5程序化生成/Procedural Content ...

[复制链接]
发表于 2023-2-28 17:14 | 显示全部楼层 |阅读模式
这是我第一次在知乎上写文章,因自身能力的局限性,如有错误部分,恳请各位大佬不要爆喷,看一乐呵就好。

前言

起源于我一次无意翻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服务器互相交流学习。(需要富强)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 17:32 , Processed in 0.090921 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表