第十一章关卡动态载入.docx

上传人:b****5 文档编号:2877151 上传时间:2022-11-16 格式:DOCX 页数:41 大小:1.21MB
下载 相关 举报
第十一章关卡动态载入.docx_第1页
第1页 / 共41页
第十一章关卡动态载入.docx_第2页
第2页 / 共41页
第十一章关卡动态载入.docx_第3页
第3页 / 共41页
第十一章关卡动态载入.docx_第4页
第4页 / 共41页
第十一章关卡动态载入.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

第十一章关卡动态载入.docx

《第十一章关卡动态载入.docx》由会员分享,可在线阅读,更多相关《第十一章关卡动态载入.docx(41页珍藏版)》请在冰豆网上搜索。

第十一章关卡动态载入.docx

第十一章关卡动态载入

第十一章:

关卡动态载入

对于优化而言,UnrealEngine3.0的新特性之一是关卡动态载入。

简而言之,关卡动态载入是指关卡在内存中的装载和卸载,以及在游戏运行中对关卡可见性(visibility)的影响。

其构思本身非常的简单;在您接近一个关卡之前,从技术上来说它不会“存在”在游戏里,而当您把关卡甩在身后时,它也不会存在。

这将极大地节省内存的使用,同时使您的游戏拥有广阔的可玩区域。

11.1关卡动态载入的优势

在之前版本的UnrealEngine中,此类优化通过分区(Zoning)来处理,使用这种方法能够将您的关卡分成多个相互隔离的区域,各个区域的可见性基于玩家是否看得到此区域而进行处理。

这种方法有其优点,但是还是会受到这样一个事实的影响,即这种方法只是影响可见性;大型的关卡仍然需要大量的内存。

通过将关卡在不被玩家视线所及时完全从内存中移除,关卡动态载入能够解决上述问题,因此对于优化关卡的可玩性来说,这是一种更有效的方法。

关卡动态载入的益处是多方面的;不仅仅是在计算机资源方面。

首先是协作;因为所有用流方法组织在一起的关卡都包含在其各自的文件中,多个关卡设计师就能够在一个连续的流世界中工作,每人负责各自部分的关卡。

另外一个重要的因素是这使每个关卡都有自己独立的Kismet序列,也就是说,每个关卡都能实质上独立控制gameplay的每个主要方面。

图11.1——本图说明了关卡动态载入背后的基本思想。

11.2测试关卡动态载入

要牢记的重要的一件事是,实际上您不能在InEditorGame(编辑器中运行游戏模式)中真正的测试出关卡动态载入的效果。

这是因为关卡中的所有场景都已经装载到内存中了,而动态载入处理只会用来调整各个关卡本身的可见性。

为了准确的测试关卡动态载入的设置,您需要在编辑器之外对其进行测试,最好是在实际的游戏运行平台上。

如果您正使用UnrealEngine3Runtime(UnrealEngine3运行时端),您可以通过创建一个新的到ExampleGame的快捷方式来测试,要用您的关卡名作为快捷方式的扩展名,与编辑器的打开方法类似。

例如,如果您的关卡命名为DM_DirgeOfMonkeys,那么您创建的新的到ExampleGame的快捷方式将如下所述:

∙C:

\UnrealInstallation\Binaries\ExampleGame.exeDM_DirgeOfMonkeys

11.3动态载入的方法

有两种基本的方法可用于关卡动态载入:

距离(Distance)和Kismet。

无论关卡何时为了动态载入目的而引入,都必须在这两种方法中选择一种进行处理。

两者之间的差别很明显而且从其名称即可看出各自的功能;距离(Distance)使用的是游戏玩家到将关卡串联在一起的给定点的距离,而Kismet使您能够使用Kismet事件和动作将关卡串联起来。

根据哪种方法最适于关卡,您能够以任何喜欢的方式将其混合和匹配使用。

在使用Kismet方法时,关卡设计师也可以选择使用LevelStreamingVolumes(关卡动态载入体),它提供一种非常直观的进行动态载入处理的方法。

还有一种特殊的技术能够用来串联多个关卡动态载入场景,在本章随后的内容中将对其进行讨论。

