AssetBundle
AssetBundle简称AB包,压缩包包含模型、动画、贴图、预制体、声音可以在游戏运行时被加载
AB包自身保存相互依赖关系
压缩包LZMA和LZ4压缩算法,减少包大小,更快网络传输
AssetBundle打包设置
AssetBundle打包函数
BuildPipeline.BuildAssetBundles("相对路径",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64)
//None 构建没有任何特殊选项的资产包:体积最小
//UncompressedAssetBundle 在创建资产包时不要压缩数据:最快最大
//ChunkBasedCompression 基于块的压缩:比较小,比较快
最后参数是打包平台
加载AssetBundle
AssetBundle.LoadFromMemoryAsync(二进制加载)
AssetBundle assetBundle = AssetBundle.LoadFromMemory(new byte[] { });//byte[]加载,tcp传输获取的byte数组等
AssetBundle.LoadFromFile(本地文件加载)
AssetBundle assetBundle = AssetBundle.LoadFromFile("相对路径/包名.后缀");
WWW.LoadFromCacheOrDownload(本地和网络url加载)
WWW www = WWW.LoadFromCacheOrDownload("url", 1);//缓存加载 , version参数是版本号
if (www.isDone) { Debug.Log("等待www加载完毕"); }
AssetBundle assetBundle = www.assetBundle;//拿到ab包
UnityWebRequest(本地和网络url加载)
UnityWebRequest WebRequest = UnityWebRequest.GetAssetBundle("url");//创建一个UnityWebRequest
UnityWebRequestAsyncOperation operation = WebRequest.SendWebRequest();//开始请求服务器
if (WebRequest.downloadHandler.isDone) { Debug.Log("等待WebRequest加载完毕 :方式1"); }
if (operation.isDone) { Debug.Log("等待WebRequest加载完毕 :方式2"); }
AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(WebRequest);//获取方式1
AssetBundle assetBundle = (WebRequest.downloadHandler as DownloadHandlerAssetBundle).assetBundle;//获取方式2
注:
方法后面加Async则为异步加载。
crc校验码可加载时填入第二参数,所以得单独先拿到校验码。
AssetBundle内容清单提取
AssetBundle assetBundle = AssetBundle.LoadFromFile("AB/AB");//加载总资源包,参数:相对路径/总包名
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//获取清单文件列表
foreach (var name in manifest.GetAllAssetBundles())
{
Debug.Log(name);//打印包名
//获取包依赖名称
string[] Dependencies = manifest.GetAllDependencies(name);
}
AssetBundle内容资源提取
AssetBundle assetBundle = AssetBundle.LoadFromFile("AB/cube.3d");//加载资源包
GameObject cube_P = assetBundle.LoadAsset<GameObject>("cube");//加载资源到内存
GameObject cube = Instantiate(cube_P );//实例化物体
AssetBundle卸载
1.减少内存使用
2.有可能导致丢失
AssetBundle assetBundle = AssetBundle.LoadFromFile("AB/cube.3d")
assetBundle.Unload(true)//卸载所有资源,即使有资源被使用着
assetBundle.Unload(false)//卸载所有没用被使用的资源
//通过 Resources.UnloadUnusedAssets()卸载剩余资源
AssetBundles浏览工具
AssetBundle分组策略总结
逻辑实体分组
- 一个UI界面或者所有UI界面一个包(这个界面里面的贴图和布局信息一个包)
- 一个角色或者所有角色一个包(这个角色里面的模型和动画一个包)
- 所有的场景所共享的部分一个包(包括贴图和模型)
- 按照类型分组
所有声音资源打成一个包,所有shader打成一个包,所有模型打成一个包,所有材质打成一个包 - 按照使用分组
把在某一时间内使用的所有资源打成一个包。可以按照关卡分,一个关卡所需要的所有资源包括角色、贴图、声音等打成一个包。也可以按照场景分,一个场景所需要的资源一个包
注意
- 经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
- 把需要同时加载的资源放在一个包里面
- 可以把其他包共享的资源放在一个单独的包里面
- 把一些需要同时加载的小资源打包成一个包
- 如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分,例如v1、v2、v3