![在这里插入图片描述](https://img-blog.csdnimg.cn/03920063d58b421890bac2abbc997ecb.jpeg#pic_center)
1. 什么是Assembly
UE5.2的PCG出了有一段时间了,大家玩得都很开心。很多朋友可能和老王一样,使用PCG一直停留在程序化摆放各种StaticMesh的水平。虽然仅使用StaticMesh也可以构造出很多好玩的结构,但相对于《Electric Dreams》项目给我们带来的Assembly级的玩法,可以说还是小巫见大巫了。
如果说StaticMesh是PCG世界的"原子",我们只能用它们来构造一些“无机物”,那么Assembly就更像是“大分子”,用Assembly可以构造更复杂的“有机物”。
接下来,我们以SplineExample关卡为例,分析一下什么是Assembly,以及Assembly是如何在两个灵魂般的小工具加持下,焕发出惊人生命力的。
文件位置:/Content/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGSplineExample.umap
首先我们看一下这个场景:
左边就是Assembly,而右面就是用这个“大分子”生成的PCG
![在这里插入图片描述](https://img-blog.csdnimg.cn/fc4f0ce91ecd4ef08a0c8b5fd092bef9.png#pic_center)
技术上讲Assembly其实就是一个关卡实例(Level Instance)
![在这里插入图片描述](https://img-blog.csdnimg.cn/97367e9515604d7f84bb37db840f0b2f.png#pic_center)
-
这个关卡实例由若干StaticMesh组成(一些小的土块、石头、树),并且一些StaticMesh(主要是土块)也设定了层级关系。这种多级结构,结合着后面每个StaticMesh在给自局部坐标系上的随机Transform运算,可以产生更丰富的变体
-
本例中的Assembly通过Spline形成了一条“小路”,“小路”的“宏观特征”是中间主要为土块,而两旁为植物。我们发现本例中的Assembly也满足这个特征。即使对Assembly上的StaticMesh进行局部坐标的随机变换,也不会打破该特征。
这就是我称之为“大分子有机物”的原因,即可以保证大的宏观趋势,又可以提供局部的随便多样性。
![在这里插入图片描述](https://img-blog.csdnimg.cn/39103df8ba5e4f26a2e88e1a59014958.png#pic_center)
- Assembly中的一些StaticMesh还设定了特定的Tag,本例中一些树木的StaticMesh上添加了
KeepVertical
的Tag,其目的是后面会局部随即变换时保持它仅在垂直方向上变换。
2. PCG部分
![在这里插入图片描述](https://img-blog.csdnimg.cn/3a9169ef0a194b82bf80d93d301efe1c.png#pic_center)
本例中直接在Actor的实例下添加了Spline和PCG组件。
这里也使用了我在《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》一文中提到的,基于关卡PCGSettings的工作流
![在这里插入图片描述](https://img-blog.csdnimg.cn/06d6ab37897f4cce8698054b4b1ac27e.png#pic_center)
它的PCGGraph也很简单,主要分个部分:
- Assembly变换
- Point变换
2.1 Assembly变换
![在这里插入图片描述](https://img-blog.csdnimg.cn/3cff43aa04cd4d6aa3c9746cd2828f51.png#pic_center)
- 首先从PCGSettings中获取到Assembly的BoundBox,作为Spline每个采样点上的BoundBox.这一步主要是用于设定Spline的采样距离
- 然后随机选择Assembly,并对其进行z轴180度旋转(保持道路的宏观特征)
2.2 Point变换
![在这里插入图片描述](https://img-blog.csdnimg.cn/a7ed3d4cd3874ad39a648aa7c3a9d2dd.png#pic_center)
2.2.1. SG_CopyPointsWithHierachy
SG_CopyPointsWithHierachy
的作用和CopyPoints
很类似,只不过SG_CopyPointsWithHierachy
携带了一系列的层级信息,我们Inspect一下SG_CopyPointsWithHierachy
节点:
![在这里插入图片描述](https://img-blog.csdnimg.cn/79f1bdde0ed94ce0a48ce4a9070aa889.png#pic_center)
- ActorIndex : 当前点的Index
- ParentIndex:父节点Index
- HierarchyDepth:层级深度
- RelativeTransform:相对变换
2.2.2 过滤及点变换
![在这里插入图片描述](https://img-blog.csdnimg.cn/a4bba20409b848ee84df8dedb2acb1f9.png#pic_center)
Point Filter筛选的就是上文提到的带有Keep Vertical
的Tag的StaticMesh
![在这里插入图片描述](https://img-blog.csdnimg.cn/f4235e66297f42daa916894af73b9ec0.png#pic_center)
注意这里的Transform是针对局部坐标,所以要讲作用Attribute
设为RelativeTransform
2.2.3. ApplyHierachy
![在这里插入图片描述](https://img-blog.csdnimg.cn/03c32e7e09494ad0ab66a822d7964d6e.png#pic_center)
ApplyHierarchy计算出每个点最终的Transform,然后用StaticMeshSpawner生成最终模型。
这里关于StaticMeshSpawner的用发我在《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》一文已经解释过,本文就不再赘述了。
3. 小结
Assembly的思路并不难理解,就是把一系列原子(StaticMesh)“有机”结合起来,形成一个具有更高多样性变化空间的“分子”。使用的时候先通过SG_CopyPointsWithHierachy
提取相对变换信息,经过筛选变换以后,再通过ApplyHierachy
计算最终变换,并生成最终的模型。
所谓“有机”就如本例中,保持小路的“宏观特征”那样。