1.什么是AssetBundle?
AssetBundle是一个压缩包文件,里面包含两位文件,一类是Serialized文件,这些资源被打碎后放在一个对象中,最后被统一写入一个文件中;另一类是Resource文件,包括声音图片等二进制文件,被单独保存以方便加载。
2.如何操作AssetBundle?
在加载AssetBundle时,我们通过AssetBundle对象来操作。
3.AssetBundle的使用流程
1)为资源指定AssetBundle属性
2)构建AssetBundle
3)上传AssetBundle至服务器
4)加载AssetBundle至本地
4.如何使用代码去打包AssetBundle
首先为资源指定AssetBundle属性,可以定义名称和路径,可以将多个文件打包成一个AssetBundle。
使用BuildPipeline.BuildAssetBundles("路径",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);//使用LZAM压缩
BuildPipeline.BuildAssetBundles(dir,BuildAssetBundleOptions.ChunkBasedCompression,BuildTarget.StandaloneWindows64);//使用LZ4压缩
BuildPipeline.BuildAssetBundles(dir,BuildAssetBundleOptions.UncompressedAssetBundle,BuildTarget.StandaloneWindows64);//无压缩
5.如何加载AssetBundle
IEnumerator Start ()
{
//加载方式
//1 LoadFromFile
//AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/tree.ab");
//2同步 LoadFromMemory
//AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundles/tree.ab"));
//异步
//assetbundlecreaterequest request = assetbundle.loadfrommemoryasync(file.readallbytes("assetbundles/tree.ab"));
//yield return request;
//assetbundle ab = request.assetbundle;
//3 WWW
while(Caching.ready == false)
{
yield return null;
}
WWW www = WWW.LoadFromCacheOrDownload(@"file:///G:\unity project workspace\AssetBundle\AssetBundles\tree.ab",1);
yield return www;
while(string.IsNullOrEmpty(www.error) == false)
{
Debug.Log(www.error);
yield break;
}
//4
string url = @"http://localhost/AssetBundles/tree.ab";
UnityWebRequest request = UnityWebRequest.GetAssetBundle(url); //加载
yield return request.Send(); //等待
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
GameObject treePre = ab.LoadAsset<GameObject>("tree");
Instantiate(treePre); }
6.如何给AssetBundle分组
1)将相同类型的资源打成一个包(如声音,材质,贴图等)
2)把每一个逻辑实体打成一个包(如单个模型,场景等)
3)按照资源加载时间打包(如游戏中某一个关卡打成一个包)
4)将一些共用的资源打成一个包(可以通过添加一些包的依赖关系,减小包的大小)
6)将一些重复加载的小资源打包
7)经常更新的包,和不常更新的分别打包
7.如何加载依赖包
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest abm = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] strs = abm.GetDirectDependencies("cube.ab");
foreach(string str in strs)
{
Debug.Log(str);
//AssetBundle.LoadFromFile("AssetBundles/"+str);
}
8.如何卸载AssetBundle?
使用AssetBundle.UnLoad(true) //将包中资源全部卸载
AssetBundle.UnLoad(false) //只卸载没有引用关系的包,但改包被重新加载时,原来的引用关系也将不存在,容易造成空间浪费。