大家好,又见面了,我是你们的朋友全栈君。
====>AssetBundle打包:设置好AssetBundle包名后,利用BuildPipeline.BuildAssetBundles (“Path”);进行打包。
该函数有三参和四参的,三参如下:
outputPath : 导出路径 BuildAssetBundleOptions : 导出选项枚举,内容在后面。 其中包含:是否压缩,是否使用块压缩即LZ4压缩等 BuildTarget : 导出平台枚举
如果第二个参数选择None,则默认是选择LZMA算法压缩。
LZMA:压缩出来的包更小,故加载时间长但是需要整体解压(比如包中有ABC三个资源,我只需用A,但BC也会被解压出来)
LZ4:会对ABC资源分别进行压缩(块压缩),所以如果只使用A,那么BC不会被解压出来。速度快
====>下载AssetBundle:下载AB包api
有四大种(从内存、本地、WWW、UnityWebRequest),其中LoadFromFile和LoadFromMemory都有其异步方法。而3,4推荐使用4。3是如果当前没有下载过,就从服务器下载,存到本地的缓存Catch中。如果下载过就直接从本地Catch中加载。
同步加载传递参数是路径,Async的传递byte字节数组,www传递url和版本号(或者校验码等)
www传递参数url,版本号。
法①:AssetBundle.LoadFromFile(“abPath pathName”)及其
法②:异步方法AssetBundle.LoadFromFileAsync 协程实现
static IEnumerator LoadAsyncCoroutine(string path){
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(path) ;
yield return abcr;
AssetBundle ab = abcr.assetBundle;
}
法③、④:LoadFromMemoryAsync ,LoadFromMemory(参数也是字节数组)
法⑤:www异步加载 yield return www;www.assetBundle;即可
法⑥:UnityWebRequest方法,用来代替WWW加载。
====>加载AssetBundle包中的资源
法①: Object AssetBundle.LoadAsset(string assetName);
法②: AssetBundleRequest AssetBundle.LoadAssetAsync(string assetName); 返回值是AssetBundleRequest类型 abr ,abr.assetBundle即可。
其他方法:LoadAllAsset及其异步Async方法
=================================
依赖加载处理,解决冗余:依赖加载
①获取包含总Manifest文件的AB包(与目录名相同)
AssetBundle manifestAB = AssetBundle.LoadFromFile(outputPath); // 加载总ManifestAssetBundle
②得到Manifest文件
AssetBundleManifest manifest = (AssetBundleManifest)manifestAB.LoadAsset(“AssetBundleManifest”);
③获取当前资源所需的所有依赖项
string[] dependencies = manifest.GetAllDependencies(“sprite1234.ab”); // 结果 sprite1.ab
④遍历加载出所有依赖包
foreach(string name in dependencies){
AssetBundle.LoadFromFile(“path name”);
}
⑤释放资源包
manifestAB.Unload(false); // 释放AssetBundle
========释放资源
AssetBundle.Unload(false):卸载当前不被使用的资源,可能会造成内存没法被卸载。比如:
一个包AB中有一个m材质被Person1使用着,那么调用完该方法后,AB包被卸载了,但是Person1上的m没被卸载,但是和AB包间的引用关系断开了。这时,即使我重新加载出了AB包,它也和Person1之间没引用关系了,这时如果m不被Person1使用了,那么m就没有办法被卸载了。这时只能通过Resources.UnloadUnusedAsset()卸载了
AssetBundle.Unload(true):卸载AB包以及所有资源。使用:要确保当前没有物体在使用里边的资源了,一般在关卡、场景切换时
释放资源
注意:如果不释放www,则AssetBundle.Unload(false)的时候,是不能释放掉ab包的,因为内存会保存有一份ab的引用。
& www对象:www加载完毕后调用www.dispose()或www = null
& AssetBundle对象:
对于使用完毕的AB,调用AssetBundle.Unload(false)或true释放
false:卸载AB对象时,保留内存中已加载的资源 ture:卸载AB对象时,同时卸载内存中已加载的资源(不建议)
& 对于资源使用完毕的,调用Resources.UnloadAsset()
& 不再使用的GameObject直接Destroy即可
—-
* Prefab:DestroyImmediate卸载
* 非Prefab:Resources.UnloadAsset()、Resources.UnloadUnuesedAsset()、AssetBundle.Unload(true)
============================================================================================
AssetBundle分组策略:
解释:1、不经常更新的和经常更新分离:如果不分离比如A、B都是100M,本来只有A需要更新,这时因为它们是同一个包,那么用户需要下载更新200M。
=========================AssetBundle查看工具(内含可查看包大小、名字、引用资源、包含资源等 打包功能等):AssetBundle Browser tool
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148676.html原文链接:https://javaforall.cn