在游戏中实现ChunkDownloader

设置本地主机网站

Choose your operating system:

Windows

macOS

Linux

前置主题

为了能够理解并使用此页面中的内容,请确保您已掌握以下主题:

ChunkDownloader 是面向 虚幻引擎 的修补解决方案。它从远程服务下载资产,并将其在内存中挂载供游戏使用,以便你可以轻松提供更新和资产。本指南将向你展示如何在自己的项目中实现ChunkDownloader。完成本指南,你便能够:

+启用ChunkDownloader插件并将其添加到项目的依赖项中。 +将你的内容整理成块,将它们打包到.pak文件,并准备清单以供下载。 +在游戏代码中实现ChunkDownloader,以便下载远程.pak文件。 +安全访问已挂载.pak文件中的内容。

1.所需设置和建议资产

在继续进行任何操作之前,你应该阅读以下指南并遵循每个步骤:

+ 设置ChunkDownloader插件 + 准备资产进行分块 + 为ChunkDownloader托管清单和资产

这些指南将向你展示如何将ChunkDownloader插件添加到项目中,如何为资产设置分块方案以及如何将它们分发到本地测试服务器。回顾一下,你的示例项目应名为 PatchingDemo ,并且其构造应如下所示:

  1. 这是一个基于 空白模板 C++项目

  2. 插件(Plugins) 菜单中启用了 ChunkDownloader 插件。

  3. 项目设置(Project Settings) > 项目(Project) > 打包(Packaging) 中,同时启用 使用Pak文件(Use Pak File) 生成块(Generate Chunks)

  4. 来自Paragon的 Boris Crunch Khaimera 资产已添加到项目中。 +你可以从 虚幻商城 免费下载这些内容。 +你可以使用你所需的任何资产,只要它们被分隔到离散文件夹。

  5. 这三个角色文件夹中的每个文件夹都有一个 主要资产标签 和以下 文件块ID

    文件夹

    文件块ID

    ParagonBoris

    1001

    ParagonCrunch

    1002

    ParagonKhaimera

    1003

  6. 你已经烘焙内容,并且上述每个文件块ID都具有.pak文件。

  7. .pak文件和清单文件已分发到本地托管的网站。有关如何进行设置的说明,请参考 托管ChunkDownloader清单和资产

2.初始化和关闭ChunkDownloader

ChunkDownloader是对 FPlatformChunkInstall 接口的实现,该接口是许多接口之一,可以根据你的游戏运行平台交替加载不同的模块。需要先加载和初始化所有模块才能使用它们,还需要关闭并清理它们。

通过ChunkDownloader进行此操作的最简单方法是使用自定义 GameInstance 类。GameInstance不仅具有可以绑定的相应初始化和关闭函数,而且还可以在游戏运行时持续访问ChunkDownloader。以下步骤将引导你完成此实现过程。

  1. 使用 GameInstance 作为基类创建 新C++类 。将其命名为 PatchingDemoGameInstance

    点击查看大图。

3.下载Pak文件

现在,你已经有ChunkDownloader的相应初始化和关闭函数,你可以公开其.pak下载功能。

4.设置修补游戏模式

