UE5《Electric Dreams》项目PCG技术解析 之 PCGDemo_Ditch关卡详解

文章介绍了《ElectricDreams》项目中PCGDemo_Ditch关卡的设计,重点讲解了如何使用PointsFromActorTag自定义节点进行PCG分割,以及分层装饰的概念。通过Tag筛选Volume实现动态关卡构造,并探讨了是否生成碰撞的相关技巧。
摘要由CSDN通过智能技术生成

前导文章

在上述博文中,我们了解了《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;
	}

从上述代码可以看到,最关键的就是获取ActorUPrimitiveComponent组件的BoundsBox,并且可以每个Actor可以携带多个Volume。

这个节点的常用方法是在关卡中设定一些Volume并添加相应Tag,然后在PCG中通过Tag筛选出这些Volume,并排除它们体积。

在这里插入图片描述

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

在这里插入图片描述
在"ElectricDreams_Env"可以也找到应用范例:

在这里插入图片描述

分层装饰

在这里插入图片描述
分层装饰是构建PCG的一个重要的思想, PCGDemo_Ditch关卡中,一个Ditch由如下4个从主到次的部分组成:

  1. Ditch的主体

  2. 树木和石头

  3. Ditch和地面的连接部
    在这里插入图片描述

  4. 污渍细节

在这里插入图片描述
本关卡中分层构建PCG的逻辑虽然比较复杂,但并不难理解,本文中就不展开解释了。

一些知识点和技巧

使用Attribute Operation将属性暂存到临时属性中

在这里插入图片描述

是否生成碰撞

在这里插入图片描述

小结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发游戏的老王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值