前文已经介绍了什么是AssetBundle并且对设置AB有了一定的了解。接下来,我们通过实例来了解设置AB名,打包AB,测试AB的方法。这里我们用到AssetBundleBrowser来快速组建AB资源。
运用
你能学到什么?
- AssetBundleBrowser组织bundle资源
- 加载AB
- 分包策略
使用AssetBundle Browser组织AB结构
与上文不同,这里我们选择插件来提供一个可视化的AB组织方式。这也是unity官方推荐的一种方式。
首先,右键资源列表中右键创建新bundle。当然也可以先创建一个文件夹再创建一个bundle,这个看需求具体组织。也可以直接拖拽资源形成一个bundle。
创建好bundle之后可以右键它有几个选项:删除,转变为变体,重命名,创建同级对象。如果选择转变为变体,那么bundle图标就会变成深灰色。创建好变体后,点击add child,可以创建具体的变体bundle。这里记住变体bundle中的资源名必须是一样的。
AssetBundle Browser 支持资源直接拖拽。并且会在资源列表中即时显示警告信息。可以通过查看信息自己处理或者右键包自动处理。
等所有AB资源组织好后,在Build中配置打包信息并完成打包。最终我们能在更目录下找到打包文件:
值得一提的是:LZMA被第一次解压后,下次加载会变成LZ4,加载速度会更快。
编写脚本加载AB
主要分两种:一种是本地加载,还有一种是联网下载后加载。
本地加载的话,先通过 LoadFromFile
或者LoadFromMemoryAsync
来加载bundle,然后通过LoadAsset来加载资源。具体的加载可以这么写:
string path = "AssetBundles/StandaloneWindows/" + assetBundleName;
AssetBundle ab = AssetBundle.LoadFromFile (path);
GameObject prefab = ab.LoadAsset<GameObject> (assetName);
Instantiate (prefab);
另外一种是使用DownloadHandlerAssetBundle
IEnumerator Start () {
{
string url = "http://website.com/assetbundle";
using (var uwr = new UnityWebRequest (url, UnityWebRequest.kHttpVerbGET)) {
uwr.downloadHandler = new DownloadHandlerAssetBundle (url, 0);
yield return uwr.SendWebRequest ();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent (uwr);
}
}
}
分包策略
- 将频繁更新的对象拆分为AssetBundle,与很少更改的对象分开
- 对可能同时加载的对象进行分组。例如模型,纹理和动画
- 如果您发现多个AssetBundle中的多个对象依赖于来自完全不同的AssetBundle的单个资产,请将依赖关系移动到单独的AssetBundle。如果多个AssetBundle引用其他AssetBundle中的同一组资产,则可能值得将这些依赖项拉入共享AssetBundle以减少重复。
- 如果不可能同时加载两组对象,例如标准和高清属性,请确保它们位于自己的AssetBundles中。
- 如果同时经常加载50%的捆绑包,请考虑拆分AssetBundle
- 考虑组合小型(少于5到10个资产)但其内容经常同时加载的AssetBundle
- 如果一组对象只是同一对象的不同版本,请考虑AssetBundle Variants
参考:
官方:用assetbundle manager + assetbundle browser实践
siki视频
AB API