您需要 登录 才可以下载或查看,没有账号?注册
x
本期内容: 开放世界的创造是开发的一个主要部分,在游戏产业中尽管它很受欢迎,但开放世界的创造,对于许多开发者来说仍然是一项艰巨的任务但随着虚幻引擎5的发布,创造开放型世界从未有过如此简单 本期分享新的开放世界功能以及如何设置它们
•每个Actor一个文件 •世界分区 HLOD(多级细节层次) 小地图 •关卡实例 •数据层
一般来说,当你在Unreal中工作时在开放世界项目中,你有两个主要问题首先是协作,第二是大型世界中的工作 我们有一个叫做世界场景构成,它本质上只是一个管理器,用来管理子关卡的流送过程。我的关卡选项卡在左边,展示了这个地图包含所有的关卡
考虑到这张地图的大小,关卡数量还是比较少的。你还可以创建很多关卡,它会导入一个关卡网络,在这些关卡中会生成我要使用的流送距离,我可以为这些流距离创建不同的规则,然后我也可以用它来生成日志,在这个左下角的面板上但这也不是一个理想的解决方案
世界场景构成使用的还是同一种关卡结构,这就意味着即使是在这片4公里长的小片地形中,也必须迁出整个地形才能处理场景,因为我们使用的是同一种关卡结构。
如果要处理这块地形就必须手动把它标记为当前关卡。因为如果我开始把Actor放在这个格子里,标记为当前,即使我正在放置它们在左上角这里,他们仍然会被标记为装载,从这个特定的单元格。因此,实际上,开放世界开发的关键困难一直是引擎使用的关卡结构。要解决这个问题,需要对关卡数据的存储和分离方式进行更大的重新思考。如何存储和分离关卡的数据
在虚幻引擎5,先来介绍每Actor一个文件开始,这是我为这个视频做的一个关卡,你可能也注意到了我有这个小东西到处都是可能的人,我用这个来得到所有东西的比例参考,当我在这么大的现场工作时就像我说的,这里有几个关键的区别,最主要的是每个Actor一个文件
这是一个特殊的层次注意到磁盘的大小,大约是8kb,这是非常小的比我们研究的其他地图都要小得多
所以主要的问题是,那些数据怎么了在我们的关卡中? 答案是“_External Actors_”文件夹,我们每个地图都有一个文件夹,因为我们使用了每Actor使用一个文件。每个文件分别对应世界场景中的一个资产,每个单独的资产就是保存在“External Actors”文件夹中的一个Actor,这就提供了一些非常有趣的工作流程选项,因为现在我们有了这些单独的文件引用
假设这个actor现在是一个单独的文件,这意味着我可以移动它,改变它,缩放它,旋转它。我不会干涉任何人的其他可能在这一层工作的人,这样就能摆脱之前那种庞大的工作流程,不需要迁出整个关卡,而是可以简化工作流程执只迁出单个Actor
我们可以在世界大纲视图中预览地图,看到右边整个选项我们可以启用“列”中的“源码控制”
当我移动整个Actor时他就会被迁出这时会弹出警告迁出Actor,你可以看到这里引用了“_External Actors_”这里有很长一串数字带边相应位置的Actor点击并迁出
测试就可以在这个资产后面看到一个绿色的√代表这个资产被我迁出了,其他人想要在这个地图上工作也完全没有问题。他们可以处理世界中的任何一个Actor,就不能处理我迁出的这个Actor
与大家分享个工作技巧,编辑器偏好设置 勾选自动迁出:这样就能在你移动资产时自动迁出资产文件
如果你想使用每Actor一文件功能,打开世界场景设置输入“External Actors” 就可以看到勾选框每个世界分区地图都会启用这项设置这意味你就可以以更高效的协作方式与其他人一起完成项目
世界分区 您可以将世界分区视为世界构成的完整版本,允许您轻松地将您的世界分解为那些小的、可流送的小型区域。如果我们看一下世界分区部分,它看起来和World Composition很像
但有几个关键的区别,世界分区用起来更加简单。在这之前,选择和装卸世界场景构成中的单元格非常缓慢,但是使用世界分区这就不是问题了,我们可以选择任意数量的单元格,而不会减慢速度而且装卸也非常快
但是,世界分区最有用的部分是,用来将这个世界分割成一块块小型区域的网格,现在已经与关卡和网格中的Actor分离开来。这意味着Actor被自动分配到正确的单元格中,这意味着我可以复制这样一个actor,我可以把它复制到一个新的单元格中,装卸原来位置的单元格不会影响我们移动后物体
我们控制这些网格分配的方式,可以在Actor的Details选项卡中在World Partition中,我们有一个下拉菜单叫做Grid Placement,我们可以选择Actor是否在基于边界,位置进行流送,还是始终加载
但这也意味着我们可以改变网格的大小,改变世界划分的方式在“世界场景设置”和“世界分区”中,我们有运行时设置我们可以选择多种流规则,我们可以选择单元格大小,加载范围。现在单元格大小是25600 加载范围是51200
我们也可以预览一下一旦我保存,所有的网格都在这里会自动分配到新的网格单元,这在项目中非常有用。放入构建世界之前可能还没法确定单元格大小。你可能注意到这里的单元格大小与世界分区中的网格大小不一样,这是因为网格固定以512面为单位显示。当我们需要是在这个方块范围内,所有单元格都会被加载进来
如果您想在您的项目上启用世界分区,点击编辑-项目设置-到世界分区,我们可以启用世界分区,我们还可以告诉编辑器启用转换提示,当你加载地图时它会询问你是否需要将当前地图转换为世界分区地图
如果你在世界场景构成中已经有了一个环境,我们也可以转换它。我们有一个自定义命令行,你可以使用只需将您的项目转换为虚幻引擎5,然后运行针对主级别的命令行
世界分区还提供了一个迷你地图功能,您还可以设置要用于它的地图大小 控制台输入:“wp.Mini-Map.ShowReloadButton 1”
当我们按下播放按钮这些都转换成艺术代理品,如果我进入Command选项卡,输入wp.runtime HLOD,把它设为0,将禁用我目前所有的hlod在我的环境中,你可以看到绝大多数的资产已经被移除了
如果我把这个打开,你可以看到我们所有的资产回到我们可以预览当前的单元格
正在使用WP运行时切换绘制加载运行时2d或3D,圆心代表玩家外圈表示距离,这条线代表我的观察方向,绿色的方块代表单元格正在载入,红色方块正在载入被装载的单元格
世界分区生成实际上是在命令行中设置,但我们有一些设置可以先在编辑器中修改,在我们的世界设置里面我们到默认的HLOD层,我们可以从中创建一个HLOD资产来指定默认的HLOD生成方式
对于这个我设置为实例,它将所有相同的网格分组到一个最低记录实例中,并将其标记为始终加载这是我想要的
对于这些背景资产和岩石资产,我想使用一个不同的HLOD1
对于这个我可以选中资产,进入Details选项卡,下到HLOD层,你可以看到我在这里设置了HLOD岩石,是我创建的另一个HLOD图层类型
这个我选择了简化网格,因此Simplified Mesh将尽可能多的网格分组,它们合在一起形成自己的逻辑集群,它会生成一个简化版的网格它只有一种材料
我可以在代理设置中设置我的所有设置,我们也可以标记这些来生成 Nanite网格体,所有背景网格体都是用Nanite将所有的Actor都分配到适当的HLOD层之后,我们可以运行一个Commandlet来转换这些Actor,这是在编辑器外完成的。
我通常的做法是,创建一个虚幻编辑器的快捷方式包含特定参数的Bat文件,你可以导航至编辑器路径,然后导航至相应的项目路径就是你希望执行的操作的项目,接着找到项目中的目标地图在运行你想执行的任务 用这种方式生产而不是编辑器内设置,这意味你可以创建一个专用的设备来生成HLOD。这方法非常有用尤其是在场景非常庞大生产HLOD需要很长时间的时候。以上将多级文件结构转变成单级文件结构的方式,但是这会带来一个很有趣的问题它会导致内容分离,子关卡最大的一个有点是你可以通过蓝图控制他们的流入和流出那么在新系统中要怎么做?
这就需要另外连个新系统数据层和关卡实例 让我们从数据层开始,在Windows选项卡中,你可以找到数据层选项卡,以及数据层允许你非常精准控制资产的流送
假设我们想要创造一个玩家所在的任务,我的任务是抓鱼我有一些记号笔来做这个,这里有个任务标记。所以我创建了这些任务标记,但我并不总是希望它们被加载。我只希望这些任务被加载,我只希望在玩家开始任务时加载这些标记。我的方法是把它们转换成数据层
首先我们创建一个空的数据层然后命名
然后我要分配给mission_ getfish层的所有这些标记
我可以选择这些图层,我可以隐藏它们,也可以显示它们他们用这个小眼睛符号
我还可以控制它们的流送方式
如果我打开动态加载,我可以为这些项目设置流送规则,所以它们的初始状态是我不想装载,因为我只是在我开始新任务时把这个装进去我不需要它们一开始就可见
对于这个,我不需要生成hlod因为我只会把任务数据放在这里所以我没有放入很多网格内容,所以我也不需要为这些生成hlod
数据层的另一个优点,我们可以在Actor的数据层设置中看到,他其实是一个数组而不是一个标记,这就意味着我们可以把Actor分配到多个数据层中应用在不同的场景里
最后,让我们谈谈关卡实例和打包关卡实例 如果你打开古代山谷地图你会发现,绝大多数的资产放置都是使用打包关卡实例制作的,简单地说这些都是你的预设,你可以把内容组合在一起放置在世界中,他们引用了蓝图资产本身还有关卡Actor
如果我们打开这个,就能看到预制件我们增加一个立方体把它保存下来 比如说,这个立方体,把它保存下来
回到我们场景找到我们的actor并告诉它更新打包好的Blueprint
关卡实例将在场景中更新
你也可以将这些内容分解到世界中如果我们右键点击它,到下面的级别实例节按下Break Level Instance,警告说yes,这将删除包级别实例并替换它使用常规静态网格
除了打包的关卡实例,我们还可以添加关卡实例直接面向世界在Create选项卡中,我要打开Place Actors面板输入关卡实例,我们可以将一个关卡实例拖放到游戏世界中
然后我们可以选择任何关卡包括型引用
我们还可以选择运行时行为是什么,是否嵌入了我们丢弃所有关卡实例的地方数据或是否设置为“关卡流送”,就像普通关卡一样流送进来
总之,我们有了一个新的系统取代世界构成,这个系统被称为世界分区。最棒的是你可以把任何层次转换成新的系统。还有这个世界构成在UE5中仍然存在,如果世界分区因任何原因不适合您,您将能够转换您的项目并保持原有的关卡,每个Actor一个文件,单独迁出关卡中的一个Actor,这些文件转移到一个单独的文件夹,所以你会看到一个更小的关卡文件,但这被分割成更大数量的文件
最棒的是我们可以在关卡中工作不存在迁出问题,很多人可以同事在一个庞大的关卡中工作, 数据层和关卡实例,将用于管理内容可以将内容组合在一起也可以分离开来,并让你控制这些元素如何流入和流出关卡(注意这是UE5预览版的部分功能,因此还是试验性功能不建议用当前版本发布项目)
*世界分区取代世界组合,您可以转换为新系统 *UE5 中仍将存在 World Composition *每个Actor 一个文件可让您检查关卡中的各个Actor *我们可以完全在一个关卡上工作,而不存在签出问题 *数据层和关卡实例管理内容组
补充内容: 如何创建开放世界 我们在文件新建一个新关卡,前两个就是这里的两个开放世界和空的开放世界
现在让我创造一个新的关卡(非世界分区),我导入我的地形这里是景观地形,你可以选择它你可以从文件中导入,只要点击它
转到高度图文件导入,选择你的文件夹
现在我们有很多地块你需要从序列中选择第一个
这些绿色的维度显示了这个地形的走向,如果你看到一个足够大的高度地图分辨率,这意味着一切都很好
我只是从这里选择了一个材质外景观
然后点击导入
在虚幻引擎5中,我们在这里有我们的景观代理
如何为它创建世界分区,我们先保存我们的场景,然后我们来到项目设置write worldpartition世界分区和这里是一个复选框启用世界分区,你需要点击它才能启用它并重置虚幻引擎5这是第一步
第二步是进入你的世界设置,再次从这里点击世界设置和这里
如果你注意到这里没有地形,你需要加载它
如何加载到窗口世界分区,选择所有的方框,右击它们加载选择单元格或者你可以选择几个单元格
接下来说下运行时网格设置,在这里我们有索引这是一个数组,我们可以点击预览网格,这是世界划分网格你可以看到我们的地图现在被分成了这些小网格,所以这些点中的每一个都将被输出
这就像关卡一样,所以所有的道具和东西都是将根据距离输出为了展示,我可以在这里放一些树,当我减小加载范围的时候,我要展示的是进入控制台的网格
我要展示的是进入控制台的网格 Wp runtime.toggledrawRuntime Hash 3D会显示网格
我们可以看到所有的树都加载到了这里,当我们继续往下看的时候这些就突然出现了早些时候很明显,加载范围很小
流距离这就是它工作原理的要点,正如你所看到的,它正在加载和调出基于此的网格
很明显你不想要,这些网格有这么小,
所以你希望它明显是这样的更大的加载范围
世界分区如何工作 这些单元格在运行时的流式传输,由两个因素决定,首先是流式传输源的位置其次是一些设置,如果您进入世界分区运行时网格运行时设置和索引中的网格,您可以在世界设置中找到 我们在这里有我们的网格设置,现在我将首先介绍这些, 所以我们有一个网格名称,一个单元格大小,一个加载范围 4-关于慢速流媒体的块 5-优先级 6-调试颜色 7-预览网格选项我将其设置为 true
现在我们可以预览我们的单元格大小和我们的加载范围 我们可以调高流媒体大小 所以我可以把我们的加载范围调高一点,看起来它可能会好一点
第二个因素是流媒体 让我们在这里回到这个常规模式,首先要知道的是播放器将始终是流源单元格,将始终在运行时围绕播放器加载,但您也可以创建蓝图并添加世界分区流源组件当在世界中时它充当流。如果您想知道为什么要使用某些不是播放器的流媒体源,那么将加载源和附近的单元格。例如某种传送设备播放器可以在两个很远的点之间传送,并且你想确保在玩家到达新点之前加载东西这样当玩家到达时,附近的单元格已经加载了
我要讨论的下一个问题是层次结构的细节,层次简单地放置层次细节或 hlod,是为每个单元格为整个世界生成的细节网格,这些网格在单元格卸载时流入并加载并显示在远处,当一个单元格消失时,它将被一个较低级别的细节单元格替换,所以现在要生成这些,您需要使用命令行开关,它必须从命令提示符处运行而不是单元格消失,并且现在有您必须首先采取的一些步骤。如何在虚幻引擎编辑器中设置详细的层次级别,所以要创建一个hlod,在我们的内容浏览器中添加
打开它,我们现在再次在这里有多种选项 *空间加载:可以理解,它只是确定为图层生成的 hlod 角色是否将由流媒体源空间加载,根据其周围的情况 *我们有一个单元格大小一个加载范围和一个父图层 *现在从文档中读取表观图层启用由这个 hlod 层创建的资产将自动分配给指定的 hlod 层,现在我们将其保留为默认值
您可以在地图中使用多个HLOD图层非常重要,例如,您可以为地图中的所有树木和树叶分配一个实例图层,然后您可以分配一个合并的网格层被其他所有东西使用,最简单的方法就是去世界设置世界分区并设置一个默认的HLOD
在这里创建一个立方体,如果我们向下滚动我们应该最终找到名为 hlod 的设置类别,然后我们可以在其中分配一个 hlod 层
控制台命令: wp.runtime.toggledrawruntimehash3d (*在3D中预览DrawRuntime) wp.runtime.toggledrawruntimehash2d (*在2D中预览DrawRuntime) 给你一个2d网格视图这个网格大小视图会显示加载的是哪一级,哪些关卡已经加载完毕
点击播放按钮,我们看到了其中一个立方体,在我们前进到一定距离又出现了另一个立方体 后续:我们将持续跟进开放大世界相关技术应用感谢大家关注与分享
好!本期分享就到这里,我们下期见! |