启用WorldPartition后,PIE下BlockingVolume会在世界大纲中消失且ShowCollision也无法显示预览线框,但却客观存在

起因是地编误编辑了空气墙(位于DataLayer_A中)挡住了道路

策划尝试PIE下F8出来查看可能的问题,show_collision也看不到是什么挡路

尝试用一些射线Debug工具,的确能打到前方有‘障碍物’​

在PIE下的世界大纲中查询了一些关键词如AirWall,Blocking等,发现完全没有搜索结果​

​[Image Removed]

后来通过加载所有DataLayer,在Editor下发现了确实是存在挡路的空气墙(BlockingVolume)

[Image Removed]

通过CharacterMovement断点查看‘障碍物’信息排查了几个可能性,但都排除了(如下图)

[Image Removed]

​找了一晚没找到具体是如何影响的,但猜测是WP的什么优化策略导致的,求大佬解惑

您好,物理碰撞相关的信息建议您可以用chaos visual debugger录下看下,碰撞结果应以CVD为准

感谢​反馈,第一次我理解您是不知道怎么确定碰撞的是哪个对象,我又仔细看了下发现你的意思是wp中BlockingVolume在pie下不会显示在outliner中,我debug了一下原因是BlockingVolume在outliner在pie的时候被过滤掉了,在ActorEditorUtile.cpp中会检查场景中的actor是否是BuliderBrush,在wp之前默认是场景中第二个对象是builder brush,但是由于wp的引入,场景中带有is spatially loaded的对象会通过level instance加载并不会放到主关卡中,因此被放入level instance中的BlockingVolume也会放到第二个对象中,而且由于继承于ABrush因此会被错误的认为是builderBrush

namespace FActorEditorUtils
{
	bool IsABuilderBrush( const AActor* InActor )
	{
		bool bIsBuilder = false;
#if WITH_EDITOR		
		if ( InActor && InActor->GetWorld() && !InActor->HasAnyFlags(RF_ClassDefaultObject) )
		{
			ULevel* ActorLevel = InActor->GetLevel();
			if ((ActorLevel != nullptr) && (ActorLevel->Actors.Num() >= 2))
			{
				// If the builder brush exists then it will be the 2nd actor in the actors array.
				ABrush* BuilderBrush = Cast<ABrush>(ActorLevel->Actors[1]);
				// If the second actor is not a brush then it certainly cannot be the builder brush.
				if ((BuilderBrush != nullptr) && (BuilderBrush->GetBrushComponent() != nullptr) && (BuilderBrush->Brush != nullptr))
				{
					bIsBuilder = (BuilderBrush == InActor);
				}
			}			
		}
#endif
		return bIsBuilder;
	}

​您可以在本地把if ((ActorLevel != nullptr) && (ActorLevel->Actors.Num() >= 2)) 改成 if ((ActorLevel != nullptr) && !ActorLevel->IsWorldPartitionRuntimeCell() && (ActorLevel->Actors.Num() >= 2))​ 来绕过

我本地测试了下正常了我上传了视频,这个问题我会提个Jira在后面修掉​

感谢​解惑!

不客气,这个问题预计5.8修复,UE-348983,后面您可以通过下面链接查看修复状态,目前还未公开,过段时间可以点开查看