今天简单了解了一下AssetBundle的打包加载,简单写一下,加深印象共同学习。有不妥的地方希望大家指正。叙述一下简单的思路。

第一先清除一下工程中的AssetBundleName,避免出现多打包或者重名的情况出现。ps:ClearAssetName()函数

第二通过使用尾递归为需要打包的资源通过以各个文件夹名字进行命名,一则通过文件夹命名打包可以将资源合理规划,防止出现只有一个包或者每个资源都打一个包出现资源浪费。

将需要打包的资源放在Resources文件里,里边可以将不同的资源分别归类方便打包。具体的分类思路放在最后。

第三进行打包。

第四加载。

ps:该脚本放在Editor下,不用继承MonoBehaviour 

 private static string resName = Application.dataPath + “/Resources”;  //设置需要打包的资源路径 
    private static string outPath = Application.dataPath + “/Package”;    //打包输出路径
    [MenuItem(“/TOOls/BuildAssetBundles”)]    //这个API 可以让TOOls/BuildAssetBundles在unity菜单栏中实现
    public static void BuildFunc()
    {
        //Directory.Delete(outPath, true);
        ClearAssetName();  //清除assetBundleName
        SetName(resName); //通过文件夹命名
     
        if (!Directory.Exists(outPath))  //判定输出是否存在 如果不存在就创建
        {
            Directory.CreateDirectory(outPath);
        }
        BuildPipeline.BuildAssetBundles(outPath,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);     / /打包
        AssetDatabase.Refresh();  //刷新
    }
 
    static void ClearAssetName()  //清除名字  这里主要用到两个
    {
        string[] name = AssetDatabase.GetAllAssetBundleNames();   //获得所有的AssetBundleName 返回一个string数组
        for (int i = 0; i < name.Length; i++)
        {
            AssetDatabase.RemoveAssetBundleName(name[i],true);  //循环删除
        }
    }
 
    static void SetName(string path)   //设置AssetBundleName
    {
        DirectoryInfo dir = new DirectoryInfo(path);  //获取资源文件夹路径 到resources文件夹
        FileSystemInfo[] file = dir.GetFileSystemInfos();  //获取该文件夹中的所有文件
        for (int i = 0; i < file.Length; i++)
        {
            if (file[i] is DirectoryInfo)  //如果查找是文件夹,尾递归继续查找资源
            {
                SetName(file[i].FullName);   
            }
            else
            {
                //通过文件名命名  并且判断是不是meat文件
                if (!file[i].Name.EndsWith(“.meta”))
                {
                    //开始命名
                    Func(file[i].FullName);
                }
            }
        }
    }
 
    static void Func(string fileName)   //主要就是截取一下字符串命名
    {
        //文件路径 ==》E:\个人\个人工程\Unity2017\AssetBundleProject\BundleProject\Assets\Resources\Mat\black.mat
        string sources = fileName;
        Debug.Log(“文件路径==》”+sources);
        string assetpath =”Assets” +sources.Substring(Application.dataPath.Length);    //截取到/Resources文件这
      //Assets\Resources\Mat\black.mat
        string assetpath2 = sources.Substring(Application.dataPath.Length+1);
       //通过截取文件夹名称命名
        string name = assetpath2.Substring(assetpath2.IndexOf(‘\\’)+1, assetpath2.LastIndexOf(‘\\’) – assetpath2.IndexOf(‘\\’)-1);
        AssetImporter assetim = AssetImporter.GetAtPath(assetpath);  //通过资源路径获取该资源 
       assetim.assetBundleName= name;       //设置AssetBundleName
    }
}
 
 
下边开始加载
  void Start ()
    {
       GameObject go= load();  //调用加载方法
       go.transform.position=Vector3.one;   
       
    }
 
    static GameObject load()
    {
        AssetBundle asset = AssetBundle.LoadFromFile(Application.dataPath + “/Package/Package”);  //获取总包
        AssetBundleManifest assetmanifest = asset.LoadAsset<AssetBundleManifest>(“AssetBundleManifest”);  //加载总的依赖关系
        string[] depen = assetmanifest.GetAllDependencies(“newfolder”);   //将需要加载资源的依赖关系都加载出来 存在数组中
        foreach (var item in depen)
        {
            AssetBundle.LoadFromFile(Application.dataPath + “/Package/” +item);   //遍历加载
        }
        AssetBundle ab = AssetBundle.LoadFromFile(Application.dataPath +”/Package/” + “newfolder”); 
        GameObject cube = ab.LoadAsset<GameObject>(“Cube”);  //加载资源
       GameObject go= Instantiate(cube);  //实例化
        return go;
    }
 
 
 
 

版权声明:本文为liziyang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liziyang/p/9383572.html