包含此页的版本:
不含此页的版本:
AssetBundle 可以随应用程序一起分发,也可以从远程服务器下载。
下载 AssetBundle 时,必须采取预防措施,以防止数据损坏和恶意行为者的攻击。下载的 AssetBundle 中的数据损坏是导致用户设备崩溃的常见原因,可能需要付出大量努力才能解决。虽然 AssetBundle 不能包含可执行代码,但更改后的序列化数据可能会利用应用程序代码或 Unity 运行时中的漏洞。
用UnityWebRequestAssetBundle从 Internet 下载 AssetBundle。始终在 URL 中使用 HTTPS,除非它适用于同一台计算机上的本地 Web 服务器。HTTP 不安全,容易受到中间人攻击。
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压缩格式。
重要:
.manifest文件,可通过BuildPipeline.GetHashForAssetBundle不是完整文件内容的哈希值。它用作版本标识符,不适合文件损坏检测。对于分发给其他玩家的用户生成内容 (UGC),请过滤提交的内容以防止不当或恶意内容。不允许用户直接上传二进制 AssetBundle 文件。相反,要求他们上传源资产并自行构建 AssetBundle 文件。此过程支持手动和自动过滤,并允许您根据需要为较新的 Unity 版本重新构建 AssetBundle。
Unity 的内置基于磁盘的缓存系统通过存储通过UnityWebRequestAssetBundle.
缓存中的 AssetBundle 会自动转换为 LZ4,以获得最佳性能。如果Caching.compressionEnabled是false,捆绑包以未压缩的方式存储。
使用Caching类来管理缓存的资产包(例如,清除或检查缓存存在)。
下载 AssetBundle 时使用版本/哈希参数来启用缓存。
注意:在不受支持的平台(如 Web)上,基于磁盘的缓存不可用,并且所有交互都在内存中。
要修补 AssetBundle,请下载新的 AssetBundle 并替换现有的 AssetBundle。用UnityWebRequestAssetBundle.GetAssetBundle使用不同的版本或哈希参数会触发更新的 AssetBundle 的下载。
主要挑战是确定哪些资产包需要更换。修补系统必须管理两个列表:
修补系统会比较这些列表,重新下载缺少或具有更新版本信息的 AssetBundle。
默认情况下,Unity 不支持差异修补。UnityWebRequestAssetBundle.GetAssetBundle下载整个文件,即使使用内置缓存系统也是如此。需要差异修补的开发人员必须实现自定义下载器。由于 Unity 对 AssetBundle 数据进行确定性排序,因此重建的 AssetBundle 的补丁文件可以小得多。未压缩的捆绑包或使用基于块的捆绑包压缩一种存储数据的方法,可减少所需的存储空间量。请参阅纹理压缩、动画压缩、音频压缩、构建压缩。
请参阅术语表(LZ4) 比完全压缩束 (LZMA) 更具有贴片效率。
对于自定义系统,大多数开发人员使用标准格式(例如 JSON 来获取 AssetBundle 文件列表)和常用工具(例如 .NET 加密 API)来计算文件内容哈希值。这些哈希可以充当版本标识符,但如果生成系统支持,传统版本号是替代方法。