世界构建指南

科技   科技   2024-07-08 09:10   山东  


本指南将介绍与使用虚幻引擎的世界分区系统构建世界相关的各种功能、主要知识点、良好实践、误区、限制和用例等等。

注意:文中提及的路线图/未来发展可能会变化,有关未来发展的最新消息请参阅前瞻性路线图

改动日志:

- 更新了虚幻引擎5.2、5.3、5.4的改进以及良好实践、限制和误区的相应变化。

功能介绍

世界分区

世界分区是一种自动数据管理工具和基于距离进行加载的关卡流送系统,为大型世界管理提供了完整的解决方案。这个系统将整个世界划分为网格单元并保存在一个固定关卡中,不需要像以前那样将大型关卡划分成许多子关卡。它提供了一个自动的流送系统,让你可以根据与流送源之间的距离来加载和卸载这些网格单元。

一Actor一文件

一Actor一文件(简称OFPA)可以将Actor实例的数据保存到外部文件中,这样在更改Actor时就不需要保存主关卡文件,可以减少用户之间的操作冲突。

关卡实例和打包型关卡Actor

关卡实例和打包型关卡Actor都属于“非破坏性”工作流程,让用户可以在相同的世界中进行内容实例化,以实现不同的用途和目标。

数据层

数据层可以在运行和编辑时有条件地加载世界数据。Actor和世界分区会确定用哪种流送逻辑(是否空间加载、运行时网格和启用流送),而数据层会充当关卡流送的筛选器。

分层细节级别

分层细节级别(简称HLOD)是一组Actor的视觉表现,用于替换远距离的Actor并可自动生成。

编辑器和用户体验

与世界分区相关的编辑器、大纲和用户体验。

除世界分区外的数据流送系统

除了世界分区之外,还可以通过其他系统来处理数据流送,具体取决于使用的功能和平台。比如Nanite、纹理和音频也是非常重要的内容流送系统。

功能详情

世界分区

实用链接

官方文档:

https://dev.epicgames.com/documentation/zh-cn/unreal-engine/world-partition-in-unreal-engine 

重要知识点

世界构建、自动流送、网格设置和提升、Actor流送设置、流送源、数据层、HLOD、关卡实例、打包型关卡Actor、OFPA、commandlet、烘焙版本、服务器流送、生成流送

定义

世界分区是一种自动数据管理工具和基于距离进行加载的关卡流送系统,为大型世界管理提供了完整的解决方案。这个系统将整个世界划分为网格单元并保存在一个固定关卡中,不需要像以前那样将大型关卡划分成许多子关卡。它提供了一个自动的流送系统,让你可以根据与流送源之间的距离来加载和卸载这些网格单元。

虚幻引擎5.4的重要变化

  • 带3D网格的运行时哈希

