AssetBundle的作用
AssetBundle是一个压缩包包含模型,贴图,预制体,声音,甚至整个场景可以在游戏运行时加载 AssetBundle自身保存着互相的依赖关系
压缩包可以使用LZMA和LZ4压缩算法,减少包的大小更快进行网络传输
可以把一些下载或暂时用不到的资源放在AssetBundle里减少游戏安装包大小
什么是AssetBundle
1,它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)
serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载
2,它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
//在打包时可以把不同类型的包放到不同的子文件夹里只需要在包的名字前面在加一个文件夹的名字就可以了后缀起什么都无所谓
在打包时有可能两个包同时依赖一个资源那么打包时两个包都会把这个资源的打包进自己包里这样会造成包很大
可以将需要共享的资源(也就是被很多其他包依赖的包)也单独打成一个包
这样的话打包物体时他就不会打包被依赖的资源因为被依赖的资源已经打包成一个单独的包了
但要注意加载时要先加载被依赖的资源
不然会出现贴图丢失啊什么的
加载AssetBundle的四种方式
1,AssetBundle.LoadFromMemoryAsync
2,AssetBundle.LoadFromFile
3,WWW.LoadFromCacheOrDownload//快被弃用
4,UnityWebRequest
在打包一个包时会有一个.manifest的文件里面有两个重要的属性
CRC文件校验码用于校验文件是否完整
Dependencies依赖关系:依赖那个文件(资源)
在打包的时候会有一个和打包路径文件夹名字一样的后缀为.manifest的文件
该文件存储着所有的AssetBudle的包和他们的依赖关系
可以先把该文件Load进来使用上面四种API那个都可以Load
但是不能带后缀名LoadAssetBundle包必须带后缀
load进来把其转成AssetBundle然后
可以使用AssetBundle类的实例方法LaodAsset
是文件名加Manifest返回值AssetBundleManifest类型
通过GetAllAssetBundles()可以获得所有的AssetBundle包的名字返回值string[]
通过GetDirectDependencies()参数是一个AssetBundle的名字带后缀是打包时起的AssetBundle名字返回值string[]就可以获取该包所有依赖的资源
然后就可以把这些依赖资源先Load进来了
在打包时对包进行分组根据实际需求
//加载依赖资源 AssetBundle ab = AssetBundle.LoadFromFile("AssetBundle/cube/wall.unity3d");
GameObject go = ab.LoadAsset("TwoCube");
AssetBundle bundle = AssetBundle.LoadFromFile("AssetBundle/AssetBundle"); AssetBundleManifest manifest = bundle.LoadAsset("AssetBundleManifest");
foreach (string item in manifest.GetAllAssetBundles())
{
Debug.Log(item);
}
string[] name = manifest.GetDirectDependencies("cube/wall.unity3d");
Debug.Log(name[0]);
AssetBundle.LoadFromFile("AssetBundle/" + name[0]);
Instantiate(go);
//打包所有Assetbundle
//参数
//1,打包路径
//2,压缩算法
//3,打包平台
BuildPipeline.BuildAssetBundles(OutPath,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
加载文件
第一种加载AssetBundle的方式(本地同步加载)
从本地加载路径加上后缀
AssetBundle asset = AssetBundle.LoadFromFile("AssetBundle/cube.unity3d");
从AssetBundle里获取物体参数被打包成AssetBundle的名字
GameObject go = asset.LoadAsset("Cube") as GameObject;
Instantiate(go);
异步加载______________________________________________________________________
AssetBundleCreateRequest d = AssetBundle.LoadFromFileAsync("AssetBundle/cube.unity3d");
AssetBundle dd = d.assetBundle;
GameObject go = dd.LoadAsset("Cube") as GameObject;
Instantiate(go);
从内存里同步加载
AssetBundle d = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundle/cube.unity3d"));
GameObject go = d.LoadAsset("Cube") as GameObject;
从内存异步加载也可以放在协同程序里面
//Instantiate(go);AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("AssetBundle/cube.unity3d"));
AssetBundle a = request.assetBundle;
GameObject go = a.LoadAsset("Cube") as GameObject;
Instantiate(go);
//使用www进行网络加载
//参数是IP地址/文件
WWW wWW = WWW.LoadFromCacheOrDownload("http://192.0.0.1/cube.unity3d",1);
//等待下载完成
yield return wWW;
//获取AssetBundle
AssetBundle ab = wWW.assetBundle;
//从AssetBundle里加载物体
GameObject go = ab.LoadAsset("Cube")as GameObject;
Instantiate(go);
//使用unity自带的UnityWebRequst下载AssetBundle
IEnumerator WebLaod() {
UnityWebRequest request = UnityWebRequest.GetAssetBundle("http://192.0.0.1/cube.unity3d");
yield return request.Send();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
GameObject go = ab.LoadAsset("Cube") as GameObject;
Instantiate(go);
}