关于assetbundle

来源:互联网 发布:淘宝商家的客服电话 编辑:程序博客网 时间:2024/06/06 00:53

http://blog.csdn.net/qq_18995513/article/details/51955609 这个链接是assetdatabase的链接。仅仅用于编辑器。配合着assetbundle使用 


没有接触过assetbundle的人来说是比较困难的。首先是打包。(注意批量在右下角bundlename赋值,否则将不会打包,)。   注意依赖项不用给名字他会自动打包进prefab。后面代码可以做参考,格外注意5.3的加载只需要加载prefab,依赖项自动加载不需要再给bundlename,否则反而会丢失材质。


在Editor下脚本如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEditor;


public class BuildBundle {
    /// <summary>
    /// 根据当前buildSetting的平台进行不同平台的assetbundle打包
    /// </summary>
    [MenuItem("BuildBundle/Build Asset Bundles")]
    static void BuildAssetBundle()
    {
        if (!System.IO.Directory.Exists("AssetBundles/" + EditorUserBuildSettings.activeBuildTarget.ToString()))
        {
            System.IO.Directory.CreateDirectory("AssetBundles/" + EditorUserBuildSettings.activeBuildTarget.ToString());
        }
        BuildPipeline.BuildAssetBundles("AssetBundles/" + EditorUserBuildSettings.activeBuildTarget.ToString(), BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
    }
}


    [MenuItem("Assets/Get AssetBundle names")]
    //抓取所有新建的name。无论设置与否。
    static void GetNames()
    {
        var names = AssetDatabase.GetAllAssetBundleNames();
        foreach (var name in names)
            Debug.Log("AssetBundle: " + name);
    }
}



然后是加载:


其中第一个 single加载的没有加载依赖项 

第二种模式加载了依赖项。显示正常

总结: 在实例化之前,一定要把所有的依赖项加载出来,否则出现丢失材质或者贴图或者别的。

对比下new 和loadcace的优劣

(1)前者的优势

  • 后续的Load操作在内存中进行,相比后者的IO操作开销更小;
  • 不形成缓存文件,而后者则需要额外的磁盘空间存放缓存;
  • 能通过WWW.textureWWW.bytesWWW.audioClip等接口直接加载外部资源,而后者只能用于加载AssetBundle

(2)前者的劣势

  • 每次加载都涉及到解压操作,而后者在第二次加载时就省去了解压的开销;
  • 在内存中会有较大的WebStream,而后者在内存中只有通常较小的SerializedFile。(此项为一般情况,但并不绝对,对于序列化信息较多的Prefab,很可能出现SerializedFile比WebStream更大的情况)



using UnityEngine;
using System.Collections;
public enum eMode
{
    Single,
    MainFest,
}
public class LoadAssetBundles : MonoBehaviour
{
    public string url;//单个加载   在面板中设置
    public  string url1 ;//主Mainfest加载。  在面板中已经设置。
    string url_ = "file://D:/allproject/assetbundle01/Assets/TestBundle/";//当前bundle文件夹路径。  注意路径 windows这点比较坑。


    GameObject cube;
    eMode mode = eMode.MainFest;
    // Use this for initialization
    void Start()
    {
        ResourcesLoad("cube");
      


    }


    public  void  ResourcesLoad( string gamename) {
        StartCoroutine(LoadAssetBundle(gamename));
    }


    IEnumerator LoadAssetBundle(string objName )
    {
        Debug.Log(mode);
        if (mode == eMode.Single) //单个加载。会丢失材质。 需要在克隆之前load下依赖项(不用克隆出来)。
        {
            WWW www = new WWW(url);
            yield return www;
            if (www.error != null)
            {
                Debug.Log("www is wrong");
            }
            else
            {


                AssetBundle assetbundle = www.assetBundle;
                cube = Instantiate(assetbundle.LoadAsset(objName)) as GameObject;
                assetbundle.Unload(false);
                www.Dispose();
            }
        }
        else
        {
            WWW mwww = WWW.LoadFromCacheOrDownload(url1, 0); //加载Bundle文件并获取WWW对象,同时将解压形式的Bundle内容存入磁盘中作为缓存(如果该Bundle已在缓存中,则省去这一步)
            yield return mwww;
            if (!string.IsNullOrEmpty(mwww.error))
            {
                Debug.Log(mwww.error);
            }
            else
            {
                AssetBundle mab = mwww.assetBundle;  //获取bundle对象
                AssetBundleManifest mainfest = (AssetBundleManifest)mab.LoadAsset("AssetBundleManifest");// 抓到主Mainfest,固定写法。
                mab.Unload(false);
                string[] dps = mainfest.GetAllDependencies(objName); 
                AssetBundle[] abs = new AssetBundle[dps.Length];
                Debug.Log(dps.Length);
                for (int i = 0; i < dps.Length; i++)
                {
                    string dUrl = "file://D:/allproject/assetbundle01/Assets/TestBundle/" + dps[i];
                    WWW dwww = WWW.LoadFromCacheOrDownload(dUrl, mainfest.GetAssetBundleHash(dps[i]));
                    yield return dwww;
                    abs[i] = dwww.assetBundle; //在实例化前获取所有bundle。
                    Debug.Log(dps[i]);
                    dwww.Dispose();
                    dwww = null;
                }


                WWW www = WWW.LoadFromCacheOrDownload(url,  0);
                yield return www;
                if (!string.IsNullOrEmpty(www.error))
                {
                    Debug.Log(www.error);
                }
                else
                {
                    AssetBundle ab = www.assetBundle;
                    GameObject gobj = ab.LoadAsset(objName) as GameObject; // 真正加载资源。
                    if (gobj != null)
                        Instantiate(gobj);
                    ab.Unload(false);
                }
                foreach (AssetBundle ab in abs)
                {
                    ab.Unload(false); // 删除ab但是不是删除相关资源给false。
                } 
                www.Dispose();
                www = null;
            }
            mwww.Dispose();
            mwww = null;
           


        }




        yield return null;
    }


}

0 0
原创粉丝点击