Skip to main content

打AB包

打包代码

using UnityEditor;

[MenuItem("Tool/打包")]
public static void BuildAB()
{
BuildPipeline.BuildAssetBundles("AssetBundles",BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
AssetDatabase.Refresh();
Debug.Log("打包完成");
}

BuildAssetBundleOptions

变量

  • None 不使用任何特殊选项构建 assetBundle。(包小 加载慢)
  • UncompressedAssetBundle 创建资源包时不压缩数据。(包大,加载快)
  • DisableWriteTypeTree 不包括 AssetBundle 中的类型信息。
  • DeterministicAssetBundle 使用存储在资源包中对象的 ID 的哈希构建资源包。
  • ForceRebuildAssetBundle 强制重新构建 assetBundle。
  • IgnoreTypeTreeChanges 在执行增量构建检查时忽略类型树更改。
  • AppendHashToAssetBundleName 向 assetBundle 名称附加哈希。
  • ChunkBasedCompression 创建 AssetBundle 时使用基于语块的 LZ4 压缩。(折中的方法)
  • StrictMode 如果在此期间报告任何错误,则构建无法成功。
  • DryRunBuild 进行干运行构建。
  • DisableLoadAssetByFileName 禁用按照文件名称查找资源包 LoadAsset。
  • DisableLoadAssetByFileNameWithExtension 禁用按照带扩展名的文件名称查找资源包 LoadAsset。
  • AssetBundleStripUnityVersion 在构建过程中删除存档文件和序列化文件头中的 Unity 版本号。

BuildTarget 是目标构建平台。

BuildAssetBundleOptions

可以指定几个具有各种效果的不同 BuildAssetBundleOptions。请参阅关于 BuildAssetBundleOptions 的脚本 API 参考查看所有这些选项的表格。

虽然可以根据需求变化和需求出现而自由组合 BuildAssetBundleOptions,但有三个特定的 BuildAssetBundleOptions 可以处理 AssetBundle 压缩:

BuildAssetBundleOptions.None:此捆绑包选项使用 LZMA 格式压缩,这是一个压缩的 LZMA 序列化数据文件流。LZMA 压缩要求在使用捆绑包之前对整个捆绑包进行解压缩。此压缩使文件大小尽可能小,但由于需要解压缩,加载时间略长。值得注意的是,在使用此 BuildAssetBundleOptions 时,为了使用捆绑包中的任何资源,必须首先解压缩整个捆绑包。 解压缩捆绑包后,将使用 LZ4 压缩技术在磁盘上重新压缩捆绑包,这不需要在使用捆绑包中的资源之前解压缩整个捆绑包。最好在包含资源时使用,这样,使用捆绑包中的一个资源意味着将加载所有资源。这种捆绑包的一些用例是打包角色或场景的所有资源。 由于文件较小,建议仅从异地主机初次下载 AssetBundle 时才使用 LZMA 压缩。通过 UnityWebRequestAssetBundle 加载的 LZMA 压缩格式 Asset Bundle 会自动重新压缩为 LZ4 压缩格式并缓存在本地文件系统上。如果通过其他方式下载并存储捆绑包,则可以使用 AssetBundle.RecompressAssetBundleAsync API 对其进行重新压缩。

BuildAssetBundleOptions.UncompressedAssetBundle:此捆绑包选项采用使数据完全未压缩的方式构建捆绑包。未压缩的缺点是文件下载大小增大。但是,下载后的加载时间会快得多。

BuildAssetBundleOptions.ChunkBasedCompression:此捆绑包选项使用称为 LZ4 的压缩方法,因此压缩文件大小比 LZMA 更大,但不像 LZMA 那样需要解压缩整个包才能使用捆绑包。LZ4 使用基于块的算法,允许按段或“块”加载 AssetBundle。解压缩单个块即可使用包含的资源,即使 AssetBundle 的其他块未解压缩也不影响。

使用 ChunkBasedCompression 时的加载时间与未压缩捆绑包大致相当,额外的优势是减小了占用的磁盘大小。

BuildTarget

BuildTarget.Standalone:这里我们告诉构建管线,我们要将这些 AssetBundle 用于哪些目标平台。可以在关于 BuildTarget 的脚本 API 参考中找到可用显式构建目标的列表。但是,如果不想在构建目标中进行硬编码,请充分利用 EditorUserBuildSettings.activeBuildTarget,它将自动找到当前设置的目标构建平台,并根据该目标构建 AssetBundle。

一旦正确设置构建脚本,最后便可以开始构建资源包了。如果是按照上面的脚本示例进行的操作,请单击 Assets > Build AssetBundles 以开始该过程。

现在已经成功构建了 AssetBundle,您可能会注意到 AssetBundles 目录包含的文件数量超出了最初的预期。确切地说,是多出了 2*(n+1) 个文件。让我们花点时间详细了解一下 BuildPipeline.BuildAssetBundles 产生的结果。

对于在编辑器中指定的每个 AssetBundle,可以看到一个具有 AssetBundle 名称+“.manifest”的文件。

随后会有一个额外捆绑包和清单的名称不同于先前创建的任何 AssetBundle。相反,此包以其所在的目录(构建 AssetBundle 的目录)命名。这就是清单捆绑包。我们以后会对此进行详细讨论并介绍使用方法。

从本地加载AB包

// 从AB包路径加载AB包
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/asdasd");
// 从AssetBundle中读取资源
var b = ab.LoadAsset<GameObject>("Cube");
var sa = ab.LoadAsset<GameObject>("Sphere");
// 实例化资源
Instantiate(b);
Instantiate(sa);

// 加载ab包中所有的资源
Object[] objs = ab.LoadAllAssets();
foreach(Pbject o in objs)
{
Instantiate(o);
}