AssetBundle笔记

AssetBundle自身保存依赖关系
压缩包使用LZMA和LZ4压缩算法,减少包大小,更快进行网络传输

BuildPipeline.BuildAssetBundles(输出路径,打包选项,打包平台);// buildAssetbundles.

AssetBundle ab = AssetBundle.LoadFromFile("MyAssetBundles/wall.unity3d");
GameObject go = ab.LoadAsset<GameObject>("Cube"); //这里也可以使用LoadAllAsset 获取所有, 然后在使用的时候需要遍历
Instantiate(go);

打包分组策略
依赖打包, 公共资源单独打包

BuildAssetBundleOPtions.None:LZMA压缩,包小,加载时间长,包中资源整体解压, 一旦被下载之后,会自动使用LZ4算法保存到本地 的机制
BuildAssetBundleOptions.ChunkBasedCompression:LZ4压缩 压缩率没有LZMA高,但是可以加载指定资源而不用解压全部,并且加载速度比LZMA快
BuildAssetBundleOPtions.UncompressedAssetBundle 不压缩 包大,加载块

在使用有依赖关系的包,尽量在使用之前需要加载依赖的包; 如果一个材质球依赖一个贴图, 那么这个贴图的包什么时候被加载,这个材质球什么时候被赋予贴图


加载方式
1: 从一个二进制中读取
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("MyAssetBundles/wall")); //异步方式,去掉Async为同步方式
yield return request;
AssetBundle ab = request.assetBundle;

2: 从一个文件中读取(相当于自动转换二进制的LoadFromMemory) 与上边同样有异步同步方式加载
AssetBundle.LoadFromFile;

3. WWW www = WWW.LoadFromCacheOrDownload(@"file://G:UnityProjectlxAssetBundleMyAssetBundleswall",1);第二参数为版本号, 如果是新的版本号会从新下载
yield return www;

if (!string.IsNullOrEmpty(www.error))
{
print(www.error);
}

AssetBundle ab = www.assetBundle;
GameObject go = ab.LoadAsset<GameObject>("Cube");
Instantiate(go);

4. UnityWebRequest: 即将替换WWW
UnityWebRequest uwr = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/wall");

yield return uwr.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(uwr);

UnityWebRequest 的另一种使用方法

UnityWebRequest uwr = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/wall");

yield return uwr.SendWebRequest();
//下边不一样
AssetBundle ab = (uwr.downloadHandler as DownloadHandlerAssetBundle).assetBundle

to load a assets

T objectFromBundle = bundleObject.LoadAsset<T>(assetName);

to load allAssets

Unity.Object[] objectArray = loadedAssetBundle.LoadAllAssets();

获取依赖并加载

UnityWebRequest manifest = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/MyAssetBundles"); //首先获取AssetBundle 用WWW也行fromFile也行

yield return manifest.SendWebRequest(); //发送请求

AssetBundle maniAb = DownloadHandlerAssetBundle.GetContent(manifest); //得到ab

AssetBundleManifest abm = maniAb.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //获取主Manifest

string[] allDependencies = abm.GetAllDependencies("wall"); //获取wall的依赖包名

foreach (string item in allDependencies) //遍历
{
UnityWebRequest dep = UnityWebRequest.GetAssetBundle(@"http://127.0.0.1:19876/MyAssetBundles/" + item);
yield return dep.SendWebRequest();
AssetBundle ab1 = DownloadHandlerAssetBundle.GetContent(dep);

}

AssetBundle ab = DownloadHandlerAssetBundle.GetContent(uwr);



释放ab
AssetBundle.UnLoad(bool value) true: 不管有没有其他物体引用,直接卸载(释放). false:如果有使用的,那么这个资源不会被释放
释放过后 不管参数是true还是false , 这个资源都没有任何引用关系了. 即使再次加载进来这个资源, 那么(比如说材质) 也不会被指定到物体上

这里有个问题就是如果参数是false的话 那么只会卸载ab包的对象, 资源并没有卸载, 会导致内存泄露 所以尽量保证资源不适用后使用true的参数进行卸载


如果一定要使用false 两种方法解决 1.可以再后边确定物体和代码都没有引用的时候使用Resources.UnloadUnusedAssets(); 方法进行卸载
2.场景切换的时候会自动调用上边的方法

CRC MD5 SHA1 加密/校验

UGUI打包问题

UGUI中会自动将图片资源打包到一个图集中,如果两个包引用了两个不同的图片,那么会导致每个包中都包含一个图集
解决办法. 在图片资源中有Packing Tag ,可以将一些依赖的图片设置为一个标签, 这样UGUI打包的时候就会放到一起了


AssetBundle Browser Tool

本博客所有内容均为原创,转载请注明出处.
原文地址:https://www.cnblogs.com/what-lee/p/9249876.html