11.4固定关卡vs.动态载入关卡

在关卡动态载入情况中有两种类型的关卡:

固定关卡(PersistentLevels)和动态载入关卡(StreamingLevels)。

固定关卡正如其名称所示,在游戏运行中总是显示。

它是其它关卡装载和卸载的基础。

固定关卡是任何关卡动态载入场景的必要条件,因为它是最初装载的用来启动动态载入处理的关卡。

在许多情形中,此关卡只是一个漂浮在虚无空间的PlayerStartactor。

实际的可玩的关卡随后动态载入这个固定关卡中。

因为每个动态载入情况中的关卡都包含自己的Kismet序列,固定关卡必须包含用于所有关卡的各种序列。

这包括实际进行动态载入处理的各种Kismet,以及用于多个关卡的供Kismet使用的各种变量,如MusicTrackBanks。

实际被动态载入固定关卡的关卡被叫作“StreamingLevels(动态载入关卡)”。

虽然从技术上来说,在动态载入情况下没有限制你可以放置多少动态载入关卡,但是您应该意识到,在每个固定关卡中装载大量的动态载入关卡会导致性能的下降。

作为参考,Epic的游戏《GearsofWar》(战争机器)一般在每个固定关卡中载入大约20个动态载入关卡。

当关卡在动态载入时,尺寸也是一个考虑因素。

动态载入关卡的创建应该使其在载入到一起时能够互相连接,而不是重叠。

也就是说,网格(grid)的大小将限制关卡动态载入场景的大小。

然而,这不太会成为设计过程中所关注的重要问题,因为网格在二维平面上提供的范围大约为36平方英里,如果考虑三维空间的话大约是216立方英里。

而且,您会注意到在关卡中靠近网格边缘可能出现某种精度问题。

最后,您应该注意的是,在一般环境中,一个动态载入关卡只是一个被载入到固定关卡的普通关卡,同样也可以载入到其他固定关卡,从而形成一种层次化结构。

这种处理不像标准的关卡动态载入那样连续无缝,因为从一个区域到下一区域会有明显的加载时间。

然而,仍然可以利用这段时间加载游戏内容。

对于那些玩过GearsofWar游戏的人来说,很清楚这就是游戏的不同段落载入到一起的方式,也是游戏通常在章节之间播放一些过场画面的原因。

装载正在进行中,但是并不是完全流畅连续的;在这种情况发生时,播放一段动画可以保持游戏玩家的兴趣。

11.5关卡浏览器和场景管理器

关卡动态载入处理的主要工具是关卡浏览器(LevelBrowser),全都在GenericBrowser(主浏览器)窗口中的Level标签内。

在关卡浏览器中,您可以把动态载入关卡添加到固定关卡中。

所有装载的关卡,包括固定和动态载入关卡,都会在此浏览器中列出。

您也可以查看和编辑任意关卡的属性,将LevelStreamingVolumes(关卡动态载入体积)关联到适当的关卡,以及设置CurrentLevel(当前关卡)等。

图11.2——关卡浏览器。

您可能会注意到UnrealEd在其File菜单下并没有通常的“Save”选项。

取而代之的是SaveCurrentLevel选项。

原因是当一旦对多个动态载入关卡进行操作时,您需要指定哪一个关卡是您正在调整的,这样才可以把改动保存到正确的关卡中。

这种指定被称作标记关卡为“current(当前)”。

只有当前关卡才会真正接收到放置在关卡中的新的actors。

在同时处理多个关卡时这非常重要,您总是通过调整当前关卡来影响正在进行操作的关卡,这样就不会把改动保存到错误的关卡中了。

当前关卡在关卡浏览器的关卡列表中用被标识有CURRENT的标签加以说明。

关卡浏览器中列出的关卡可以用颜色编号以便于组织。

每个关卡都可以单独保存,而每个关卡的Kismet序列也可以通过此浏览器进行访问。

场景管理器(SceneManager)是一个电子表格风格的浏览器,使您能够看到所有关卡中的actors,并可让您访问关卡本身的WorldInfo属性。

不过,在您首先打开场景管理器时,它不会显示任何东西。

