文章目录
- 前导文章
- 关卡概要
- PCGGraph
- Points From Actor Tag作为PCG的分割工具
- 分层装饰
- 一些知识点和技巧
- 使用Attribute Operation将属性暂存到临时属性中
- 是否生成碰撞
- 小结
前导文章
- 《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》
- 《UE5《Electric Dreams》项目PCG技术解析 之 理解Assembly(以SplineExample为例)》
在上述博文中,我们了解了《Electric Dreams》项目的宏观工作流以及构建关卡的基本思路,再来看这个“PCGDemo_Ditch”关卡就很好理解了。
文件位置:/Content/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGDitchAssembly.umap
“PCGDemo_Ditch”关卡主要为我们展示了PCG的小技巧:
- 使用自定义节点
Points From Actor Tag作为PCG的分割工具 - 分层装饰的思想
关卡概要

PCGGraph

Points From Actor Tag作为PCG的分割工具
在 PCGDemo_Ditch关卡中使用了很多Points From Actor Tag,这是一个很好用的自定义节点,可以直接移植到我们自己的项目中,下面我们来看一下它的主要逻辑,Points From Actor Tag的核心就在于Excute with Context中的如下部分:

从整个场景中获取到所有携带指定Tag的Actor,然后用它们的Transform以及Scaled Bounds组成Point Cloud输出。我们再看一下GetActorBoundsPCG的具体逻辑:
GetActorBoundsPCG
FBox UPCGBlueprintHelpers::GetActorBoundsPCG(AActor* InActor, bool bIgnorePCGCreatedComponents)
{
return PCGHelpers::GetActorBounds(InActor, bIgnorePCGCreatedComponents);
}
以及它调用的GetActorBounds
FBox GetActorBounds(const AActor* InActor, bool bIgnorePCGCreatedComponents)
{
// Specialized version of GetComponentsBoundingBox that skips over PCG generated components
// This is to ensure stable bounds and no timing issues (cleared ISMs, etc.)
FBox Box(EForceInit::ForceInit);
const bool bNonColliding = true;
const bool bIncludeFromChildActors = true;
if (InActor)
{
InActor->ForEachComponent<UPrimitiveComponent>(bIncludeFromChildActors, [bNonColliding, bIgnorePCGCreatedComponents, &Box](const UPrimitiveComponent* InPrimComp)
{
// Note: we omit the IsRegistered check here (e.g. InPrimComp->IsRegistered() )
// since this can be called in a scope where the components are temporarily unregistered
if ((bNonColliding || InPrimComp->IsCollisionEnabled()) &&
(!bIgnorePCGCreatedComponents || !InPrimComp->ComponentTags.Contains(DefaultPCGTag)))
{
Box += InPrimComp->Bounds.GetBox();
}
});
}
else
{
UE_LOG(LogPCG, Error, TEXT("Actor is invalid in GetActorBounds"));
}
return Box;
}
从上述代码可以看到,最关键的就是获取Actor中UPrimitiveComponent组件的BoundsBox,并且可以每个Actor可以携带多个Volume。
这个节点的常用方法是在关卡中设定一些Volume并添加相应Tag,然后在PCG中通过Tag筛选出这些Volume,并排除它们体积。

下图中有一个使用环形Spline生成的Ditch,然后使用几个标记有"PCG_EXCLUDE"标签的Volume(各种Volume都可以)为它开了两个口子。

在"ElectricDreams_Env"可以也找到应用范例:

分层装饰

分层装饰是构建PCG的一个重要的思想, PCGDemo_Ditch关卡中,一个Ditch由如下4个从主到次的部分组成:
-
Ditch的主体
-
树木和石头
-
Ditch和地面的连接部

-
污渍细节

本关卡中分层构建PCG的逻辑虽然比较复杂,但并不难理解,本文中就不展开解释了。
一些知识点和技巧
使用Attribute Operation将属性暂存到临时属性中

是否生成碰撞

小结
PCG真好玩啊,时间的关系,本文先写到这里,如果有错误敬请指正!







![[acwing周赛复盘] 第 110 场周赛20230701](https://img-blog.csdnimg.cn/952a62e10ee14836888bb542396d6343.png)









