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