unreal在运行时加载内容/资产的各个方面
本文档旨在概述在运行时加载内容/资产的各个方面。它特别关注熟化内容和原生虚幻资产。这不包括如何通过 datasmith 运行时功能导入其他类型的资产,例如 USD 场景或 CAD 数据。
加载 Pak 文件
自动加载
引擎将在启动时从以下位置挂载可用的 pak 文件:
[*]/内容/包/
[*]引擎/内容/包/
[*]已保存/内容/Paks/
通过常规打包过程创建的 Pak 文件将包含一个名为 AssetResgistry.bin 的清单文件,该文件会将 pak 文件中的资产通知 AssetRegistry,从而无需手动扫描内容。
手动加载
Pak 文件可以在运行时通过 C++ API 按需加载。
有两种选择:
[*]广播FCoreDelegates::MountPak委托
这是一个高级 API,不需要指向 FPlatformFilePak 实现的指针。相反,实现会监听该委托的广播并启动挂载调用作为响应。
[*]直接调用FPlatformFilePak.Mount。
这是用于启动 pak 安装的直接 pak 文件 PlatformFile API。
控制台命令
注意:控制台命令在发布版本中不可用。
请参阅IPlatformFilePak.cpp 中的 FPakExec以了解实现。
[*]山 []
[*]挂载一个 pak 文件,可选择将挂载点作为第二个参数
[*]卸载
卸载 pak 文件。
[*]PakList
列出当前挂载的 pak 文件。
文件优先级
包在内部存储在一个列表中,该列表根据优先级排序,优先级首先由 pak 文件的优先级值确定,然后是挂载顺序(较新的优先)。文件请求将从 pak 中返回具有最高排序顺序的匹配文件。
根据 pak 文件的位置和名称,可以将其他优先级应用于 pak 文件。例如,指定为补丁的 Pak 文件在启动时加载时的优先级将增加 1000。这确保了修补文件接收更高的排序顺序,实际上覆盖了来自其他 pak 的相同文件。补丁包可以通过文件名中的“_P”后缀来识别。
除了基于 pak 文件位置和名称给出的隐式优先级之外,手动安装请求还接受一个优先级参数。请参阅FPakPlatformFile::GetPakOrderFromPakFilePath和FPakPlatformFile::Mount。
Pak 文件中的挂载点:
存储在 pak 文件中的所有文件都使用相对于正在执行的应用程序的二进制文件的路径。这意味着此级别尚不存在虚拟路径(如 /Game/)。
每个 pak 文件都有一个挂载点,它指定它包含的所有文件最初存储在哪里,例如在项目的内容文件夹中。
可以将其视为将 pak 文件中的文件提取到打包的游戏文件夹中的特定目录中。
挂载点也会显示在日志中,相关消息如下所示:
LogShaderLibrary: Display: ShaderCodeLibraryPakFileMountedCallback: PakFile '../../../UE_4_27/Content/Paks/pakchunk0-WindowsNoEditor.pak' (chunk index 0, root '../../../') mounted
LogShaderLibrary: Display: ShaderCodeLibraryPakFileMountedCallback: pending pak file info (ChunkID:0 Root:../../../ File:../../../UE_4_27/Content/Paks/pakchunk0-WindowsNoEditor.pak)这是来自 pak 文件的示例(输出来自 UnrealPak.exe -List):
LogPakFile: Display: Mount point ../../../
...
LogPakFile: Display: "Engine/Plugins/Tests/EditorTests/EditorTests.uplugin" offset: 28508892, size: 496 bytes, sha1: 87D598071C6B751B93866E831E91ECE50798A088, compression: None.
LogPakFile: Display: "Engine/Plugins/Tests/ScreenshotTools/ScreenshotTools.uplugin" offset: 28509441, size: 504 bytes, sha1: 55CDCB06BED437F1EB2A2554A841997D24B5FC25, compression: None.
LogPakFile: Display: "Engine/Plugins/VirtualProduction/Takes/Takes.uplugin" offset: 28510208, size: 1195 bytes, sha1: 713B557C2204E111153B9BFC917CAEC24BAA18B0, compression: None.
LogPakFile: Display: "UE_4_27/AssetRegistry.bin" offset: 28512256, size: 25530 bytes, sha1: 56E89C57180C4E02FB569451408B6705871F1C90, compression: Zlib.
LogPakFile: Display: "UE_4_27/Config/DefaultEngine.ini" offset: 28537859, size: 304 bytes, sha1: 39E94404601CF415DFEAC8F47CC87AEE4C3C7898, compression: None.
LogPakFile: Display: "UE_4_27/Config/DefaultGame.ini" offset: 28538880, size: 1170 bytes, sha1: B3708C02A48FEE414C5360A624D217D51FDCFF88, compression: None.
LogPakFile: Display: "UE_4_27/Content/BPTestLevel.uexp" offset: 28540928, size: 242419 bytes, sha1: 8C13800A24A77B7B7169812C45FEEB8D50333E6F, compression: Oodle.
LogPakFile: Display: "UE_4_27/Content/BPTestLevel.umap" offset: 28784640, size: 3684 bytes, sha1: 62996C8E4FD44390D36181C3859D089F91B5748B, compression: Oodle.该文件包含引擎内容、游戏内容、配置文件、引擎插件文件等,每一个都映射到打包应用程序的文件结构中。然后使用 Unreal 文件系统中的挂载点将这些文件夹分类为游戏内引用,例如 /Game/...
UFS(虚幻文件系统)中的挂载点/根路径:
虚幻引擎对任何资产或对象引用使用虚拟文件系统,称为虚幻文件系统。资产引用不指定磁盘上的绝对路径,而是引用根路径,其作用类似于某些资产所属的虚拟文件夹。
挂载点从磁盘上的某个路径映射到用于访问游戏中所有资产和引用的虚拟路径。
用于创建挂载点的路径总是相对于实际的游戏可执行文件,它通常位于“/Binaries//”(对于打包的项目)。
所以挂载点“…/…/…/”通常应该是你项目的文件夹。
用户应该知道,这些假设是打包项目的文件夹结构,因此项目内容将在 /Content/ 而不是 Content/ 中。
引擎将设置几个默认挂载点:
[*]/Game/ 映射到项目的内容文件夹(…/…/…//Content/)
[*]/Engine/ 映射到引擎的内容文件夹(…/…/…/Engine/Content/)
一些临时/只读的:
[*]/脚本/类
[*]/温度/
[*]/配置/
每个插件一个安装路径:
[*]/PluginName/ 每个插件内容文件夹,例如 Plugins/PluginName/Content/
插件加载行为:
在引擎启动时,FPluginManager 将尝试发现并加载所有启用的插件。
这是通过搜索任何可用的“.upluginmanifest”文件来完成的,并且(如果没有找到)手动搜索“.uplugin”文件。
加载插件时,它的内容目录将添加为根路径 /PluginName/。
注意:插件内容包可能包含一个序列化的 AssetRegistry,但只有在游戏启动时加载插件时才会使用它。当插件的 pak 文件在运行时下载并挂载时,它将不起作用,在这种情况下,必须由开发人员手动添加新插件的根路径。
DLC
构建 DLC 时,常规工作流程是打包游戏的命名/版本化版本(例如“1.0”),然后稍后将其他插件添加到项目中。新插件可以打包为 DLC 插件,并添加到已打包的游戏中以供用户使用。
如果引擎发现插件是 DLC 插件,它应该遵循常规插件安装逻辑,而当您仅从代码中安装 pak 文件时,您可能需要手动指定安装点。
注意:在 PC 上,构建 DLC 时可能需要额外的 package 命令标志,以便引擎正确识别:“-DLCPakPluginFile”。
此标志将在 pak 文件中包含一个名为 PluginName.upluginmanifest 的文件,并允许引擎检测 DLC Pak 文件包含属于以前未知插件的内容。与 AssetRegistry.bin 一样,这将要求 pak 文件在引擎启动时可用。
AssetRegistry 行为:
AssetRegistry 只知道烹饪时存在的资产。它在启动期间从存储在 pak 文件中的 AssetRegistry (AssetRegistry.bin) 的序列化版本加载此缓存信息。
Unreal 将在启动期间加载许多 AssetRegistry.bin 文件,例如每个插件的 AssetRegistry 会在启动时加载(如果存在)。
此外,AssetRegistry 侦听FPackageName::OnContentPathMounted委托,因此当挂载新的挂载点时,Asset Registry 将开始异步搜索新目录中的任何资产并将它们添加到内部数据库中。
这将是异步的,资产可能不会立即可用。
IAssetRegistry::ScanPathsSynchronous可用于强制立即更新资产缓存并通过资产注册表在同一帧中使新资产可用。
在运行时加载外部资产的限制
Unreal 中的低级文件 API (IPlatformFile) 存在限制,这些限制会阻止从打包的游戏中加载松散的 .uasset/.umap 和其他 Unreal 资产文件。
FPlatformFilePak:
这是打包游戏中使用的默认文件系统访问器。默认情况下,它将从已安装的 pak 文件中加载任何文件,如果找不到文件,则会回退到常规文件系统访问。对于访问任何 pak 文件之外的文件,还有额外的安全检查。
FPakPlatformFile::ExcludedNonPakExtensions 指定 pak 文件之外的禁止文件名列表。如果用户从源代码编译引擎,这可以通过将预处理器定义 EXCLUDE_NONPAK_UE_EXTENSIONS 设置为 0 来覆盖。
这可以在游戏的 *.Target.cs 文件中完成,如下所示:
GlobalDefinitions.Add(“EXCLUDE_NONPAK_UE_EXTENSIONS=0”);
使用 pak 文件时 4.27 中的默认禁止文件扩展名:
[*]资产
[*]地图
[*]大容量
[*]uexp
[*]上一页
[*]ushader字节码
FSandboxPlatform文件:
这将在启动带有熟化内容但没有 pak 文件的游戏时使用。这通常发生在从 Visual Studio 启动非编辑器构建而没有先打包游戏并且需要可用的熟化内容(windows 的熟化内容必须至少执行一次)时。烹饪内容的默认文件夹是 Saved/Cooked/WindowsNoEditor。
沙盒模式需要“-sandbox=”参数以及烹饪内容的完整路径,并且仅适用于桌面平台上的客户端和游戏构建。
4.27 中默认禁止的文件扩展名,以熟内容开始但没有 .pak 文件(沙盒模式):
[*]资产
[*]地图
在运行时加载其他游戏内容的推荐解决方案是使用上述 pak 文件。
现有的动态内容加载解决方案
引擎中有多个实现已经提供了在运行时获取和加载内容包的逻辑。详细介绍它们超出了本文档的范围,但在此提及它们以供参考,如果可能,应优先于完整的自定义解决方案。
ChunkDownloader提供了一种解决方案,通过使用内置的分块系统创建单个内容 pak 文件,并集成了从服务器下载可用 pak 文件列表、下载这些文件的用户定义子集并按需安装它们的逻辑。
它可以作为构建自定义逻辑的一个很好的示例,也可以按原样用于许多更简单的用例。
重要提示:
Unreal虚幻引擎电脑配置的要求是比较高,特别是实时渲染,前期的硬件成本是比较高,这里有一个简单的节省硬件成本的方法,使用赞奇超高清云工作站,即使本地普通的电脑也能运行UE5软件,且普通电脑也能享受行业最高端的CPU和GPU,极大提高制作效率和使用体验,且使用方便快捷,全面支持3D应用软件插件运行,随时调用百余款软件插件,高效作业。
页:
[1]