Version: 6000.3
语言: 中文
优化资产包
使用资产编写脚本

下载资产包

AssetBundle 可以随应用程序一起分发,也可以从远程服务器下载。

验证 AssetBundle 下载

下载 AssetBundle 时,必须采取预防措施,以防止数据损坏和恶意行为者的攻击。下载的 AssetBundle 中的数据损坏是导致用户设备崩溃的常见原因,可能需要付出大量努力才能解决。虽然 AssetBundle 不能包含可执行代码,但更改后的序列化数据可能会利用应用程序代码或 Unity 运行时中的漏洞。

使用安全协议下载

UnityWebRequestAssetBundle从 Internet 下载 AssetBundle。始终在 URL 中使用 HTTPS,除非它适用于同一台计算机上的本地 Web 服务器。HTTP 不安全,容易受到中间人攻击。

循环冗余校验 (CRC)

Unity 在 AssetBundle 构建过程中生成一个 32 位校验和,存储在.manifest文件,并通过以下方式访问BuildPipeline.GetCRCForAssetBundle.使用循环冗余检查 (CRC) 确保 AssetBundle 未被篡改或损坏。通过以下方式下载 AssetBundle 时UnityWebRequestAssetBundle.GetAssetBundle,提供预期的CRC值,以防止缓存无效的AssetBundle。

如果您直接处理 AssetBundle 下载(在 Unity 缓存之外),请在使用检索到的内容之前执行完整性检查。AssetBundle 加载 API 中的可选参数允许您传递 CRC 值以进行验证。如果计算出的 CRC 不匹配,则不会加载 AssetBundle。对于 LZ4 压缩的捆绑包,此检查成本很高,因为它需要完全解压缩到 RAM 中。LZMA 压缩的捆绑包已经需要完全解压缩才能加载,因此 CRC 检查不会增加大量开销。为避免在加载期间重复检查,请在检索捆绑包并将其保存在设备上时验证捆绑包一次。有关更多信息,请参阅AssetBundle压缩格式

重要:

  • 不要使用常见的哈希算法(如 md5)来验证压缩的 AssetBundle。Unity 可能会在不更改其内容的情况下重新压缩 AssetBundle,这会更改文件哈希,尽管内容有效。CRC 值是根据未压缩的内容计算得出的,并且在重新压缩过程中保持一致。
  • AssetBundle 哈希.manifest文件,可通过BuildPipeline.GetHashForAssetBundle不是完整文件内容的哈希值。它用作版本标识符,不适合文件损坏检测。

用户生成的内容

对于分发给其他玩家的用户生成内容 (UGC),请过滤提交的内容以防止不当或恶意内容。不允许用户直接上传二进制 AssetBundle 文件。相反,要求他们上传源资产并自行构建 AssetBundle 文件。此过程支持手动和自动过滤,并允许您根据需要为较新的 Unity 版本重新构建 AssetBundle。

AssetBundle 缓存

Unity 的内置基于磁盘的缓存系统通过存储通过UnityWebRequestAssetBundle.

缓存中的 AssetBundle 会自动转换为 LZ4,以获得最佳性能。如果Caching.compressionEnabledfalse,捆绑包以未压缩的方式存储。

使用Caching类来管理缓存的资产包(例如,清除或检查缓存存在)。

下载 AssetBundle 时使用版本/哈希参数来启用缓存。

注意:在不受支持的平台(如 Web)上,基于磁盘的缓存不可用,并且所有交互都在内存中。

修补资产包

要修补 AssetBundle,请下载新的 AssetBundle 并替换现有的 AssetBundle。用UnityWebRequestAssetBundle.GetAssetBundle使用不同的版本或哈希参数会触发更新的 AssetBundle 的下载。

主要挑战是确定哪些资产包需要更换。修补系统必须管理两个列表:

  • 本地资产包(Local AssetBundles) :当前下载的包及其版本信息。
  • 服务器资产包(Server AssetBundles) :服务器上可用的包及其版本信息。

修补系统会比较这些列表,重新下载缺少或具有更新版本信息的 AssetBundle。

默认情况下,Unity 不支持差异修补。UnityWebRequestAssetBundle.GetAssetBundle下载整个文件,即使使用内置缓存系统也是如此。需要差异修补的开发人员必须实现自定义下载器。由于 Unity 对 AssetBundle 数据进行确定性排序,因此重建的 AssetBundle 的补丁文件可以小得多。未压缩的捆绑包或使用基于块的捆绑包压缩一种存储数据的方法,可减少所需的存储空间量。请参阅纹理压缩动画压缩音频压缩构建压缩
请参阅术语表
(LZ4) 比完全压缩束 (LZMA) 更具有贴片效率。

对于自定义系统,大多数开发人员使用标准格式(例如 JSON 来获取 AssetBundle 文件列表)和常用工具(例如 .NET 加密 API)来计算文件内容哈希值。这些哈希可以充当版本标识符,但如果生成系统支持,传统版本号是替代方法。

其他资源

优化资产包
使用资产编写脚本