要启动修补过程,你可以设置一个特定的关卡和游戏模式来调用PatchGame,并将修补统计信息输出到界面。

  1. 在虚幻编辑器中,在 内容浏览器 中创建新的 蓝图(Blueprints) 文件夹。然后,使用 PatchingDemoGameInstance 作为基类创建 新蓝图

    点击查看大图。

    将新蓝图类命名为 CDGameInstance

    点击查看大图。

    你将使用此蓝图以更轻松的方式编辑设置和追踪文件块下载过程。

  2. 创建名为 PatchingGameMode 的新 游戏模式 蓝图。

    PatchingGameMode.png

  3. 创建 地图(Maps) 文件夹,然后创建两个新关卡,分别称为 PatchingDemoEntry PatchingDemoTest 。入门级关卡应基于空白地图,而测试级关卡应基于默认地图。

    点击查看大图。

  4. PatchingDemoEntry 世界设置(World Settings) 中,将 GameMode重载(GameMode Override) 设置为 PatchingGameMode

    点击查看大图。

  5. 打开你的 项目设置(Project Settings) ,然后导航至 项目(项目) > 地图和模式(Maps & Modes) 。设置下列参数:

    点击查看大图。

    ID

    参数

    1

    游戏实例类

    CDGameInstance

    2

    编辑器启动地图

    PatchingDemoTest

    3

    游戏默认地图

    PatchingDemoEntry

  6. 蓝图编辑器 中打开 CDGameInstance 。在 默认(Defaults) 面板中,将三个条目添加到 文件块下载列表 中。条目值分别为1001、1002和1003。这是三个.pak文件的文件块ID。

    ChunkDownloadList.png

  7. 蓝图编辑器 中打开 PatchingGameMode ,并导航至 EventGraph

  8. 创建 Get Game Instance 节点,然后将其投射到 CDGameInstance

  9. 点击 As CDGameInstance 并从中拖出一根引线,然后点击 升级为变量(Promote to Variable) ,创建我们游戏实例的引用。调用新变量 Current Game Instance

  10. 点击 设置当前游戏实例 的输出引脚并从中拖出一根引线,然后创建对 Patch Game 的调用。

  11. 点击 Patch Game 返回值 并从中拖出一根引线,然后点击 升级为变量(Promote to Variable) ,创建用于存储其值的布尔值。调用新变量 Is Patching In Progress

    点击查看大图。

  12. 创建 Get Current Game Instance 节点,然后点击其输出引脚并从中拖出一根引线,创建对 Get Patch Status 的调用。

  13. 点击 Get Patch Status 返回值(Return Value) 引脚并从中拖出一根引线,然后创建 Break PatchStats 节点。

  14. 点击 更新函数 事件并从中拖出一根引线,然后创建新的 Branch 节点。将 Is Patching In Progress 连接到其 条件(Condition) 输入。

  15. 点击 Branch 节点的 True 引脚并从中拖出一根引线,然后创建 Print String 节点。使用 BuildString (float) Break PatchStats 节点输出 下载百分比(Download Percent) 。对 挂载百分比(Mount Percent) 重复此步骤。

    点击查看大图。

  16. Print String 节点上,创建 Branch 节点,然后创建 AND 节点并将其连接到 条件(Condition) 引脚。

  17. 创建 Greater Than or Equal To 节点,检查 下载百分比(Download Percent) 是否为1.0或更高,然后对 挂载百分比(Mount Percent) 执行相同的操作。将两者都连接到 AND 节点。如果这两个条件都为true,则使用 打开关卡(Open Level) 打开你的 PatchingGameTest 关卡。

    点击查看大图。

现在,当你的游戏运行时,它将打开入门级地图,运行ChunkDownloader,并输出文件块下载(Chunk Download)列表中文件块的下载进度和挂载进度。下载完成后,将过渡到测试地图。

如果你尝试使用 在编辑器中运行 运行它,则下载将不会开始。你需要使用打包的版本测试ChunkDownloader。

5.显示已下载内容

