ue4 异步加载关卡_UE4场景流送机制:(二)LevelStreamingVolume&WorldComposition

接上篇

老谭:UE4 LevelStreaming WorldComposition 源码分析:(一)场景加载机制​zhuanlan.zhihu.com
36f41e8c96ba38b43dcc42cbb55e47cc.png

熟悉了场景加载的逻辑,接下来我们看看UE4里面最重要的两种流送方式:

  • LevelStreamingVolume
  • WorldComposition

2175b10da0673a62cc56767ac60b8711.png

这两种流送的入口都在UWorld 的Tick 函数里面:

a90e2124c6284c31b76666c7a8411532.png

311da16afffc940aa040c31c45671cbe.png

LevelStreamingVolume

先从简单的LevelStreamingVolume开始。

LevelStreamVolume 一般是用于关卡型游戏的流送机制。比如玩家走到一个地方后,才加载接下来的场景,所以比较适合于有固定路线的关卡型游戏。先回顾一下这个怎么用的。

  1. 在场景中摆放LevelStreamingVolume。类似一个个的Trigger Collider,当玩家走进去的时候,就能触发对应场景的加载。
  2. 编辑准备一些SubLevel,在当前PersistentLevel的Levels 视图中配置好。
  3. 在SubLevel 的Level Details 视图中,关联好对应的Volume。

80a4791d03d5de693f78562d9bbf030c.png

然后我们看下代码。StreamingVolume 的代码非常简单。整体来就几步:

  1. 遍历所有的PlayerController;
    1. 遍历相关的StreamingLevel;
      1. 遍历Level 相关的StreamingVolume;
      2. 如果当前PlayerController 在这个Volume 的范围内,则当前Level 需要被加载,否则相反;
  2. 遍历相关的StreamingLevel;
    1. 设置Level 是否应被加载和可见;
// LevelTick.cpp
/**
 * Issues level streaming load/unload requests based on whether
 * players are inside/outside level streaming volumes.
 */
void UWorld::ProcessLevelStreamingVolumes(FVector* OverrideViewLocation)
{
    
	// ...
	if (bStreamingVolumesAreRelevant)
	{
    
		// Begin by assembling a list of kismet streaming objects that have non-EditorPreVisOnly volumes associated with them.
		// @todo DB: Cache this, e.g. level startup.
		TArray<ULevelStreaming*> LevelStreamingObjectsWithVolumes;
		TSet<ULevelStreaming*> LevelStreamingObjectsWithVolumesOtherThanBlockingLoad;
		for (ULevelStreaming* LevelStreamingObject : StreamingLevels)
		{
    
			if( LevelStreamingObject )
			{
    
				for (ALevelStreamingVolume* StreamingVolume : LevelStreamingObject->EditorStreamingVolumes)
				{
    
					if( StreamingVolume 
					&& !StreamingVolume->bEditorPreVisOnly 
					&& !StreamingVolume->bDisabled )
					{
    
						LevelStreamingObjectsWithVolumes.Add(LevelStreamingObject);
						// ...
						break;
					}
				}
			}
		}

		// The set of levels with volumes whose volumes current contain player viewpoints.
		TMap<ULevelStreaming*,FVisibleLevelStreamingSettings> VisibleLevelStreamingObjects;

		// Iterate over all players and build a list of level streaming objects with
		// volumes that contain player viewpoints.
		for( FConstPlayerCon
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE4中,异步加载关卡可以使用场景流送机制场景流送机制是一种将场景分为多个部分并按需加载的技术,可以提高游戏中的性能和效率。 在使用场景流送机制时,需要将场景分为多个Level,每个Level都是一个独立的场景,可以单独进行加载和卸载。在游戏运行时,可以使用Level Streaming Volume将场景分为多个区域,并根据玩家的位置动态地加载和卸载LevelLevel Streaming Volume是一种特殊的Volume,可以在场景中创建。它用于将场景分为多个区域,并在不同的区域之间进行场景流送。 在使用Level Streaming Volume时,需要先创建一个Streaming Level,在Streaming Level中添加需要加载Level,然后将Streaming Level添加到Level Streaming Volume中。当玩家进入Level Streaming Volume所在的区域时,相应的Streaming Level就会被加载,当玩家离开区域时,Streaming Level就会被卸载。 在代码中,可以使用以下函数来加载和卸载Level: ``` ULevelStreaming* UGameplayStatics::LoadStreamLevel( UObject* WorldContextObject, const FName&amp; LevelName, bool bMakeVisibleAfterLoad, bool bShouldBlockOnLoad ); void UGameplayStatics::UnloadStreamLevel( UObject* WorldContextObject, const FName&amp; LevelName, bool bShouldBlockOnUnload ); ``` 在加载Level时,可以选择是否在加载完成后立即显示Level,是否在加载过程中阻塞游戏等待加载完成。在卸载Level时,可以选择是否在卸载完成后立即终止游戏等待卸载完成。 使用场景流送机制可以提高游戏的性能和效率,并可以实现异步加载关卡的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值