首页 > 学院 > 开发设计 > 正文

unity5.X AssetBundle

2019-11-06 09:02:49
字体:
来源:转载
供稿:网友
      虽然官方说得很美好,一句BuildPipeline.BuildAssetBundles(outputPath)就可以直接把所有资源都打包了,而需要打包的资源可以在编辑器界面直接输入。但实际上由于上面说到的必须赋予每一个依赖资源assetBundleName,你不可能每一个资源去手动的查找用到的依赖资源再在编辑器输入名字,所以旧版本的打包流程还是要的。首先,你可以遍历需要打包的文件夹,把所有需要打包的预设或者资源都找到,然后设置assetBundleName,然后,通过AssetDatabase.GetDependencies方法逐个找到资源的依赖资源路径,用AssetDatabase.AssetPathToGUID算出每个资源的唯一ID,然后将唯一ID当做assetBundleName赋予给每个依赖资源。最后,调用BuildPipeline.BuildAssetBundles(outputPath)打包到指定位置。最后说说加载。由于依赖关系都存在于manifest中,所以在加载资源之前,要先加载manifest文件。实际上在打包的时候,会有一个总的manifest文件,叫做AssetBundle.manifest,然后每一个小的资源分别有一个自己的manifest文件。在我们加载的时候,需要先把总的AssetBundle加载进来。比如这样:        string mUrl = Cdn + "AssetBundle";        WWW mwww = WWW.LoadFromCacheOrDownload(mUrl, 0);        yield return mwww;        if (!string.IsNullOrEmpty(mwww.error))        {            Debug.Log(mwww.error);        }        else        {            AssetBundle mab = mwww.assetBundle;            AssetBundleManifest mainfest = (AssetBundleManifest)mab.LoadAsset("AssetBundleManifest");            mab.Unload(false);其中Cdn是我的资源路径,加载完之后,得到了一个AssetBundleManifest 对象。然后根据我们需要加载的资源名称,获得所有依赖资源:            string[] dps = mainfest.GetAllDependencies(realName);            AssetBundle[] abs = new AssetBundle[dps.Length];            for (int i = 0; i < dps.Length; i++)            {                string dUrl = Cdn + dps[i];                WWW dwww = WWW.LoadFromCacheOrDownload(dUrl, mainfest.GetAssetBundleHash(dps[i]));                yield return dwww;                abs[i] = dwww.assetBundle;            }其中realName是想加载的AssetBundle的名字,需要带扩展名。通过了这一步,所有的依赖资源都加载完了,可以加载目标资源了: WWW www = WWW.LoadFromCacheOrDownload(url, mainfest.GetAssetBundleHash(realName+".ab"), 0);            yield return www;            if (!string.IsNullOrEmpty(www.error))            {                Debug.Log(www.error);            }            else            {                AssetBundle ab = www.assetBundle;                GameObject gobj = ab.LoadAsset(realName) as GameObject;                if (gobj != null)                    Instantiate(gobj);                ab.Unload(false);            }            foreach (AssetBundle ab in abs)            {                ab.Unload(false);            }到这一步,所有的资源都加载完毕了。注意的是,记得Unload,不然下次就加不进来了。或者不Unload的话,就做一个字典记录所有加载过的AssetBundle,还有它们的引用计数器。那样就可以先判断是否存在在加载。以上就是Unity5.0的AssetBundle的使用方法了。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表