Unity5.1.1 AssetBundle的相关理解

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的一些理解。有错误的话,希望指出。让我们一起改正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值