要显示我们的角色网格体,你需要获取它们的引用。这将需要 软件对象引用 ,因为在使用资产之前你需要先验证它们是否已加载。本节将引导你完成简单的示例,该示例旨在说明如何生成Actor,并根据软引用填充它们的骨骼网格体。

  1. 打开 PatchingDemoTest 关卡,然后打开 关卡蓝图

  2. 创建名为 网格体(Meshes) 的新变量。

    • 对于其 变量类型(Variable Type) ,选择 骨骼网格体(Skeletal Mesh)

    • 将鼠标悬停在类型列表中的条目上,然后选择 软对象引用(Soft Object Reference) 。这会将变量的颜色从蓝色更改为柔和的绿色。

    点击查看大图。

    软对象引用是一种智能指针,可以安全引用不明确的资产。我们可以在使用资产前用它检查你的网格体资产是否已加载并且可用。

  3. 点击 网格体(Meshes) 变量类型(variable type) 旁边的图标,将其更改为 数组(Array) 。编译你的蓝图以便应用更改。

    点击查看大图。

  4. 网格体(Meshes) 默认(Default) 值中,添加三个条目,然后为 Boris Crunch Khaimera 选择骨骼网格体。

    点击查看大图。

  5. 在关卡的 EventGraph 中,点击 BeginPlay 事件并从中拖出一根引线,然后创建 面向每个循环(For Each Loop) ,并将其连接到 网格体 数组。

  6. 点击 面向每个循环(For Each Loop) 数组元素 引脚并从中拖出一根引线,然后创建 Is Valid Soft Object Reference 节点。从 循环主体 创建 分支 ,并将其连接到 返回值

  7. 创建 Spawn Actor From Class 节点,并将其连接到 Branch 节点的 True 引脚。选择 骨骼网格体Actor

  8. 点击 面向每个循环(For Each Loop) 数组索引 并从中拖出一根引线,然后创建 Integer x Float 节点。将浮点值设置为 192.0

  9. 点击 Integer x Float 节点的 返回值 并从中拖出一根引线,以创建 Vector x Float 节点,并将向量的值设为 (1.0, 0.0, 0.0)

    • 每次我们遍历面向每个循环(For Each Loop)时,这将使坐标远离原点192个单位。这将在我们生成网格体时给每个网格体一些空间。

  10. 将上一步中的矢量用作 Make Transform 节点中的 位置 ,然后将 返回值 连接到 Spawn Actor 节点的 生成变换 输入。

  11. 点击 Spawn Actor 节点的 返回值 并从中拖出一根引线,然后获取其 骨骼网格体组件 的引用。用其调用 设置骨骼网格体

  12. 点击 Array Element 节点并从中拖出一根引线,然后创建 Resolve Soft Object Reference 节点。将此节点的输出连接到 设置骨骼网格体 新网格体 输入引脚。

    点击查看大图。

  13. 将关卡内的 玩家出生点 移动到 (-450, 0.0, 112.0)

    点击查看大图。

  14. 保存进度并编译蓝图。

关卡加载时,将生成每个角色的骨骼网格体。如果软对象引用不起作用,则每个角色的文件块尚未挂载,它们的资产将不可用,并且它们将不会生成。

CharactersSpawned.png

当引用.pak文件中包含的资产时,你应该始终使用软对象引用而不是标准的硬引用。如果使用硬引用,它会破坏你的分块方案。

6.测试游戏

最后,你需要在独立版本中测试你的项目。Pak挂载不能在PIE模式下运行,因此这是测试修补功能的必要步骤。

  1. 打包项目。

  2. 将.pak文件和清单复制到 IIS测试网站 上相应的文件夹中。

  3. 确保IIS进程和网站都正在运行。

  4. 运行打包的可执行文件。

最终结果

你应该看到一个黑色界面,界面左上方显示修补输出,然后,当修补和挂载状态都达到100%时,你的游戏应加载到默认地图中,并显示Boris、Crunch和Khaimera。如果修补或挂载过程出现问题,则不会显示这些内容。

自行尝试

可以执行几个步骤来细化你的文件块下载方案:

  • 编译在加载模式下显示的UI,并显示进度条和播放器提示。

  • 编译UI错误提示,例如超时和安装失败。

  • 创建PrimaryAssetLabel的自定义子类,以包含资产相关的其他元数据。例如,《战争破坏者》(Battle Breakers)的自定义PrimaryAssetLabel类包括一个父文件块,必须加载该父文件块,这是使用当前文件块的先决条件。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消