为了在管理器中看到关卡,您必须从关卡浏览器的关卡列表中选择关卡,在其上点击右键,并从弹出的关联菜单中选择ShowSelectedinSceneManager。

图11.3——场景管理器。

在场景管理器中,您可以选择、关注和删除关卡中的actors。

您也可以轻松地过滤列表,从中选择任何您想要的actor类型。

11.6MapChanging(地图变更)

关卡动态载入系统中的一个独特功能是可以通过MapChanging(地图变更)实现真正的固定关卡更替。

在某种意义上,这类似于在多个关卡动态载入情况之间进行动态载入处理。

这和标准的关卡动态载入处理相比稍微有点不同,它需要使用两个专门的Kismet序列对象:

PrepareMapChange(准备地图变更)和CommitMapChange(提交地图变更)。

PrepareMapChange(准备地图变更)

此对象将启动用于新固定关卡的装载过程。

图11.4——PrepareMapKismet序列对象。

CommitMapChange(提交地图变更)

此对象执行向新固定关卡的真正转换。

图11.5——CommitMapChange(提交地图变更)Kismet序列对象。

此项技术与标准关卡动态载入处理的区别在于,在后台执行装载过程中,随着从一个固定关卡转到另一个固定关卡,会出现明显的跃迁(或“pop”)。

设计师通常使用一些分散注意力的机制来掩盖此问题,例如在将新地图装载进内存时淡入到其它的画面或使用Matinee序列。

游戏GearsofWar就是使用的这一技术。

建立Mapchanging(地图变更)的基本设置是创建多个关卡动态载入情况,每个情况都具有各自的固定和动态载入关卡。

创建一个新的“空”地图来处理不同固定关卡之间的转换。

在这种情形中,“空”的意思是关卡通常只包含一个PlayerStartactor以及一些Kismet序列,用来处理第一个关卡的装载,以及创建装载其它固定关卡所需的细节。

一旦一个固定关卡装载完毕,其相应的动态载入关卡将被自动处理,直到下一个固定关卡装载完毕。

值得注意的是,地图更换在InEditorGame(编辑器中运行游戏模式)中是无效地。

为了实际测试此处理过程,必须在独立运行的游戏中运行主固定关卡。

此处理过程将通过关卡动态载入处理中的LevelStreamingVolumes(关卡动态载入体积)一节阐述。

指南11.1——关卡转换,第一部分:

创建入口关卡

在本指南中,我们将建立一个简单的系统,用于关卡之间的转换,在真实的游戏中您或许会用到这种转换。

我们将使用上文所述的地图更换概念。

首先,我们将创建一个地图,将其用作载入多个固定关卡的容器。

地图非常简单,由一个PlayerStart、一个cube画刷以及一些用来装载第一个关卡的Kismet组成。

需要添加cube画刷是因为PlayerStart需要一些几何体来确定正确位置进行构建。

不过,我们需要确保这个几何体在所有动态载入的关卡中都是不可见的。

注意:

在您开始学习本章的指南之前,确保可以访问下列的关卡,它们都包含在DVD中用于本章的文件里。

∙MU_Level_01

∙MU_Level_02

∙MU_Level_03

∙City_Stream_1

∙City_Stream_2

∙City_Stream_3

∙City_Stream_4

下图很好地描述了我们所要创建的动态载入处理的样式。

图11.6——本图说明了动态载入处理的示例,它将用于本章的所有指南中。

1.启动UnrealEd,开始添加新的地图。

在本书编写时,关卡动态载入处理不能与挖空式关卡(subtractivelevels)正常工作。

设置透视图观察点(Perspectiveviewport)的模式为Unlit(无光照)。

2.右键点击Cube按钮并在CubeBuilder窗口中进行下列设置:

∙X:

256

∙Y:

256

∙Z:

32

点击Build(构建)并在完成后点击Close(关闭),然后将红构造刷(RedBuilderBrush)下移1024单位使其不可见,并使用CSG:

Add按钮

使红色构造刷添加到关卡中。

图11.7——CubeBuilder(立方体构造器)的设置。

3.右键点击新创建的画刷并选择AddActor->P

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1