AssetBundle可以对Texture,Scene,Prefab,Script,Material,AudioClip进行打包。文件扩展名通常为Unity3D,或assetbundle。可以用来更新资源,压缩资源。减少所占空间
。
要先对这些资源打包,在打包之前要先设置这些资源的AssetBundleName,可以将这些资源拖成预制体,例如,将Texture,Script,Material等拖到对应的Object上,在拖成预制体,或者你只是想要一个单独的Object,只需将这个Object拖成预制体即可。选中预制体后,可以看到Inspector面板的下方有下拉框,在下拉框里面可以新建AssetBundleName。我新建了一个AssetBundleName 叫prefab,并且选上。这时,我们可以利用BuildPipeline
来进行资源打包。
[MenuItem("My Menu/Create AssetsBundle")]
static void CreateAssetsBundle() {
string url = Application.dataPath + "/assetsbundle";
BuildPipeline.BuildAssetBundles(url,BuildAssetBundleOptions.CollectDependencies,BuildTarget.StandaloneWindows64);
}
打包后在assetsbundle文件下面的文件
,这时在另一个工程里面加载预制体。
void Start (){
string url = "file:///C:/Users/Administrator/Desktop/assetsbundle/prefab";//在桌面新创建的一个<span style="font-family: Arial, Helvetica, sans-serif;">assetsbundle文件夹的目录,因为要加载的是Cube对象,所以我们选择的是assetsbundle文件夹下面的prefab manifest文件</span>
StartCoroutine("LoadData",url);//开启一个协程
}
IEnumerator LoadData(string url) {
WWW www = WWW.LoadFromCacheOrDownload(url,0);//还有一种加载方式: WWW www = new WWW(url);这里使用<span style="font-family: Arial, Helvetica, sans-serif;">LoadFromCacheOrDownload. 数字0为版本号,没当有新的对象改变时,就要改变版本号。</span>
yield return www;
if (www.error == null)
{
AssetBundle ab = www.assetBundle;
Instantiate(ab.LoadAsset("Cube"));//实例化Cube
ab.Unload(false);
}
}
这样就可以将一个cube在另一个工程里面加载出来。同理可以将Scene打包成AssetBundle,这时,你可以加载场景里面的对象。但是,你要是对场景里面的资源对象添加了Material,Texture,AudioClip,这时,你会发现你加载过来的这些东西是没有显示出来的。然而,要解决这些问题,你要知道这些对象的依赖关系。在5.0以后的版本,系统都是自动处理这些依赖关系。只需你将这些要打包的资源对象,给它们一个AssetBundleName就好了。这时将它们打包,你点开Manifest文件你会发现里面有依赖关系的存在。
这个就是系统里面自动写的依赖关系。有了这些依赖关系我们可以把上面提到的Material,Texture,AudioClip,解压后可以实现跟原场景一样的效果。代码如下:
void Start (){
string url = "file:///C:/Users/Administrator/Desktop/assetsbundle/assetsbundle";//最后一个assetsbundle是Manifest文件,里面放了主要的依赖关系。
StartCoroutine("LoadData",url);
}
IEnumerator LoadData(string url) {
WWW www = WWW.LoadFromCacheOrDownload(url,4);//跟前面的解释一样
yield return www;
if (www.error == null)
{
AssetBundle ab = www.assetBundle;
AssetBundleManifest manifest = (AssetBundleManifest)ab.LoadAsset("AssetBundleManifest");//获取assetsbundle依赖关系表
ab.Unload(false);//要是没有再用到www.assetBundle.就将其释放掉
string[] resourName = manifest.GetAllDependencies("scene");//获取AssetBundleName为scene的所有依赖关系
AssetBundle[] assetBundle = new AssetBundle[resourName.Length];//创建一个依赖关系数组。
<pre name="code" class="csharp"><span style="white-space:pre"> </span>//加载所有资源。
for (int i = 0; i < resourName.Length; i++) { WWW rwww = WWW.LoadFromCacheOrDownload("file:///C:/Users/Administrator/Desktop/assetsbundle/" + resourName[i], manifest.GetAssetBundleHash(resourName[i])); yield return rwww; assetBundle[i] = rwww.assetBundle; }
<span style="white-space:pre"> </span>//每次版本打包的时候都会更改其对应(所有包,即场景和文件)Hash值,可通过这个值来判断是否有版本更新。根据Hash值来下载场景
WWW swww = WWW.LoadFromCacheOrDownload("file:///C:/Users/Administrator/Desktop/assetsbundle/" + "scene", manifest.GetAssetBundleHash("scene"));
yield return swww;
Application.LoadLevel("Scene");
}
}
以上便是我对AssetBundle的一些理解。有错误的话,希望指出。让我们一起改正