注意:Unity 的 Addressables 系统是推荐的资产加载方法。以下内容仅适用于直接使用 AssetBundle。
因为所有资产数据都必须在内容启动之前预先下载,请考虑将资产从主数据文件中移出到 AssetBundle 中。这样做会创建一个较小的加载器场景来快速加载,而 AssetBundle 会在用户浏览内容时动态按需加载资产。AssetBundle 还有助于进行资产数据内存管理:可通过调用 AssetBundle.Unload 从内存中卸载掉不再需要的资产的资产数据。
在 Web 平台上使用 AssetBundle 时的注意事项如下:
在 AssetBundle 中使用未在主构建中使用的类类型时,Unity 可能会从构建中剥离这些类的代码。尝试从 AssetBundle 加载资产时,这可能会导致失败。请使用 BuildPlayerOptions.assetBundleManifestPath 修复该问题,并参阅分发大小和代码剥离以了解其他选项。
WebGL 图形 API 不支持线程处理。由于 HTTP 下载仅在下载后才可用,因此 Unity Web 平台构建需要在下载完成后在主线程上解压缩 AssetBundle 数据,从而阻塞主线程。为避免这种中断,LZMA AssetBundle 压缩不可用于 Web 上的 AssetBundle。此情况下使用 LZ4 对 AssetBundle 进行压缩,这种压缩格式可高效地按需进行解压缩。如果所需的压缩大小比 LZ4 能够提供的压缩大小更小,请将 Web 服务器配置为对 AssetBundle 使用 gzip 或 Brotli 压缩(基于 LZ4 压缩)。请参阅部署压缩构建以详细了解如何执行此操作。
在 Web 平台上,使用 UnityWebRequestAssetBundle.GetAssetBundle 时不支持基于文件系统的 AssetBundle 缓存。相反,浏览器会缓存 WebRequest 响应;有关详细信息,请参阅 Web 中的缓存行为。这意味着在加载 AssetBundle 时,整个 AssetBundle 文件都保存在内存中,因此必须立即卸载未使用的 AssetBundle,尤其是在它们很大时。