关卡动态加载

来源:互联网 发布:淘宝助理数据包制作 编辑:程序博客网 时间:2024/05/22 03:13
原文地址:Unreal4 入门(关卡动态加载)作者:尹俊旭Siri
    对于大型游戏MMORPG游戏或是3D街景(虚拟现实)还有大型无缝地图都需要地图啊,关卡动态加载的机制来达到让用户感觉自己一直是在漫游,而不会出现Loading(读条),卡界面等情况。当然除非是垮区域无法依靠关卡和关卡中之间的关系做处理。

     UnrealEngine4 作为一个多年处于世界前矛的商业引擎,自然而然也为大家考虑到这个这种硬性需求。UnrealEngine4 中的动态加载大概分为3种。

     首先需要明确下几点概念。因为再同学们信息会等的前提下才会更有利于理解和相互交流。好了,不瞎扯了进入正题。

     1.地图(Map):地图这个概念在UnrealEngine4中基本上所示虚拟出来。当然我们编译完一个场景后会保存到自己的工程目录下 如:XXXXContentMaps  保存的文件名叫做.umap。一个工程下可以有很多很多.umap文件,但是我们需要注意到,我们在单独保存场景时编辑器都是基于Level操作的。代码中只有一个函数是关于地图[UEngine::LoadMap]。  如下图:

[转载]Unreal4 <wbr>入门(关卡动态加载)


    2.关卡(Level):关卡这个概念应该是在UnrealEngine4最常用使用的,在UE4编辑器中还有一个单独Levels编辑器。  如下图:

[转载]Unreal4 <wbr>入门(关卡动态加载)


    3.世界(World):World这个概念之前在UnrealEngine3中一直跟地图的概念差不多,World下面会有很多的Levels还有八叉树场景管理器,以及一些寻路啊,对Level和Actor的管理函数。当然现在也差不多,不过没有看见八叉树,多了一种LevelActor的类,SpawnActor中创建对象为"ConstructObject"之前创建对象另一个函数需要Outer和Owner的"DuplicationObject"。


言回正传:UnrealEngine4引擎提了我们有三种动态加载的方法,下面一一介绍。

一. 通过使用LevelStreamingVolume的方法:

    通过Modes窗口下的Volumes找到LevelStreamingVolume,拖动到编辑器中让它覆盖住同学们两个Level,调节LevelStreamingVolume的StreamingUsage属性(比如有加载后锁定,加载,加载后显示等)。
    当我们的Pawn进入到这个LevelStreamingVolume后关卡就会对应的加载啦。  如图:

[转载]Unreal4 <wbr>入门(关卡动态加载)

 加载类型设置属性图例

[转载]Unreal4 <wbr>入门(关卡动态加载)

二. 通过使用BluePrint的方法:

    通过打开关卡的Blueprints使用蓝图完成动态加载。那么在Blueprints中完成动态加载我们需要用到几个节点分别为 LoadStreamLevel和UnloadStreamLevel。 如图:

LoadStreamLevel节点
[转载]Unreal4 <wbr>入门(关卡动态加载)
UnloadStreamLevel节点
[转载]Unreal4 <wbr>入门(关卡动态加载)
    
    特别要注意的是LoadStreamLevel节点需要在MakeVisibleAfterLoad打勾,不然不会显示的呦。第二个暴露变量ShouldBlockonLoad打上勾会,不会被UnloadStreamLevel节点卸载(同学们自行按照需求选择呦)。还有一定要在Leves编辑器中把修改动态加载方法中的[总是加载]改成[蓝图]喔,不然通过Blueprints无法控制动态加载的。

们知道虚幻里要加载新的关卡一般是通过Open Level函数实现,如下所示。

这里写图片描述

但是,open level函数会阻塞进程,如果之前有加载动画在播放的话,当执行open level函数时,所有进程都停止,动画将会停止。如下为验证蓝图。 
这里写图片描述

loading是一个widget蓝图,其含有throbber控件,可以模拟加载动画。根据实测,这个蓝图无法实现动态的加载画面,在open level执行后,所有其他代码都停止执行了。这一点可以在创建loading 控件蓝图后使用delay函数,延迟执行open level验证。在delay时间内,loading都会动态显示,当开始执行open level时,动画停止。

根据这几天在官方论坛的搜索,目前普遍的做法是使用level stream关卡流。level stream本来是用来动态加载超级无限大地图的,防止一次性加载大地图“卡死”。它可以根据设置的触发条件动态的加载、卸载地图map,也就是子关卡。 
所以,使用level stream必选改变当前关卡的层级关系。在“窗口”菜单下找到“关卡”,如下所示,点击左上角的level可以给当前关卡添加子关卡(创建新关卡或者添加现有的)。

这里写图片描述

在任一子关卡上右击,弹出对话框,如下。在“Change Streaming Method”下可以选择当前关卡是“总是加载”还是通过“蓝图”控制。选择“蓝图”,在启动当前关卡(比如开始的游戏UI界面)时就不会加载子关卡,通过load stream level就可以在后台加载子关卡而不会影响当前其他进程(如正在进行的动态加载画面)。 
这里写图片描述

实现的蓝图如下。

这里写图片描述

所以,最终的区别就是open level和load stream level的区别。




三. 通过写代码的方式加载

    在需要切换动态加载关卡的时候,调用[UGameplayStatics::LoadStreamLevel]函数来加载想要使用的关卡。
    大概流程是创建一个FStreamLevelAction,这个Action回去读暴露参数的包遍历所有Level关系找到指定关卡,然后ActivateLevel这个关卡激活的时候会有加载或者卸载关卡。

PS:
    这几天一直在回忆之前使用UnrealEngine4学过的知识,也同时在看UnrealEngine4的新代码,如果出现概念混淆的情况或者叙述错误的情况,请各位同学指出并与我交流[转载]Unreal4 <wbr>入门(关卡动态加载)。  有机会请你们吃饭,喝咖啡。
0 0