新的世界分区运行时哈希解决方案改进了之前空间哈希的局限性:

  • 可以使用一系列不同类型的分区对象

    • 许可用户可以轻松实现他们自己的分区方案,不必为HLOD和数据层执行自定义代码。

    • 每个分区对象会保存自己的HLOD设置(HLODSetups)层设置

  • 支持基于提供的松散分层网格分区类型进行3D分区和流送。

    • 利用单元大小可变的方法,减少围绕轴和网格原点的流送关卡提升问题。

    • Actor边界用于确定流送关卡,以及在提升前改变单元大小,最大不超过指定网格大小的1.5倍。

  • 全面支持OFPA、数据层、关卡实例、流送源和HLOD

  • 在《Fortnite》空降行动中测得的性能和内存占用率与之前采用空间哈希时差不多或更好

  • 简化了高级CVAR的复杂性,这些CVAR可用于改变之前的空间哈希的行为,包括网格提升、放置规则(枢轴点或边界)、网格对齐等等,因为新的运行时哈希和松散分层网格中已不需要。

  • 在虚幻引擎5.4中新建的世界分区关卡将默认使用运行时哈希+松散分层网格

    • 提供从空间哈希升级为运行时哈希的路径

    • 新世界的默认哈希类型可以在项目设置中更改



    • 动态子世界分区

    可以通过代码或蓝图在一个世界中启用多个子世界分区,并从持久世界或父世界中动态选择或流送这些子世界分区。

    若将关卡实例Actor的关卡行为(5.4新增功能)属性设为独立(Standalone),并引用启用了流送的世界分区关卡,该关卡实例Actor将自动被视为子世界分区关卡。诸如2D调试视图等调试工具已经过调整,可用于显示所有实例化分区世界的全局视图。

    支持子世界分区关卡的HLOD,但只有在相应的基础关卡流送时才会显示。未来版本将为HLOD和子世界分区关卡提供更多支持。

    子世界分区的潜在用例:

    1. 基于图块的世界(例如《Lego Fortnite》中使用的世界):多层子世界分区关卡彼此相邻,构成一个庞大的世界。图块可以静态或动态选择,每个单独的图块层都运行着自己的世界分区系统。


    1. 特定区域(例如动态设置位置):在一个更大的基础世界中,使用动态子世界分区来改变特定的目标区域和/或单独控制其流送网格设置。

    • 专用服务器流送

    世界分区支持专用服务器流送,包括流入和流出,并且基于流送源位置复制和额外的参数来控制专用于服务器的流送。在多人游戏的大型世界中,这有利于提供更好的服务器平衡和优化。

    可在项目的DefaultEngine.ini中设置:

    wp.Runtime.EnableServerStreaming 

    wp.Runtime.EnableServerStreamingOut wp.Runtime.ServerDisallowStreamingOutDataLayers

    项目的服务器流送模式选项还可以在世界场景设置(World Settings)中根据每个世界进行覆盖。

    • Actor Desc修改器

    这是一项实验性功能,允许项目通过代码改变Actor属性,例如运行时网格或空间加载标记。该功能适用于测试全局变化,无需在本地修改或签出世界中包含的所有Actor。

    虚幻引擎5.3的重要变化

    • 关卡流送持久性

    关卡流送持久性(Level Streaming Persistence)是一个实验性插件,可以通过关卡流送持久性管理器,管理流出/流入关卡中包含的对象上特定标记属性值的保存和恢复。

    这些属性必须在引擎配置(ini)文件中定义。属性可以设为私有或公开,主要区别在于私有属性更有利于节省内存空间,公开属性可以在未加载关卡时修改/访问。公开属性的任何修改(即使未加载)都会被应用到流入的下一个关卡中。

    [/Script/LevelStreamingPersistence.LevelStreamingPersistenceSettings]

    ; Private Properties

    ; ------------------------------

    +Properties=(Path="/Script/Engine.TextRenderComponent:Text")

    +Properties=(Path="/Script/Engine.TextRenderComponent:TextRenderC olor")

    +Properties=(Path="/Game/Maps/_PERSISTENCY_/RandomStringActor.Ran domStringActor_C:MyText")

    +Properties=(Path="/Game/Maps/_PERSISTENCY_/RandomStringActor.Ran domStringActor_C:MyTextColor")

    ; Persistent properties

    ; ------------------------------

    [/Script/LevelStreamingPersistence.LevelStreamingPersistenceSettings]

    ; Public Properties

    +Properties=(Path="/Script/Engine.Actor:bCanBeDamaged",bIsPublic= True)

    关卡流送持久性管理器的状态也可以保存和加载到磁盘上/从磁盘加载。

    之前版本的重要变化

    • Actor提升 - 仅限空间哈希,不适用于虚幻引擎5.4新推出的运行时哈希

    新增了一个用于减少Actor提升的选项(默认禁用,CVAR),分区Actor在穿过网格中心轴时会变为持久化Actor的问题也已经修复。

    • Actor:额外检查AABB < 网格单元大小(2D),若为True,将使用其枢轴点位置将Actor将被分配至网格单元。

    • 分区 Actor(地形代理、植被Actor等等)使用枢轴点。

    • CVAR:

    wp.Runtime.RuntimeSpatialHashPlaceSmallActorsUsingLocation=1 (仅限基础网格关卡,若对象未通过此项测试,将进行常规提升)

    • 网格中心变化 - 仅限空间哈希,不适用于虚幻引擎5.4新推出的运行时哈希

    可以选择网格偏移量,其中,网格关卡会以每个网格关卡的一个网格单元为中心,而不是所有关卡都以相同的网格原点为中心。

    • CVAR:

    wp.Runtime.RuntimeSpatialHashUseAlignedGridLevels=0 wp.Runtime.RuntimeSpatialHashSnapNonAlignedGridLevelsToLower Levels=0

    • 移除编辑器网格,引入位置和区域

    虚幻引擎5.1的编辑器和世界分区系统已完全移除编辑器网格的概念。因为它会带来很多问题,网格本身也存在局限性,导致我们难以构建出比《黑客帝国:觉醒》更大的世界(编辑器中使用的内存)。

    • 位置体积

    可以在世界中添加、命名和保存位置体积Actor,以便在世界分区编辑器中明确表示一个持久区域。此外,编辑器可以选择和加载临时2D区域,让你无需任何位置体积就可以在关卡中工作。这也为书签系统的开发奠定了基础。

    • 删除了每个Actor的网格放置选项

    无需再用Actor属性中的选项来决定Actor是否应该使用边界、枢轴点或中心点来定义Actor将被放置在哪个流送单元,除非启用上述新的Actor提升CVAR,否则我们都将使用边界来定义。现在的Actor属性中只剩两个选项,分别是要使用的网格和“是否空间加载”(IsSpatiallyLoaded)。

    • 《Fortnite》第四章使用的世界分区

      • 目前所有平台均支持世界分区,性能、质量和整体稳定性全面提升。所有功能都可以在虚幻引擎5.1版本上使用。

    • 玩家控制器基类现在可以自动注册为流送源。


    良好实践

    • 网格设置

      • 从一个网格开始构建世界,最后的网格数量越少,质量越高。

      • 运行时哈希/松散分层网格或空间哈希的“网格大小”(Grid Size)和“加载范围”(Loading Range)应基于游戏、物理和Actor数量预估/需求进行设置,并随着内容的增加,根据持续分析的结果进行重新评估/调整。

      • 考虑使用Nanite、纹理和音频系统来流送内容。

      • 考虑HLOD的设置(实例层、启用Nanite、合并、流送或始终加载)。

    • 使用关卡实例和打包型关卡Actor,将两者结合在一起。

      • 关卡实例可以让我们在相关环境中编辑子关卡,轻松将相同数据的多个实例放置在世界中。在大多数情况下(启用OFPA和关卡行为 = 已嵌入虚幻引擎5.4),关卡实例会被分解,它们所包含的Actor,包括嵌套的关卡实例Actor,会在生成流送(在PIE和烘焙进行)时被移入持久世界网格中。

      • 打包型关卡Actor可以很好地将纯视觉内容打包到单个Actor中,减少Actor数量,提升GPU的运行速度。

      • 两者相互正交,关卡实例可以嵌套在其他关卡实例中形成层级结构。打包型关卡Actor可以像其他任意Actor一样,放置在关卡实例中。

      • 打包型关卡Actor是一个单独的Actor,具体流入哪个网格单元由其边界决定。确定粒度时应考虑这一点。

    • 灵活运用,加载需要的内容。

      • 在复杂而庞大的世界中,比如《黑客帝国:觉醒》演示项目/城市示例项目,我们只能在编辑器中加载当前正在处理的工作区域。目前尚不支持自动流入编辑器。要在编辑器中加载特定区域,可以使用世界分区编辑器、位置体积或者HLOD。

    • 使用流送源组件

    游戏中的流送取决于流送源。玩家控制器是一个默认的流送源,但也可以给任意Actor(例如过场动画的摄像机)添加流送源组件,用于加载来自其他地方的内容或进行预加载,在另一个位置实现无缝的游戏动画播放。

    • 流送源的形状、优先级、目标网格和目标状态可以根据特定用例(如过场动画、高速移动、预加载等)在各个组件中修改。

    • 阻塞缓慢流送和网格优先级

      • 启用这个选项时,阻塞缓慢流送(Block On Slow Streaming)网格将等待要求的所有流送关卡网格单元完成流送,迫使游戏冻结。网格优先级可以控制最先流送哪个网格。使用这两个选项可以发现流送问题或防止游戏进程出现问题。

      • 另一方面,如果运动速度对你的游戏玩法至关重要,还可以选择忽略优先级较低的非阻塞网格,因为这些网格中的内容不需要高速流送。

      • 阻塞加载请求将根据DistanceToCell(与单元的距离)/loadinggrange(加载范围)的比率发起,该比率可以由wp.Runtime.BlockOnSlowStreamingRatio控制

    • 空间化

      • 在概念设计/前期制作期间,根据目标加载范围对复杂/独特的内容进行主题化和布局设计。空间可以为你提供帮助,请发挥你的聪明才智好好利用。

      • 显示网格预览(Show Grid Preview)选项是一个非常有用的调试可视化工具,可以直接在编辑器中查看流送网格和大致的流送范围,以验证空间、网格大小和范围。虽然这不能替代真正的游戏内部调试,但是有助于防止游戏在之后出现问题。


    • 禁用流送!

      • 世界分区关卡可以禁用流送功能,但仍将受益于OFPA、关卡实例,以及最重要的数据层支持。

      • 这种设置对于小型世界、过场动画或仅限生产的关卡(例如资产库或玩法调试关卡)来说非常有用。

      • 如果世界分区关卡关闭流送功能,数据层仍然可以根据其状态(已卸载、已加载、已激活)在全局范围内流送Actor(在全局范围内作为每个数据层的单一关卡)。

      • 可随时通过编辑器中的世界场景设置->世界分区设置->启用流送选项启用或禁用流送系统。


    注意:禁用流送功能时,所有内容将默认加载,此时应注意编辑器和游戏的内存占用情况和性能,确认是否满足制作平台和目标平台的规格要求。

    • 使用Sequencer时应拥有Actor而不是使用可生成对象

      • 相较于将本来就来自序列的可生成对象通过引用的方式再加载到序列中,,拥有的Actor可以实现直接流送,甚至添加到数据层中。

      • 这样可以更好地控制流送的内容,以及何时流入/流出序列所需的内容。由于数据层可以提前预加载,然后在序列中的任何时间点激活,因此可以更加精细化地控制内存,从而在约束条件下创建更丰富的过场动画。

    • 安排流送和内容监督人员,推动分析自动化

      • 由技术美术师、技术总监负责监管世界演示项目的运行、内容预算和验证。

      • 根据你的游戏和内容规格,尽可能实现自动化。

      • 如果要对两个不同的项目进行性能比较,回播功能就可以派上大用场,它还可以通过可重复的详细排查来分析两个项目之间的改动。你可以在生产早期就使用回播功能来更好地分析性能。

    误区

    • 通过多个网格的堆叠增加关卡

      • 每个网格中至少包含一个Actor的单元,会生成一个流送关卡。此外,还会为该网格单元中Actor上的每个唯一运行时数据层组合创建一个流送关卡。

    流送关卡的总数可能会对性能产生影响,若想在一个世界中堆叠多个网格和活跃的运行时数据层,就要考虑到这种情况带来的影响。参见下文的《黑客帝国:觉醒》、《Fortnite》空降行动和《Lego Fortnite》示例。最后,还要对添加新网格的综合效益进行测试、分析和验证。

    • Actor的边界

      • Actor的边界可以帮助你确定Actor所在的网格关卡,Actor边界太广可能会导致内容被提升为持久内容,从而违背自动流送的目的。这个问题可以通过验证和自动化来监控。(例如用一个含样条网格体组件的Actor,并横跨整个世界)

      • Actor(例如附属Actor/存在父子关系的Actor)之间的硬引用在流送时将被视为一个整体,从而影响边界。硬引用/父子关系应仅限于邻近、重叠或位于单元大小范围内的Actor。如有可能,还是建议使用软引用以避免相应的问题。


    • 场景/数据层管理

      • 就管理数据的用户体验来说,场景大纲视图和编辑器数据层可能会有冲突,在密集的大型世界中也可能会产生相应的问题。这时请创建并应用场景结构,也可以使用预配置的关卡模板。在可能的情况下,使用Actor编辑器上下文(Actor Editor Context)功能。在必要的情况下,使用验证(Validation)。将编辑器数据层留给大型或特定工作集。


    • 网格提升的细化管理

      • 了解网格提升的概念后,大多数人可能会想到通过位置、边界、对象大小等细节来控制网格提升。事实上,我们要做的不是细化管理,而是监控,并在构建系统时也考虑到这一点。

    注意:现在有了新的运行时哈希解决方案及其松散分层网格分区类型,为我们提供了一种改变单元大小的方法,大幅减少了网格提升的影响。

    局限性

    • 重新配置网格与分区Actor

      • 诸如地形和植被等分区Actor可以在可配置的网格大小上进行切分,并根据需要按照确定的大小创建(例如在绘制植被或添加地形组件时)。在重新配置世界的流送网格时,由此形成的分区Actor不会更新;必要时,可以使用相应的commandlet重新创建分区Actor。

        • 世界分区植被构建器

        • 世界分区地形构建器还未实现,但是已经纳入我们的计划。

      • 分区Actor的数据层不能通过数据层操作更改。只有植被能通过植被模式中的移动(Move)工具进行更改。

      • Actor编辑器上下文只能用于在分区Actor创建时分配数据层。


    • 在编辑器中手动加载

      • 系统目前还不支持在编辑器中基于摄像机来自动加载。世界中的内容必须使用世界分区编辑器,通过临时选择区域和/或世界中放置的位置体积Actor来加载。

      • 在编辑器中加载不限于内存池/缓冲区(相较于Nanite或纹理流送),因此在密集的世界中加载大面积的区域时,可能会导致内存崩溃。


    • 运行时约束

      • 运行时不创建/改变网格,你每次点击启用PIE(在编辑器中运行)模式或烘焙版本时都会生成流送。

      • 运行时不创建关卡/注入关卡

        • 即将推出的外部数据层/游戏功能插件支持在运行时注入特定Actor。

        • 关卡实例化可以通过代码实现。

      • 生成的Actor具有持久性,子Actor依赖于父Actor的流送。

      • 移动物体会被加载到它们的流送关卡中或从中卸载,即使已被移到流送关卡外。

      • 从持久Actor中引用空间加载Actor也会把它们变成持久/始终加载的Actor。

      • Sequencer生成的Actor与序列一起加载,通常情况下,最好使用可拥有的Actor。

    • 垃圾回收

      • 卸载的内容将按固定时间间隔,或在卸载一定数量的网格单元后,被当做垃圾回收,以便随着时间的推移更好地分配开销。

      • 这个时间间隔可以通过下文所示的CVAR进行调整,当待清除的关卡(包括流送单元、数据层和内容包的关卡)超过规定数量时,它会强制执行GC更新:


    wp.Runtime.LevelStreamingContinuouslyIncrementalGCWhileLevel sPendingPurgeForWP (默认64位)

    • 一Actor一文件(OFPA)

      • 在编辑器中,世界分区常常与OFPA搭配使用。我们要考虑大量外部文件和源码管理加载。

    • 热重载

    • 虚幻引擎支持资产热重载,在世界分区关卡中发现的外部Actor不能通过恢复/同步操作进行热重载。只有关闭世界分区关卡,才能重载外部Actor。

    • 仅限动态光照

      • 目前世界分区不支持静态光照烘焙功能。

        • 虚幻引擎5.5将提供针对静态和体积光照贴图的基本支持。

    • 持久性

      • 关卡流送持久性插件目前只是一个实验性解决方案。

    当前用例/应用场景

    《Fortnite》第五章 - S1、S2、S3

    • 地图大小:2km x 2km

    • Actor数量:约10万个

    • 哈希:空间哈希 - 2D网格

    • 单个网格:单元大小128m,加载范围256m(低端平台上的范围可能有所变化)。

    • HLOD设置。

      • 建筑的HLOD(2层)

        • HLOD0特殊合并网格体,支持破坏,单元大小为256m,加载范围为512m,空间加载。

        • HLOD1简化的网格体,单元大小为512m,加载范围为2048m,空间加载。

      • 树木的HLOD(1层,非空间加载)

        • 树木替代物的实例化层,始终加载。

      • 持久世界中的HLOD(非空间加载)

        • 悬崖、特殊合并网格体案例和大型雕像

    • 关卡实例:所有兴趣点和位置。

    • 数据层:

      • 50+运行时数据层,用于呈现每个活动/赛季的变化。

    • 服务器:加载的所有内容。

      • 在PIE模式中使用服务器流送,以提高开发人员的迭代速度和工作效率。

    • 地形:始终加载。

    • 平台:移动平台、Switch以及当前支持Nanite的其他所有平台

    • 打包型关卡Actor:无。

    《Fortnite》第四章

    • 地图大小:2km x 2km

    • Actor数量:约10万个

    • 哈希:空间哈希 - 2D网格

    • 单个网格:单元大小128m,加载范围256m(低端平台上的范围可能有所变化)。

    • 2种HLOD设置。

      • 建筑的HLOD(2层)

        • HLOD0特殊合并网格体,支持破坏,单元大小为256m,加载范围为512m,空间加载。

        • HLOD1简化网格体,单元大小为512m,加载范围为2048m,空间加载。

      • 树木的HLOD(1层)

        • 树木替代物的实例化层,始终加载。

    • 关卡实例:所有兴趣点和位置。

    • 数据层:

      • 4个专门用于大厅/新手岛屿的数据层。

      • 针对每个活动/赛季的变化提供1个数据层。

    • 服务器:加载的所有内容。

      • 在PIE模式中使用服务器流送,以提高开发人员的迭代速度和工作效率。

    • 地形:始终加载。

    • 平台:移动平台、Switch以及当前支持Nanite的其他所有平台

    • 打包型关卡Actor:无。

    《黑客帝国:觉醒》演示项目 - 虚幻引擎5

    • 地图大小:4km x 4km

    • Actor数量:约10.7万个

    • 哈希:空间哈希 - 2D网格

    • 单个网格:单元大小128m,加载范围128m。

    • HLOD设置(2层):

      • HLOD0启用Nanite的实例化层,单元大小为256m,加载范围为768m,空间加载。

      • HLOD1简化网格体,单元大小为256m,始终加载。

    • 在虚幻引擎中使用Houdini和规则处理器(Rule Processor)插件以程序化方式构建,手动创建重点位置。

    • 所有建筑、道路、道具都使用了打包型关卡Actor和使用静态网格体以程序化方式生成的Actor(相当于打包型关卡Actor)。

    • 数据层(运行时:35,编辑器:12)。

      • 用于动画和游戏内容。

      • 用于屋顶和公路下的资产。

    • 地形:无


    《Ancient Game》 - 虚幻引擎5预览项目

    • 地图大小:2km x 2km

    • Actor数量:约1.4万个

    • 哈希:空间哈希 - 2D网格

    • 单个网格:单元大小64m,加载范围64m。

    • HLOD设置(1层):

      • HLOD0实例化层,始终加载。

    • 打包型关卡Actor:用于岩石分组,提供针对碰撞合并的自定义支持。

    • 数据层(运行时:2,编辑器:1)。

    • 地形:无。


    路线图和未来发展

    • 外部数据层,用于游戏功能插件和DLC内容

    • 流送单元转换器框架,用于为PIE和烘焙版本转换单元数据

    • 运行时关卡注入支持(虚幻引擎5.5的实验性功能)

    • 地形构建器

    • 通过热图、视口可视化、扩展见解改进世界分区的调试、监控和分析功能。

    • 在世界分区关卡中为静态和体积光照贴图提供基本支持(虚幻引擎5.5新增功能)

    • 持续优化用户体验

    • 书签

    • 编辑器内摄像机流送(长期)


    实用命令

    • wp.Runtime.ToggleDrawRuntimeHash2D或3D:开关世界分区运行时哈希的2D/3D调试显示。

    • wp.Runtime.OverrideRuntimeLoadingRange-grid=[index]-range=[DesiredValue]:覆盖加载范围。

    • wp.Runtime.OverrideRuntimeSpatialHashLoadingRange-grid=[index]

    -range=[DesiredValue]:覆盖加载范围。

    • wp.runtime.hlod :开关HLOD显示。

    • wp.Runtime.DebugDedicatedServerStreaming


    一Actor一文件

    实用链接

    官方文档:

    https://dev.epicgames.com/documentation/zh-cn/unreal-engine/one-file-per-actor-in-unreal-engine 

    重要知识点

    关卡和Actor设置、源码管理、外部Actor和GUID、未保存、非受控CL

    定义

    一Actor一文件(简称OFPA)可以将一个关卡中的Actor保存到单独的外部文件中,避免在更改Actor时争用主关卡文件,从而减少用户之间的操作冲突。这些外部Actor保存在项目的内容文件夹中,但是不能从编辑器的内容浏览器访问。OFPA还包括场景大纲文件夹,作为外部对象,保存在项目的内容文件夹中,并且允许用户移动、重命名和删除,不需要签出所有Actor和世界。

    虚幻引擎5.4的重要变化

    • GUID缺乏“美观性”

      • 关于在日志和检查表中显示GUID而非经美化的Actor名称的问题已修复。

    • 非受控文件发现修复:

      • 阻止本地编辑文件被发现并在非受控CL中列出的问题已修复。现在,这一发现过程将在初始资产发现后进行,也就意味着只有完成这一步骤,才会更新非受控CL视图。

    • 默认非受控变更列表缺失:

      • 虚幻引擎5.4.2已修复阻止默认非受控变更列表出现的问题。


    虚幻引擎5.2的重要变化

    • 场景大纲视图未保存列和附加筛选

      • 场景大纲视图中的未保存列可以用于整理和查看已修改但未保存的Actor,之后我们可以通过常规保存对话框(保存所有、保存关卡、选择要保存的文件)或右键单击并选择“保存所选Actor”(Save Selected Actor)来保存这些Actor。

      • 场景大纲视图筛选器支持未保存、非受控和各种源码管理状态。

    • 查看变更窗口中的未保存资产列表

      • 可以在查看变更(View Changes)窗口中跟踪未保存的资产和Actor。文件可以通过这个列表轻松保存或保存至特定的变更列表。


    之前版本的重要变化

    • 源码管理用户体验

      • 针对源码管理做了大量改进 - 查看变更列表窗口可以帮助用户筛选、整理和管理变更列表以及大量外部Actor和资产文件。

      • 场景大纲视图中的源码管理列可以显示每个Actor出现时的状态(异步)。

      • 冲突的状态警告现在使用未保存项目按钮来显示。


    • 非受控CL

      • 可以在虚幻引擎中跟踪项目中的所有可写(非受控)文件,充分了解所有本地更改和添加新的源码管理交互。此外,还可以跟踪多个非受控变更列表中的本地编辑,这些变更列表可以在必要时单独变回受控状态(签出)或恢复先前状态。这样可以在日常使用中防止为测试或调试目的锁定资产,进一步减少文件争用。清楚了解这些文件在虚幻引擎中的状态,就可以单独管理这些文件,不需要在外部源码管理客户端中执行繁琐的清理和协调操作。

      • 在虚幻引擎5.1中默认激活

    • 未保存项目

      • 虚幻引擎会跟踪所有杂乱/未保存的文件(外部Actor、资产、世界等),这些文件可以通过主编辑器窗口底部栏中的“未保存项目”(Unsaved Items)按钮来显示。它可以让用户知道在世界分区上下文中有多少文件需要保存以及什么时候保存。

      • 该按钮是“选择保存文件对话”(Choose File to Save Dialog)的快捷键。

      • 必须显示脏文件的源码管理状态。所有源码管理冲突(已签出、非最新版本、已删除等)都会立即出现在未保存项目按钮中并显示吐司弹出警告。

    • 异步源码管理操作 & Perforce性能及可用性修复

      • 场景大纲视图、查看变更列表窗口等中的多项源码管理操作被移到异步模式,以防止阻塞编辑器。

      • Perforce修复了2个关于边缘服务器的重大问题(22.1.最新版本或更高版本)

        • 编辑和删除多个文件时产生重大性能问题。

        • 边缘与提交/代理文件状态不匹配。

    • Actor描述符

      • 可获取ActorDesc,用于在编辑器中构建不同的实用功能。

        • 可通过蓝图中和UWorldPartitionBlueprintLibrary实用功能库获取ActorDescs。

      • 目前ActorDescs包含:GUID、类、名称、标签、边界、运行时网格、是否空间加载、Actor仅限编辑器、Actor包、路径、数据层、HLOD层、

    Actor引用、标记、文件夹、父项Actor、内容包和自定义属性。

    • 许可用户可以扩展ActorDesc

      • AActor::GetActorDescProperties 和

    AActorComponent::GetActorDescProperties

    良好实践

    • 使用虚幻引擎的源码管理/查看变更列表功能

      • 我们强烈建议所有使用世界分区的用户使用虚幻引擎的源码管理集成签出内容,使用查看变更列表窗口编辑变更列表和提交所有数据。项目应强制用户在使用世界分区时使用虚幻引擎。

      • 为什么?

        • 世界分区中的外部Actor文件以GUID命名,在特定的文件夹结构中以此为基础进行自动排序,这也导致外部源码管理应用程序(例如P4V)无法将它们正确地识别出来。虚幻引擎的查看变更列表窗口会显示Actor的显示名称、类型和路径,帮助你更好地筛选、整理和管理这些文件。

        • 非受控CL是一个强大的工具,但目前在虚幻引擎之外无法使用。

        • 提交时(或用户请求时)会对变更列表的内容进行验证,以免出现数据问题。这项验证可以通过代码进行扩展,以满足特定项目的需求。

        • 为用户提供更好的使用体验,快速从CL导航到Actor或内容以进行视觉验证。


    • 使用非受控CL

      • 查看源码管理中断期间已编辑的和添加的可写文件。

      • 利用它在本地工作,处理被锁定的文件,将编辑的内容变为不受控状态,以允许其他人打开你的CL。

      • 清理工作区的本地ghost文件

      • 准备就绪后,将编辑和添加的内容从非受控CL移回源码管理CL。

      • 在调试或测试时,程序员应始终使用非受控CL,以免阻塞二进制内容文件。

    • 创建自定义提交验证

    • 提交验证已经实现,并且可以根据项目通过代码进行扩展,以便在制作过程中执行特定的验证。核心验证已在提交时完成,例如引用问题、CL中缺失文件等。

    • 使用GUID进行筛选并在场景大纲视图中显示包短名称列

      • 可使用外部Actor GUID并通过场景大纲视图的筛选功能来查找世界中相应的Actor。这对以文本方式在不同用户之间共享特定Actor,或从Perforce变更列表获取Actor来说非常有用。

      • Actor GUID还可以通过右键单击场景大纲视图或关卡中的任意Actor,选择“复制选中Actor文件路径”(Copy Selected Actor File Path)来获取。

      • 场景大纲视图中的包短名称(Package Short Name)列可用于根据GUID识别特定的Actor。

    误区

    • 用户对管理单独文件的第一反应

      • 对于OFPA,大多数虚幻引擎用户的第一反应是他们不想管理一个庞大的变更列表,担心自己工作区域会与其他同事产生冲突。但是熟悉OFPA之后,这些顾虑都被一一打消,其优点也受到广泛认可。

        • 消除文件冲突,实现并行工作

        • 易于识别、隔离、恢复或修复存在问题的变更。

        • 准确了解变更的内容,避免盲目保存和提交非预期的编辑/添加/删除。

      • 为了更好地帮助用户使用OFPA,我们在细节方面做了一些改进,例如场景大纲源码管理列、未保存项目和未保存列、源码管理冲突状态警告和保存对话框。

    • 使用P4V与外部Actor

      • 鉴于上述良好实践中列出的种种原因,我们应避免在生产过程中使用P4V来提交内容。

    • 分支、合并、复制和文件数量

    • OFPA可能会增加服务器、同步和创建分支时的负担,特别是在大型团队和大型密集世界中。为此,必须使用数据管理器进行监控。

    • 大型工作室、多用户团队应考虑使用代理和边缘服务器来分配工作量。


    局限性

    • GUID的美化仅限虚幻引擎

      • GUID只能被转换为它们在虚幻引擎中的显示名称。

      • GUID可以在场景大纲视图中筛选,在需要从Perforce或浏览器中识别特定文件时,这会非常有用。

    • Actor路径还可以从世界大纲视图复制到P4V中,用于寻找必要的文件。

    • 非OFPA与OFPA关卡实例的比较

    • 非OFPA关卡实例和OFPA关卡实例的流送行为有所不同。

      • 启用OFPA = 生成流送时(PIE和烘焙),关卡实例内容会被拆分到持久世界中,分配给对应的流送网格。运行时不存在关卡实例。

      • 非OFPA = 生成流送时关卡实例持续存在,并被视为一个Actor,加载包含关卡实例的网格单元关卡时,它将作为一个模块流入。这种情况下不支持HLOD。

    • 获取卸载的Actor

      • 由工具和数据驱动的实用功能会要求你获取ActorDescs,以便找到GUID并在与之交互前加载(如有需要)。只有在关卡编辑器中加载世界,才能获取Actor。

    • 锁定

      • 目前我们没有Actor锁定系统。大家对这个功能呼声很高,因为可以防止用户在未经许可的情况下编辑外部Actor,无需签出资产以防止编辑。

    • 文件状态的可发现性

    • 为了能够更快地反馈文件状态,我们在虚幻引擎5.1中做了大量改进,但仍然受源码管理性能和编辑器性能的限制。确认能否变更的最佳方法是:在场景大纲视图中启用源码管理列,监控源码管理冲突未保存的警告。

    • 删除提交验证

    • 删除被引用的资源和Actor时,虚幻引擎会发出警告。另一方面,强制删除或直接通过Perforce删除会绕过这项验证,导致引用丢失。要想避免这个问题,可以在收到警告时管理引用和使用虚幻引擎的源码管理集成。

    • 当前验证的内容不包括:删除被其他人的“Open for Add”引用的资产或Actor,以及提交引用“Open for Delete”或已删除文件的新Actor。这可能导致在移至最新版本时丢失引用。

    注意:我们计划针对后一问题添加相关验证,但目前,在并行处理相同Actor/关卡/资产引用时,若要执行删除操作,应格外小心。

    当前用例/应用场景

    • 《Fortnite》第四章和第五章

    • 一个大型世界,约含10万个外部Actor

    • 来自世界各地的多名用户同时使用一系列不同的提交、代理和边缘服务器。

    • 创建的多个分支拥有相同的内容和相同数量的文件(过场动画、下一个版本、下一赛季等)。

    • 《乐高Fortnite》

    • 由多个世界分区关卡叠加在一起形成多个图块。

    • Actor实例化的内部解决方案减少了外部Actor总数,并且基于Mass框架在全局范围内提升了流送效率/性能


    路线图和未来发展

    • 已删除引用提交验证

    • 锁定Actor系统

    • 一文件多Actor(减少文件管理负担/文件数量,尽可能避免文件争用)


    关卡实例和打包型关卡Actor

    实用链接

    官方文档:

    https://dev.epicgames.com/documentation/zh-cn/unreal-engine/level-instancing-in-unreal-engine 

    重要知识点

    关卡实例和打包型关卡Actor的定义、蓝图子Actor、在编辑器中加载、数据层实例、Actor筛选器/变体

    定义和差异

    关卡实例和打包型关卡Actor都属于“非破坏性”工作流程,允许在相同的世界中进行内容实例化,以实现不同的用途和目标。关卡实例和打包型关卡Actor都是不可覆盖的预制件,但支持通过Actor筛选器采用变体(虚幻引擎5.3新增功能)。

    关卡实例:

    一种基于关卡的工作流程,通过引用关卡实例Actor,作为预定义的Actor集合,实现关卡实例化,旨在简化世界构建体验。关卡实例可以在相关环境中编辑,无需退出它们所在的世界。关卡实例支持在子关卡中分层嵌套其他子关卡。

    在世界分区关卡中使用关卡实例时,必须启用OFPA,在生成流送时(PIE和烘焙),它会自动将内容拆分/嵌入持久世界流送网格关卡中。这一行为可以使用每个关卡实例Actor的关卡行为(Level Behavior)属性进行覆盖,并将被视为子世界分区(虚幻引擎5.4新增内容)。非OFPA关卡实例将被视为其自身流送关卡中的一个单独的模块,用在大型和复杂的数据结构中可能会导致性能和流送问题。

    关卡实例的特点:

    + 嵌套和分层关卡实例。

    + 在相关环境中编辑(始终为原始关卡,不支持逐个实例的数据/编辑)。

    + 一个世界中可存在多个实例。

    + 嵌入模式(默认):内容会被推送到持久世界分区网格。

    + 独立模式(以前的关卡流送模式):对于非OFPA关卡和虚幻引擎5.4中的OFPA关卡来说,将被视为一个模块或用于子世界分区。

    + 关卡实例Actor上的数据层会应用到其所有内容上。

    + 关卡实例中的Actor支持数据层,持久世界数据层实例定义状态。(虚幻引擎5.1新增功能)。

    + 是否仅限主世界:只有直接从持久世界加载才会加载。

    + Actor筛选器/变体支持(虚幻引擎5.4新增内容)。

    关卡实例的用例:

    + 兴趣点、房屋、室内环境、建筑楼层、装饰、村庄、独立的游戏玩法设置等。

    打包型关卡Actor:输出一个单一Actor蓝图,其中包含仅在与其关联的源关卡中的所有Actor上找到的视觉组件(静态网格体、实例化静态网格体、分层静态网格体),其他内容全部从输出中废除。该输出仅在编辑器中处理,并在创建时以及提交在相关环境中编辑的内容时触发。

    从虚幻引擎5.4开始,打包型关卡Actor的更新只影响实例化静态网格体组件,并允许覆盖和编辑脚本,以实现持久化。在虚幻引擎5.4之前,打包型关卡Actor蓝图不可覆盖、不可编辑脚本,每次更新都会重新创建。

    打包型关卡Actor的特点:

    + 输出一个打包型关卡Actor蓝图,内容仅包含静态网格体、实例化静态网格体、分层实例化静态网格体。

    + 输出一个与打包型关卡Actor关联的关卡,以实现非破坏性编辑。

    + 与其他Actor一样,同一个世界中可存在多个实例。

    + 在相关环境中编辑(始终为原始关卡,不支持逐个实例的数据/编辑)。

    + 数据层仅应用在打包型关卡Actor上。

    + 与其他Actor一样,可在关卡实例中使用。

    打包型关卡Actor的用例:

    + 将各个Actor的高密度静态视觉效果打包到一个带实例化静态网格组件的优化Actor中。

    例如:静态建筑(《黑客帝国:觉醒》演示项目)、室内装饰、建筑立面道具等,所有这些都表示非常密集的纯视觉设置,在同一区域中具有相同模型的多个实例,通常小于流送单元的大小。

    虚幻引擎5.4的重要变化

    • 编辑器路径

    在虚幻引擎5.4之前,我们不能引用关卡实例或嵌套关卡实例中的Actor。现在,我们可以从持久世界或父关卡实例引用关卡实例中的Actor。编辑器路径会在PIE模式和烘焙过程中的生成流送步骤自动解析,以支持对嵌入的Actor进行引用。对大多数用户来说,编辑器路径是透明的,并且在启用该功能时与编辑器中的引用选择器搭配使用。

    要启用这个功能,可以在.INI中将以下CVAR设为True:

    [SystemSettings] 

    EditorPaths.Enabled=1

    在编辑器代码中,编辑器路径可以使用FEditorPathHelper类来创建。通过不同版本的

    GetEditorPath(获取编辑器路径)/GetEditorPathFromEditorPathOwner(从编辑器路径所有者获取编辑器路径)/GetEditorPathFromReferencer(从引用者获取编辑器路径)

    • 每个关卡实例Actor的关卡行为属性

    每个关卡实例Actor中都有一个高级属性叫做关卡行为(Level Behavior),其选项包括嵌入(Embedded)模式和独立(Standalone)模式。

    嵌入模式:在PIE模式和烘焙其间的生成流送步骤,将关卡实例中包含的所有Actor嵌入父世界。

    独立模式:将关卡实例Actor及其所有Actor视为一个模块。可用于创建子世界分区,并且允许从其内部网格分区流送关卡实例内容。

    分区

    OFPA

    启用流送

    嵌入支持

    独立支持

    不适用

    不适用


    • 通过场景大纲视图编辑嵌套关卡实例

    为了改善用户在处理多个嵌套关卡实例时的体验,现在我们可以直接从场景大纲视图选择和编辑嵌套关卡实例。

    • 在场景大纲视图中显示关卡实例内容

    关卡实例中的Actor现在默认在场景大纲视图中显示,并且可以通过场景大纲视图中的选项隐藏。

    • Actor着色 - 关卡颜色

    Actor着色框架默认支持使用随机的独特颜色为每个关卡实例着色,以便识别Actor的来处。

    虚幻引擎5.3的重要变化

    • 世界分区Actor筛选器(变体)

    Actor筛选器可以让我们在世界分区关卡内,轻松实现每个关卡实例的自定义/采用不同变体。使用单一源关卡时,Actor筛选器非常适合用于为一个位置创建不同布局,增加世界的变化,

    它们由数据层实例和/或私有数据层组成,这些数据层专门设置用于支持Actor筛选,并可通过用户定义的开关来选择是否包含默认筛选器。

    与这些预设筛选器关联的所有Actor将在流送生成时被包含在内或排除在外,具体取决于每个关卡实例Actor中设置的默认筛选器、覆盖和激活状态。这些覆盖是静态的,筛选出的Actor会从PIE和游戏版本的烘焙过程中完全删除。要在游戏中动态应用分层,运行时数据层是一个很好的解决方案。

    启用编辑器偏好设置中世界分区Actor筛选器


    支持在关卡中使用Actor筛选器的私有数据层和数据层实例将自动填充在每个引用该关卡的关卡实例Actor上可见的可用筛选器。可在此处开关和应用覆盖。

    • 仅限主世界

    仅限主世界的关卡实例Actor将只有直接从持久世界加载时才会加载,以允许在模板中包含需要在游戏世界中废弃的子关卡实例Actor。(例如建筑模板中的基础光照关卡实例)

    以前版本的重要变化

    • 子Actor支持数据层

      • 由于添加了数据层资产和实例,分配给关卡实例中的子Actor的数据层现在也可以工作。如果子Actor数据层资产被其最终所在的主持久世界中的数据层实例引用,则该Actor将保留其数据分层功能,并依赖其所在世界中的数据层实例状态。

    • 关卡实例支持拖放操作

      • 你可以将一个关卡从内容浏览器拖到世界分区关卡中,它会自动创建一个关卡实例Actor,并引用你所选择的关卡。

    • 漏洞修复和用户体验改进


    良好实践

    • 创建仅限生产的地图,用于构建、编辑、预览或检查关卡实例和打包型关卡Actor。

      • 创建一个空的参考世界场景是一种不错的方法,其中包含游戏世界的光照效果、后期处理等等,除了更复杂的世界环境之外,美术师和设计师可以在其中构建关卡实例/打包型关卡Actor。

      • 虚幻引擎5.4添加了“是否仅限主世界”(IsMainWorldOnly)选项,被设为仅限主世界的基础公共世界数据子关卡实例可以添加到任何其他关卡实例中,并仅在单独加载后者时出现在编辑器中。这项设置也可以用在预制基础模板中,以便在创建新的关卡实例时启动生产(例如建筑物的关卡实例模板)。

    • 使用Actor筛选器创建变体

      • 使用Actor筛选器功能(虚幻引擎5.3新增功能)可以轻松构建拥有2种或更多不同配置的关卡实例,不需要复制整个关卡实例。这种方法适用于静态设置,比如光照、装饰、风格变化或贴花。启用Actor筛选器功能的关卡实例还可以用作预配置的蓝图类,并且全部引用相同源关卡。

    • 尽可能打包

      • 打包型关卡Actor可以使用实例化静态网格体重新组合单个Actor中的所有静态网格体的实例,从而减少每个单元的Actor数量。要注意的是,它们将作为单个Actor进行流送,在大多数情况下应符合流送单元的大小。

    误区

    • 使用关卡实例创建世界级图层

      • 就地编辑关卡实例会以非异步方式,将其作为一个模块加载到编辑器中。

    使用庞大/世界大小的关卡实例来嵌套所有位置或按照类型分层放置内容的做法,通常来说并不可取。在每个位置使用小型关卡实例,并在需要时使用仅限编辑器数据层(Editor-Only Datalayer)。

    • 使用非OFPA关卡实例

      • 在某些情况下可以采用这种做法,但使用非OFPA关卡实例会导致为每个非OFPA关卡实例所在世界中的每个实例创建单独的流送关卡。这会对流送和性能产生不利影响。

      • 目前世界中的非OFPA关卡实例不支持HLOD生成。

    • 使用大型打包型关卡Actor

      • 由于打包型关卡Actor只是包含多个实例化静态网格体、分层实例化静态网格体组件的Actor,创建超过流送单元大小的打包型关卡Actor可能会对流送、性能和内存产生不利影响。在大多数情况下,打包型关卡Actor的大小不应超过流送单元大小。


    局限性

    • 覆盖

      • 关卡实例引用一个源关卡。不能对一个关卡实例中的Actor及其属性进行覆盖。在相关环境中对任何实例的编辑或直接在源关卡中进行的编辑将应用于所有实例。

    • 在虚幻引擎5.3和之前的版本中,每次更新都会重新构建打包型关卡Actor,以防止覆盖。


    注意:

    • 从虚幻引擎5.3开始,Actor筛选器(Actor Filter)可用于覆盖每个关卡实例的内容,但其中包含的Actor的属性仍不支持覆盖。

    • 从虚幻引擎5.4开始,打包型关卡Actor将仅更新实例化静态网格体组,并永久保持蓝图和脚本上的覆盖。

    • 无关卡蓝图支持

      • 由于关卡实例在关卡流送时被拆分,因此在关卡实例上不支持关卡蓝图。

    • 不能引用关卡实例中的Actor

      • 不能从更高级别的另一个Actor上引用关卡实例中的子Actor。


    注意:虚幻引擎5.4推出的编辑器路径(Editor Paths)功能可提供相应支持。

    • 编辑器不支持部分和异步加载

    • 当前编辑器会从目标加载区域和关卡实例BV之间的交集中加载,并加载关卡实例中的所有内容。关卡实例不会以异步方式加载。


    注意:从虚幻引擎5.3开始,关卡实例默认在编辑器中部分加载,但编辑时始终将完全加载。

    • 打包型关卡Actor是单一Actor,在编辑器中加载时会将它们视作普通的独立Actor。

    • 只有在编辑模式中,才能访问子Actor并对其进行复制、编辑、查看、选择、隐藏。

      • 当前,只有在相关环境中编辑,才能对子Actor进行编辑、选择、复制、查看属性、更改编辑器可见性。

      • 例如,在主世界中编辑地形时,如果你想隐藏关卡实例的一部分,可能会受到限制。或者当你想从另一个关卡实例复制粘贴到正在编辑的关卡实例时,也可能会受到限制。

    注意:从虚幻引擎5.4开始,Actor的可见性可以在场景大纲视图中设置,不需要进入关卡实例编辑模式。未来我们还会针对这一限制进一步改进用户体验。

    当前用例/应用场景

    • 《Fortnite》第四章和第五章

      • 使用关卡实例构建的所有主要地点,可以调整每个建筑/房屋/兴趣点的粒度级别。

      • 关卡实例在大多数情况下都是单个关卡。

      • 未使用打包型关卡Actor,因为《Fortnite》的游戏玩法要求每件物品都是单独的Actor,以便进行破坏和互动。

    • 《乐高Fortnite》

      • 被用于洞穴、营地、建筑等兴趣点

      • 被用于保存PCG装配件内容,然后以程序化方式重新生成

    • 《黑客帝国:觉醒》演示项目/城市示例项目

      • 采用打包型关卡Actor手动创建非程序化生成的主要建筑。

      • 采用打包型关卡Actor创建预制屋顶装配件,然后通过程序化系统将它们分散到各处。

      • 所有程序化建筑、道路、屋顶网格体、道具都被压缩成由实例化静态网格体组件构成的Actor(相当于打包型关卡Actor)。

      • 碰撞的处理方式是在建筑底部加一个简单的形状,其余部分放在一个单独的Actor中,属于程序化生成的一部分。只有底层的每个模块有碰撞。

      • 在制作的最后,停止程序化生成,将打包型关卡Actor转换为实例化静态网格体Actor。这么做是为了能够在几何体工具中使用特殊的编辑模式,手动修复实例化静态网格体,单独访问实例。经过手动编辑后,无法在保留所有修复内容的情况下返回程序化更新  和原始打包型关卡Actor。

    • 《Ancient Game》 - 虚幻引擎5预览项目

      • 经扩展的打包型关卡Actor支持合并碰撞处理,以优化物理效果/增加流送关卡时的世界成本。


    路线图和未来发展

    • 支持覆盖每个关卡实例中的Actor的属性。

    • 支持在编辑器中进行异步加载。

    • 通过只读选择模式从编辑模式外部访问子Actor(复制/粘贴、属性和可见性)。

    • 支持自定义HLOD。

    • 用户体验改进(独特化/复制、上下文编辑导航、刷新打包型关卡Actor)。


    数据层

    实用链接

    官方文档:

    https://dev.epicgames.com/documentation/zh-cn/unreal-engine/world-partition---data-layers-in-unreal-engine 

    重要知识点

    数据层资产和实例、数据层运行时和编辑器类型、数据层状态(已卸载/已加载/已激活)和分层min逻辑、所有数据层之间的OR逻辑、蓝图、Sequencer、流送源、关卡实例、世界分区、内存管理和流送、HLOD

    定义

    数据层可以在运行和编辑时有条件地加载世界数据。Actor和世界分区会确定用哪种流送逻辑(是否空间加载、运行时网格和启用流送),而数据层会充当关卡流送的筛选器。

    每个外部Actor拥有它所在的数据层,这意味着在将Actor添加到世界中的数据层时,只需要签出Actor。另一方面,数据层实例被添加到WorldDataLayers Actor中,并需要在每个世界中添加/删除或编辑默认值。

    运行时

    + 处理不同情境。

    + 在相同世界中创建不同变体。

    + 管理用于序列、任务、游戏进程、事件等的特定数据。

    + 完全支持HLOD、创建特定的HLOD并将遵循数据层状态。

    + 还是编辑器数据层。

    + 每个数据层实例都有特定的设置,包括它们的初始运行时状态。

    运行时状态:

    卸载:内容从内存卸载,不可见。

    加载:内容加载到内存中,不可见。

    激活:内容加载到内存中,可见。

    编辑器:

    + 管理内容。

    + 隔离数据,以便更好地在相关环境中工作。

    + 预览运行时数据层内容。

    + 在PIE和烘焙版本中不能访问仅限编辑器的数据层。

    编辑器状态:

    是否初始可见(IsInitiallyVisible):加载世界时数据层是否应该默认可见。

    是否初次加载(IsInitiallyLoaded):加载世界时数据层是否应该默认加载。

    加载:用户启用/禁用加载。

    可见:用户启用/禁用可见性。

    虚幻引擎5.4的重要变化

    • 仅限客户端/服务器的数据层

      • 使用每个数据层中的加载筛选器(Load Filter)选项,定义数据层是否仅在客户端或服务器加载

    • 外部打包数据层实例

      • 通过将数据层实例外化成单独的文件,避免争用WorldDataLayers Actor。使用WorldDataLayers中的“使用外部打包数据层实例”(Use External Package Data Layer Instances)选项启用这个功能。

    • 运行时默认逻辑运算符

      • 通过在项目设置中将默认逻辑运算符设为“或”(OR)或“和”(AND),公开创建新的关卡时应该使用的默认逻辑运算符。

    • 也可在世界场景设置中覆盖。


    • 编辑器数据层不受数据层运算符的影响。它们的行为可以通过自定义DataLayerLoadingPolicyClass进行自定义,并在DefaultEngine.ini中设置:

    [/Script/Engine.DataLayerManager] DataLayerLoadingPolicyClass=<YourDataLayerLoadingPolicy>

    • Actor着色 - 当前数据层颜色

    • Actor着色框架默认支持当前数据层颜色(Current Data Layer Color)模式,并根据指定的数据层调试颜色为场景中的Actor着色。如果一个Actor被分配给多个当前数据层,则将使用白色。

    虚幻引擎5.3的重要变化

    • 私有数据层

      • 仅限编辑器的数据层为私有数据层,包含在创建该等数据层的关卡中。适用于关卡实例Actor筛选器变体系统或特定世界的仅限编辑器内容分层。

    之前版本的重要变化


    • 数据层作为资产和实例

      • 随着虚幻引擎5.1的发布,数据层已成为独立的内容资产,在每个世界的WorldDataLayers Actor中的数据层实例中被引用。在以前的版本中,每个世界中的数据层都独一无二,嵌在每个世界分区关卡中的WorldDataLayers Actor中。

    • 数据层资产定义类型(编辑器或运行时)和调试颜色。

    • 数据层实例拥有对资产的引用,设置每个世界的默认编辑器/运行时状态。

    • 允许:

      • 在一个项目中的多个世界中共享相同的数据层资产。

      • 关卡实例中的Actor支持数据层。

      • 每个世界设置不同的默认状态。


    • 关卡实例支持

      • 正如上面说的,随着数据层资产和实例的引入,关卡实例中包含数据层资产的Actor现在 可以在主世界拥有相同资产的数据层实例时正常工作,并会相应地应用它们的状态。

      • 在编辑模式中,你可以预览和将关卡实例特定数据层提升到主世界,以便在当前世界中为它们提供完整的支持。


    • Actor编辑器上下文支持

    • 在关卡编辑器中添加了Actor编辑器上下文功能。你可以将世界中任意数量的数据层实例标记为“当前”。添加启用编辑器上下文功能的Actor时,会自动接收被设为“当前”的数据层。


    良好实践

    • 使用仅限编辑器的数据层来分隔内容

    • 使用编辑器数据层可以轻松隔离用于过场动画和特定游戏序列等的工作集内容。

    • 可以隔离自动生成/程序化生成的数据或特定类型,比如建筑、道路、森林等。

    • 预加载和Sequencer

    • 使用Sequencer数据层轨道可以预加载和设置不同状态,以便在游戏中播放开始时,让数据层做好准备并加载所有内容。

    • 如上所述,这有利于更好地为序列中的流送内容管理可拥有的Actor,还可以与运行时数据层结合使用。

    • 数据层所有者和整个项目范围内的数据层

      • 最好安排一名技术负责人负责创建整个项目范围内的数据层和结构。

      • 如有可能,生产时应预先定义匹配其项目结构和目标的数据层资产。

        • 例如任务、事件、游戏进程、工作类型等等。

      • 优化

      • 在某些特定情况下,数据层可以用于减少特定序列或玩法中的内容,这些序列或玩法可能不需要一部分世界。

      • 同样,数据层还可以用于减少面向特定平台的内容,以节省内存,优化性能。


      误区

      • 对数据层和流送的误解

      • 对于分配给Actor的指定数据层来说,Actor的“是否空间加载”、“运行时网格”设置仍然是定义它们将处于哪个流送关卡的基础。在数据层上设置激活状态可以有效地加载和激活最顶层的关卡(非空间加载的Actor),以及基于它们各自的网格加载范围重叠流送源的流送关卡。

        • 激活数据层并不意味着数据层中的所有内容都会立刻加载,我们仍然要考虑流送方面的问题,Actor/网格/加载范围/流送源需要正确设置。


      • 使用数据层加载太多内容

      • 我们可以使用数据层流送一整个新的环境,但是产生的开销相当于加载一个新的关卡。如果事先预留了加载这些内容的时间,并且包含在关卡的概念中,比如在首次加载时预加载资产,使用过场动画或影片隐藏过渡的过程,或者发生在性能开销较小的区域,那就是完全可行的办法。要注意的是这仍需要流送。


      局限性

      • OR逻辑

      • 在运行时和编辑器中,数据层的逻辑运算方法是“OR”。

        • 一旦加载或激活Actor的某个数据层,就会加载Actor。


      注意:虚幻引擎5.4为每个项目和关卡提供了一个新的数据层逻辑运算符选项,即“AND”。

      • 分层和最简逻辑

      • 在数据层的层级结构中,利用父数据层状态应用最简单的逻辑,其状态包括已卸载(0)、已加载(1)和已激活(2)。

      • 仅限编辑器数据层不能被设为运行时数据层的子项,反之可以。


      • WorldDataLayers Actor(世界数据层Actor)

      • 数据层实例被添加到WorldDataLayers Actor中,并需要在每个世界中添加/删除或编辑默认值。WorldDataLayers Actor是一个外部Actor文件,通常用于操控世界中的哪个数据层实例可能导致该特定文件被争用或发生冲突。


      注意:从虚幻引擎5.4开始,这一限制可以通过“启用外部打包数据层实例”消除。

      当前用例/应用场景

      • 《Fortnite》第五章

      • 50+个运行时数据层,用于呈现活动/赛季的变化

        • 用于过场动画制作流程,在每个镜头中应用世界变化。

        • 用于测试世界,以应用不同的配置并进行测试


      • 《Fortnite》第四章

      • 4个运行时数据层,专门用于覆盖世界一小部分区域的大厅/新手岛屿。

      • 每次活动/赛季变化1个运行时数据层

        • 用于过场动画制作流程,在每个镜头中应用世界变化。

        • 用于测试世界,应用不同的配置并进行测试


      • 《黑客帝国:觉醒》演示项目

      • 35个运行时数据层。

      • 32个编辑器数据层:

        • 序列和游戏内容的流送与卸载。

        • 序列的特定优化(例如高速公路下方)。

        • 全平台优化(尽在无人机模式下激活的屋顶)。

        • 多个仅限编辑器的美术师工作集和程序化内容。


      • Ancient Game

        • 2个运行时数据层(其中一个可以将整个世界变成一个新的黑暗世界)。

        • 1个编辑器数据层。


      路线图和未来发展

      • 用于插件的外部数据层,以便将DLC/未来内容添加到现有世界中


      实用命令

      • wp.DumpDatalayers:将数据层列表及其运行时状态转储到日志中。

      • wp.Runtime.DebugFilerByDatalayer:用于筛选在运行时哈希2D调试显示中可见的数据层。

      • wp.Runtime.SetDataLayerRuntimeState [state] [layer]:强制将数据层设为特定运行时状态。

      • wp.Runtime.ToggleDataLayerActivation [layer]:激活/停用特定运行时数据层。

      • wp.Runtime.ToggleDrawDataLayers:在主视图中显示数据层列表及其状态。


      HLOD - 分层细节级别(世界分区)

      实用链接

      官方文档:

      https://dev.epicgames.com/documentation/zh-cn/unreal-engine/world-partition---hierarchical-level-of-detail-in-unreal-engine 

      重要知识点

      分层设置、世界分区和网格、流送、实例化、Nanite、地形和水体

      定义

      分层细节级别(HLOD)是一组Actor的视觉表示,用于替换在远处显示的Actor。通常为单个网格体或材质,由原始Actor几何体创建,但是经过简化,可以降低内存占用率。在大多数情况下,使用HLOD替换多个Actor可以将多个绘制调用减少为一个,从而提高性能。

      世界分区HLOD与虚幻引擎4.x系列中的传统HLOD有所不同,它们与关卡无关。世界分区HLOD从世界分区网格生成,不需要管理Actor集群。

      虚幻引擎5.4的重要变化

      • 编辑器内HLOD

        • 在编辑器视口显示HLOD,无先前加载的区域

          • 与合并层和简化层一起工作

          • 通过选择、右键单击、加载所选区域,轻松加载重叠HLOD的区域

          • 用户可设置是否显示、在加载的区域上显示和设置最小和最大绘制距离。

          • 单独重新构建每个部分,也可以用于测试变更,或者在本地更新特定部分,以便合成或调试。


      在关卡编辑器视口显示HLOD选项菜单

      仅加载HLOD的《Fortnite》第四章世界

      • 使用运行时哈希时在每个分区对象中定义HLOD设置

        • 新的运行时哈希解决方案为每个分区对象提供了一个HLOD设置可配置数组,可以更轻松地将流送网格的Actor映射到HLOD层

        • 让许可用户能够轻松创建自己的分区,同时提供HLOD支持。


      • 新增了多项针对地形的HLOD设置

        • 可以更好地控制HLOD网格体复杂性及其纹理大小

        • 可以控制在计算地形HLOD时使用的LOD级别

        • 可以在项目设置中为地形HLOD纹理设置项目允许的最大纹理大小(默认为1024)

      • Actor着色 - HLOD相关颜色

      • Actor着色框架默认支持HLOD相关颜色(HLOD Relevant Color)模式,关卡中被设为包含在HLOD中的Actor将呈现绿色,否则将呈现红色。

      之前版本的重要变化

      • 水体HLOD

        • 增加了对水体Actor的HLOD支持。

          • 自动为水体创建HLOD网格体。

          • 设置在水体Actor中使用的材质和层。


      良好实践

      • 预定义HLOD层类型、流送和层级结构

        • 在世界的概念设计和前期制作阶段,定义HLOD流送、层级结构和类型,在考虑多种因素的情况下争取以最优成本呈现出最佳视觉质量。

          • 应考虑的因素:平台内存和性能、实例化、Nanite流送、世界密度、世界规模、网格大小、资产类型(树木、建筑或其他资产)等等。


      • 考虑运行时/游戏中的距离

        • 使用合并或简化的网格体类型时,近距离的HLOD效果可能非常差。它们是专为远距离显示的内容而设计的,应该按远距离来评估质量和性能。

        • 基于Nanite的特性,启用Nanite的实例层提供的效果与加载的资产几乎一致,对支持Nanite的平台来说是一个非常强大的解决方案。


      • HLOD层

        • 世界中可以存在多个HLOD层,用于不同类型的资产,例如使用简化网格体的建筑和实例化的植被,并在空间上与它们各自的单元大小和范围重叠。

        • 使用多个HLOD层


      • 频繁更新

        • 在大多数工作流程中,HLOD并不重要,但在进行美术构图或测试游戏时,过时的HLOD可能会产生问题。HLOD需要频繁生成,对于在编辑器中支持HLOD来说,这一点尤为重要。


      • 逐个版本跟踪HLOD统计数据

        • 运行wp.Editor.HLOD.DumpStats会在“Project”\Saved\Logs\WorldPartition中创建一个HLODStats-xxxxxx.csv文件,其中包含针对每个HLOD的信息,例如纹理大小、三角形和顶点数量、磁盘大小(HLOD Actor打包文件的大小,非烘焙版本,通常更节省空间)。


      误区

      • 将所有Actor保存在HLOD中

        • 使用HLOD的首要目标是为了减少Actor的数量,提升性能,保证远距离内容的质量。性能和质量的平衡至关重要。

        • 小型Actor、室内装饰、地下和所有不重要的资产都不应该添加到HLOD中。

        • (虚幻引擎5.4新增功能)在编辑器中使用HLOD和Actor着色 - 使用HLOD相关颜色模式快速锁定应从HLOD中移除的Actor的位置。


      • 过场动画和远景放大镜头

        • 根据不同条件,使用长焦镜头近距离观察简化的HLOD可能会导致视觉效果很差。

        • 启用Nanite的实例层有助于改善这些问题,但在某些情况下,必须使用不同的解决方法,例如在牺牲内存空间和流送质量的情况下,利用次级流送源为特定镜头预加载背景区域。

        • 如有可能,还可以采用其他方法,比如调大光圈,减小景深,虚化背景。


      局限性

      • 生成大型简化和合并的HLOD

        • 生成实例化HLOD的速度非常快,即便是像《黑客帝国:觉醒》这样的复杂世界,速度依然很快,但是生成简化或合并的网格体HLOD可能需要大量时间,占用大量内存,还需要构建机器,在夜间构建和自动化。

      • 编辑器中的可见性受限

        • 要在编辑器中预览HLOD,用户必须使用PIE模式。在PIE会话中,HLOD Actor还会在场景大纲视图中显示,并且可以被固定(Pinned),确保在结束PIE会话后仍然保持加载状态。

      注意:这是使用旧版引擎时的一种替代方法,因为编辑器内HLOD(HLODs in Editor)是虚幻引擎5.4新增的功能。

      • 地形HLOD

        • 地形代理的HLOD是本系统特有的,目前不能使用为其他Actor设置的相同HLOD设置。

      注意:虚幻引擎5.4新增了很多选项,可以帮助用户更好地控制特定于地形代理的HLOD生成。

      • 目前不支持自定义HLOD

        • 当前系统不支持自定义HLOD,但我们正在开发相关支持。


      当前用例/应用场景

      • 《Fortnite》第五章

        • 建筑的HLOD(2层)

          • HLOD0特殊合并网格体,支持破坏,单元大小为256m,加载范围为512m,空间加载。

          • HLOD1简化网格体,单元大小为512m,加载范围为2048m,空间加载。

        • 树木的HLOD(1层,非空间加载)

          • 树木替代物的实例化层,始终加载。

        • 持久世界中的HLOD(非空间加载)

          • 悬崖、特殊合并网格体箱子和大型雕像

        • 在从巴士降落期间,《Fortnite》采用了不同的方式来处理流送,目的是防止在接触地面前流送太多内容。

        • 每个平台的加载范围可能有所不同。HLOD内容在所有平台上共享,但会根据加载变化在不同的范围内显示,以实现优化目的。

      • 《Fortnite》第四章

        • 建筑的HLOD(2层)

          • HLOD0 特殊《Fortnite》特定合并网格体,支持破坏(客户端和服务器),单元大小为256m,加载范围为512m,空间加载。

          • HLOD1简化网格体,单元大小为512m,加载范围为2048m,空间加载。

        • 树木的HLOD(1层)

          • 树木替代物的实例化层,始终加载。

        • 在从巴士降落期间,《Fortnite》采用了不同的方式来处理流送,目的是防止在接触地面前流送太多内容。

        • 每个平台的加载范围可能有所不同。HLOD内容在所有平台上共享,但会根据加载变化在不同的范围内显示,以实现优化目的。

        • HLOD0和1的构建需要1小时30分钟。


      • 《黑客帝国:觉醒》演示项目

        • HLOD设置(2层)

          • HLOD0启用Nanite的实例化层,单元大小为256m,加载范围为768m,空间加载。

          • HLOD1简化网格体,单元大小为256m,始终加载。

        • 简化网格体处理需要10台机器(g4ad.16x大型实例,参见Amazon EC2 G4实例——Amazon网络服务(AWS))。最坏的情况下需要5小时。

        • 在一台机器上处理实例化层使用的时间不到10分钟。


      路线图和未来发展

      • 为Actor和关卡实例提供自定义HLOD支持

      • 改进简化和全局HLOD的生成性能(将在虚幻引擎5.5中完成此项改进)

      • 在完全卸载时为子世界分区提供HLOD支持


      编辑器和用户体验

      重要知识点

      世界分区、OFPA、数据层、HLOD、加载、源码管理、虚幻引擎

      Actor着色框架

      我们为虚幻引擎5.4开发了新的Actor着色框架。它允许基于提供的模式,在关卡编辑器视口突出显示Actor,还可以轻松扩展,根据每个项目的需求添加自定义模式。

      下列CVAR可以用于在运行时激活游戏中的Actor着色系统:

      show actorcoloration <handlername>

      Actor着色系统可以通过关卡编辑器视口中的视图模式(View Mode)按钮启用,并包含以下选项:

      • 关卡颜色

      • 属性颜色(Ctrl键+点击细节面板中的任意Actor属性可以突出显示属性值相同的Actor!)

      • 影响寻路网格体

      • HLOD相关颜色

      • 当前数据层颜色




      世界分区编辑器

      世界分区编辑器可用于加载相应的区域/位置,以便用户在编辑器中工作。

      虚幻引擎5.4的新增内容:

      • 用户体验改进和标准化

      • 更多显示选项


      虚幻引擎5.1的新增内容:

      • 完全删除编辑器网格,取而代之的是临时区域和持久位置Actor。

      • 新增加载、缩放、从此处开始播放、测量、从区域创建位置体积的快捷方式。

        • Shift键+拖动可以将所选对象与当前网格大小对齐。

        • 双击鼠标可以在所有视口中将摄像机移到点击的位置。

        • Shift键+双击可以在点击的位置启动PIE。

        • Ctrl键+双击可以加载点击位置周围的区域。

        • 鼠标中键+拖动可以显示一个测量工具,与俯视图中的测量工具类似。

        • 勾选“在PIE中跟随玩家(Follow Player in PIE)”可以在小地图中跟随该玩家。

      • 用户体验有所改进,例如当用户首次加载世界分区时,不会加载任何区域。


      Actor编辑器上下文

      Actor编辑器上下文是虚幻引擎5.1的新增功能,基于传统的关卡工作流程,通过定义“当前”关卡进行工作。在世界分区中,Actor编辑器上下文支持场景大纲视图文件夹、数据层和关卡实例,只需要点击鼠标右键并将支持的任意输入“设为当前”。



      固定Actor

      在世界分区关卡中,场景大纲视图默认启用固定列。它允许用户在不通过世界分区编辑器加载的情况下,在编辑器中选择性加载Actor。

      处于未保存状态的Actor会自动固定。即使卸载一块区域或者在加载区域之外创建,这些Actor仍会加载并保持可见。

      固定行为受数据层的影响。这意味着,要在编辑器中加载和显示被固定的Actor,至少需要加载分配给Actor的一个数据层。

      注意:若启用在编辑器中显示HLOD的功能(虚幻引擎5.4新增功能),HLOD将根据这些设置显示,无论该HLOD是否固定。

      书签和位置

      书签是我们计划引入的一项新功能,旨在帮助用户在使用世界分区功能的大型开放世界中导航。虚幻引擎5.1推出的位置体积是我们实现这项设计的第一步,它有点类似于谷歌地图。

      位置是3D区域,当前仅限于顶部盒体形状,用于识别世界中的不同区域。

      HLOD生成

      HLOD生成可以从编辑器菜单触发,它回启动一个单独的进程,使用commandlet构建器为编辑器中加载的世界重建特定层的所有HLOD。

      从虚幻引擎5.4开始,现有的HLOD可以单独刷新,或者通过细节面板中的构建HLOD(Build HLOD)按钮,批量刷新选中的多个HLOD Actor。

      世界分区编辑器小地图生成

      与HLOD生成一样,可以从编辑器中生成世界分区编辑器小地图。

      Commandlet

      世分区构建器

      许可用户人可以扩展世界分区构建器(WorldPartition Builder)框架,离线构建或在编辑器进程中构建世界分区,包括通过区域重复加载整个世界和通过垃圾回收管理Actor内存的各种工具。

      https://dev.epicgames.com/documentation/zh-cn/unreal-engine/world-partition-in-unreal-engine#worldpartitionbuildercommandlets 

      路线图和未来发展

      • 书签系统

      • 热图和调试工具


      除世界分区以外的数据流送系统

      重要知识点

      世界分区、HLOD、流送、Nanite、纹理、音频、平台和可延展性、虚幻引擎

      Nanite流送

      官方Nanite文档:

      https://dev.epicgames.com/documentation/zh-cn/unreal-engine/nanite-virtualized-geometry-in-unreal-engine 

      纹理流送

      官方纹理文档:

      https://dev.epicgames.com/documentation/zh-cn/unreal-engine/texture-streaming-in-unreal-engine 

      音频流送

      官方音频文档:

      https://dev.epicgames.com/documentation/zh-cn/unreal-engine/audio-memory-management-in-unreal-engine 

      生产管线和工作流程

      经批准的生产版本

      我们强烈建议大家在大型生产中每天发布一个经过QA测试的稳定生产版本。这么做是为了防止编辑器因为新增的功能和代码发生重大故障,进而导致生产中断。稳定是保持动力和避免失败的关键。

      在某些情况下,当文件版本发生变化,或者当变更的内容与新代码不兼容,对内容和功能/游戏玩法/稳定性产生影响时,可能需要使用强制版本。

      预算

      每个生产阶段都需要制定预算,包括在一开始进行预估,还要在设计出现变化和实际内容生产之后重新评估。

      应考虑内存、性能和磁盘大小预算。还应考虑所有平台的可延展性。使用不同的功能,例如Nanite和纹理流送可以大幅减轻预算压力,但也要充分考虑不具备这些功能的平台,针对这些平台的磁盘空间评估和回退(具体取决于项目目标)。

      验证

      使用错误检查表是查找内容错误的好方法,以免这些错误破坏内容、游戏玩法、烘焙过程等等。每位内容创作者都应该关注这一问题。

      “源码管理-查看变更列表”提交过程中添加了提交验证,可以在提交(或请求)特定变更列表中发现的内容时进行验证。提交验证可以通过代码扩展,从而满足项目的特定需求。基础验证是虚幻引擎的标配功能,例如引用CL外的文件、未保存的内容等等。

      近期焦点

      虚幻引擎5.4现已发布
      GDC 2024:来自State of Unreal的重大新闻
      欢迎来到全新的虚幻引擎网站
      我们将在四月下旬更新虚幻引擎、Twinmotion和RealityCapture的定价
      祝贺《War is Over》 荣膺第96届奥斯卡最佳动画短片奖
      透过MEGA聊虚幻- 理想汽车设计团队专访
      UE动画导入标准流程

      扫描下方二维码,关注后点击菜单栏按钮“更多内容”并选择“联系我们”获得更多虚幻引擎的授权合作方式和技术支持
      长按屏幕选择“识别二维码”关注虚幻引擎
      “虚幻引擎”微信公众账号是Epic Games旗下Unreal Engine的中文官方微信频道,在这里我们与大家一起分享关于虚幻引擎的开发经验与最新活动。




      虚幻引擎
      Epic Games 旗下 Unreal Engine 虚幻引擎官方订阅号
       最新文章