引言
先想两个问题:
1.资源较多,导致安装包过大。o(≧口≦)o
2.已经上架的游戏某些资源文件搞错了。┻━┻︵╰(‵□′)╯︵┻━┻
解决方案
将这些资源文件通过LZMA或者LZ4算法进行压缩,打包,上传至服务器,需要的时候使用http协议进行下载,解压,使用。
AssetBundles(别问我为什么要加s)|ω・)
根据官方文档描述:可以将资源(序列化文件以及源文件)进行打包,并解决了包和包之间的依赖关系,好处呢,比如减少包的大小,以及从远端进行加载资源文件,减少运行内存压力。
解压和加载
AB包呢,可以进行压缩进而降低包的大小,主要的算法为两种:LZMA算法以及LZ4算法。总体来说,LZMA算法打的包要比LZ4要小,但是解压时间也比LZ4长,当然哦,也可以不进行压缩,那么解压时间就为0啦,(解压后),从包里加载需要的文件时,也是需要时间的,所以会有每种加载方法都有同步和异步两种。
如何打包(眼看着就要成为官方的翻译文档 .....((/- -)/)
1.首先选定需要打包的资源:
2.选定资源所在的层级结构,如:
3.手动进行编写打包方法,放进Editor文件夹里(代码摘自官方文档)
using System.IO; using UnityEditor; public class CreateAssetBundles { //特性 在工具栏Assets下创建一个Build AssetBundles选项用以打包 [MenuItem("Assets/Build AssetBundles")] static void BuildAssetBundles() { string assetBundleDir = "Assets/AssetBundles"; if(!Directory.Exists(assetBundleDir)) { Directory.CreateDirectory(assetBundleDir); } BuildPipeline.BuildAssetBundles(assetBundleDir,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64); /*第二个参数 BuildAssetBundleOptions.None LZMA压缩 BuildAssetBundleOptions.ChunkBasedCompression LZ4压缩 BuildAssetBundleOptions.UncompressedAssetBundle 不压缩 */ /*第三个参数 选择打包到啥样的平台 */ } }
4.打包后如图结构
以上是整个打包的流程。
如何加载AB包
AssetBundle.LoadFromMemoryAsync 从内存中加载
AssetBundle.LoadFromFile 从本地磁盘中进行加载
WWW.LoadFromCacheOrDownload 从本地或者服务器(弃用)
UnityWebRequest从web上进行加载
包与包依赖问题
图中所示除了我本身要打包的资源文件,还有一个AssetBundles,打开其.manifest
从这个总的文件的..manifest里,我们可以获取所有的资源以及他们的依赖,只要在加载特定资源时,将其依赖先进性加载,就可以解决了依赖问题。
(解释一下,比如先对一个材质进行打包,再对其他使用该材质的预制体进行打包,就会产生依赖关系,那,为什么不一起打包呢?因为如果有多个预制体都使用到了该材质,并且一起打包,该材质文件就会重复被保存,使得包变大)
敲黑板!!!AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath); AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); string[] dependencies = manifest.GetAllDependencies("assetBundle"); //Pass the name of the bundle you want the dependencies for. foreach(string dependency in dependencies) { AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency)); }
以上代码均来自于官方网站。
包的卸载
在第一个场景里加载的包在第二个场景里没有用处的话,我们就要考虑将其手动卸载调,毕竟占内存撒。
解释一下官方的栗子:
假如材质M是AB包里的实例话出来的,是在内存中的
and假如参数为true 那么,结果是不光这个包没了,并且这个M也没了
and假如参数为false,那么,结果是这个包没了,并且断掉了这个M与包AB的连接,如果重新加载,就会重新加载一个M,而不是和之前的进行连接,就存在了两个M副本。
enmmm,所以说false是不常用的,最后还有说一个方法:
字面意思就是卸载无用的资源,这个方法是当不得不用false的时候,用这个卸载没有链接的资源。
参考文档
全剧终!(果然成了翻译文档(lll¬ω¬))
ps:留校学习中!!!(欸,其实回家也没那么好,是吧。。。我的良心去哪了。。。)