• 前段时间说了AssetBundle打包,先设置AssetLabels,再执行打包,但是这样有个弊端就是所有设置了AssetLabels的资源都会打包,这次说说不设置AssetLabels,该如何打包AssetBundle


     BuildPipeline.BuildAssetBundles() 这个函数,有多个重载,一个不用AssetBundleBuild数组,一个需要,如果设置了AssetLabels,那么这时候是不需要的,如果没有设置,那么我们就可以打包自定义项,

     AssetBundleBuild assetBundleBuild = new AssetBundleBuild();  我们可以new 出来一个 AssetBundleBuild  ,在这里指定他的  assetBundleName  和  assetBundleVariant  ,也就是前面提到的AssetLabels,

    同时还要指出此资源所在地址     assetBundleBuild.assetNames = new string[] { path };  并将所有的 AssetBundleBuild  做为数组返回,填入 BuildPipeline.BuildAssetBundles() 所需要的参数中;

    详见代码

     static List<AssetBundleBuild> listassets = new List<AssetBundleBuild>();  //第二种打包方式用
        static List<DirectoryInfo> listfileinfo = new List<DirectoryInfo>();
        static bool isover = false; //是否检查完成,可以打包
    
        public static bool GetState()
        {
            return isover;
        }
    
        public static AssetBundleBuild[] GetAssetBundleBuilds()
        {
            return listassets.ToArray();
        }
    
        public static void   SetAssetBundleBuilds()
        {
            UnityEngine.Object obj = Selection.activeObject;    //选中的物体
            string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹  //目录结构  Assets/Resources 没有Application.datapath
            SearchFileAssetBundleBuild(path);
        }
    
        public static void SearchFileAssetBundleBuild(string path)   //是文件,继续向下
        {
            DirectoryInfo directory = new DirectoryInfo(@path);
            FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();
            listfileinfo.Clear();
            foreach (var item in fileSystemInfos)
            {
                int idx = item.ToString().LastIndexOf(@"");
                string name = item.ToString().Substring(idx + 1);
                if ((item as DirectoryInfo) != null)
                    listfileinfo.Add(item as DirectoryInfo);
                if (!name.Contains(".meta"))
                {
                    CheckFileOrDirectoryReturnBundleName(item, path + "/" + name);
                }
            }
            if (listfileinfo.Count == 0)
                isover = true;
            else
            {
                Debug.LogError(listfileinfo.Count);
            }
        }
    
    
        public static string CheckFileOrDirectoryReturnBundleName(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
        {
            FileInfo fileInfo = fileSystemInfo as FileInfo;
            if (fileInfo != null)
            {
                string[] strs = path.Split('.');
                string[] dictors = strs[0].Split('/');
                string name = "";
                for (int i = 1; i < dictors.Length; i++)
                {
                    if (i < dictors.Length - 1)
                    {
                        name += dictors[i] + "/";
                    }
                    else
                    {
                        name += dictors[i];
                    }
                }
                AssetBundleBuild assetBundleBuild = new AssetBundleBuild();
                assetBundleBuild.assetBundleName = name;
                assetBundleBuild.assetBundleVariant = "bytes";
                assetBundleBuild.assetNames = new string[] { path };
                listassets.Add(assetBundleBuild);
                return name;
            }
            else
            {
                SearchFileAssetBundleBuild(path);
                return null;
            }
        }

    然后在这里调用

    注意,因为文件夹下还可能有文件夹,我们要等所有资源遍历完成,再打包,所以用了一个死循环

     [MenuItem("Tools/打包选中文件夹下所有项目")]
        public static void BundSelectionAssets()
        {
            BuilderAssetsBunlds.SetAssetBundleBuilds();
            while (true)
            {
                if (BuilderAssetsBunlds.GetState())
                    break;
                else
                    Debug.LogError("等待.....");
            }
            BuildPipeline.BuildAssetBundles(BuilderAssetsBunlds.GetOutAssetsDirecotion(), BuilderAssetsBunlds.GetAssetBundleBuilds(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    
        }

    好了,今天就到这里,加上前面的,所有的都在这里

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    using System.IO;
    using System.Text;
    using System;
    using System.Security.Cryptography;
    
    public class BuilderAssetsBunlds
    {
        public static string GetOutAssetsDirecotion() //打包输出地址,后续会再完善
        {
            string assetBundleDirectory = Application.streamingAssetsPath;
            if (!Directory.Exists(assetBundleDirectory))
            {
                Directory.CreateDirectory(assetBundleDirectory);
            }
            return assetBundleDirectory;
        }
    
    
        /// <summary>
        /// 检查目标文件下的文件系统
        /// </summary>
        public static void CheckFileSystemInfo()  //检查目标目录下的文件系统
        {
            AssetDatabase.RemoveUnusedAssetBundleNames(); //移除没有用的assetbundlename
            UnityEngine.Object obj = Selection.activeObject;    //选中的物体
            string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹  //目录结构  Assets/Resources 没有Application.datapath 
            CoutineCheck(path);
        }
    
        public static void CheckFileOrDirectory(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
        {
            FileInfo fileInfo = fileSystemInfo as FileInfo;
            if (fileInfo != null)
            {
                SetBundleName(path);
            }
            else
            {
                CoutineCheck(path);
            }
        }
    
        public static void CoutineCheck(string path)   //是文件,继续向下
        {
            DirectoryInfo directory = new DirectoryInfo(@path);
            FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();
    
            foreach (var item in fileSystemInfos)
            {
                // Debug.Log(item);
                int idx = item.ToString().LastIndexOf(@"");
                string name = item.ToString().Substring(idx + 1);
    
                if (!name.Contains(".meta"))
                {
                    CheckFileOrDirectory(item, path + "/" + name);  //item  文件系统,加相对路径
                }
            }
        }
    
        public static void SetBundleName(string path)  //设置assetbundle名字
        {
            //  Debug.LogError(path);
            var importer = AssetImporter.GetAtPath(path);
            string[] strs = path.Split('.');
            string[] dictors = strs[0].Split('/');
            string name = "";
            for (int i = 1; i < dictors.Length; i++)
            {
                if (i < dictors.Length - 1)
                {
                    name += dictors[i] + "/";
                }
                else
                {
                    name += dictors[i];
                }
            }
            if (importer != null)
            {
                importer.assetBundleName = name;
                importer.assetBundleVariant = "bytes";
                // importer.assetBundleName = GetGUID(path);   //两种设置方式
            }
            else
                Debug.Log("importer是空的");
        }
    
        public static string GetGUID(string path)
        {
            return AssetDatabase.AssetPathToGUID(path);
        }
    
        //*****************配置文件设置***********************////////////
    
        static Dictionary<string, string> dicversoion = new Dictionary<string, string>(); //版本
        static Dictionary<string, string> dicurl = new Dictionary<string, string>();      //下载地址
    
    
    
        public static string GetAssetBundleStringPath()  //得到存放打包资源的文件路径
        {
            string path = Application.streamingAssetsPath;
            //Debug.Log(path);
            string[] strs = path.Split('/');
            int idx = 0;
            for (int i = 0; i < strs.Length; i++)
            {
                if (strs[i] == "Assets")
                    idx = i;
            }
            // Debug.Log(idx);
            //path = strs[strs.Length - 2] + "/" + strs[strs.Length - 1];
            string str = "";
            for (int i = idx; i < strs.Length; i++)
            {
                if (i != strs.Length - 1)
                    str += strs[i] + "/";
                else if (i == strs.Length - 1)
                    str += strs[i];
                //Debug.Log(i);
            }
            path = str;
            return path;
            //Debug.Log(path);
        }
    
        public static void CheckAssetBundleDir(string path)   //是文件,继续向下
        {
            DirectoryInfo directory = new DirectoryInfo(@path);
            FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();
    
            foreach (var item in fileSystemInfos)
            {
                // Debug.Log(item);
                int idx = item.ToString().LastIndexOf(@"");
                string name = item.ToString().Substring(idx + 1);
    
                if (!name.Contains(".meta"))
                {
                    CheckAssetBundleFileOrDirectory(item, path + "/" + name);  //item  文件系统,加相对路径
                }
            }
        }
    
        public static void CheckAssetBundleFileOrDirectory(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
        {
            FileInfo fileInfo = fileSystemInfo as FileInfo;
            if (fileInfo != null)
            {
                Debug.Log("不为空,MD5值==>" + GetMD5(path));
                // string guid = AssetDatabase.AssetPathToGUID(path);
                // Debug.Log("不为空,文件名字是==>>"+guid);
                Addconfigdic(fileInfo.Name, GetMD5(path));
            }
            else
            {
                CheckAssetBundleDir(path);
            }
        }
    
        public static string GetMD5(string path)
        {
            FileStream fs = new FileStream(path, FileMode.Open);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] retVal = md5.ComputeHash(fs);
            fs.Close();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < retVal.Length; i++)
            {
                sb.Append(retVal[i].ToString("x2"));
            }
            return sb.ToString();
        }
    
        public static void Addconfigdic(string name, string verMd5)
        {
            dicversoion.Add(name, verMd5);
        }
    
        public static void CreateConfigFile(string path) //创建配置文件
        {
    
        }
        // -------------------------------我是分割线------------------------------------
        //   割.............................
        static List<AssetBundleBuild> listassets = new List<AssetBundleBuild>();  //第二种打包方式用
        static List<DirectoryInfo> listfileinfo = new List<DirectoryInfo>();
        static bool isover = false; //是否检查完成,可以打包
    
        public static bool GetState()
        {
            return isover;
        }
    
        public static AssetBundleBuild[] GetAssetBundleBuilds()
        {
            return listassets.ToArray();
        }
    
        public static void   SetAssetBundleBuilds()
        {
            UnityEngine.Object obj = Selection.activeObject;    //选中的物体
            string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹  //目录结构  Assets/Resources 没有Application.datapath
            SearchFileAssetBundleBuild(path);
        }
    
        public static void SearchFileAssetBundleBuild(string path)   //是文件,继续向下
        {
            DirectoryInfo directory = new DirectoryInfo(@path);
            FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();
            listfileinfo.Clear();
            foreach (var item in fileSystemInfos)
            {
                int idx = item.ToString().LastIndexOf(@"");
                string name = item.ToString().Substring(idx + 1);
                if ((item as DirectoryInfo) != null)
                    listfileinfo.Add(item as DirectoryInfo);
                if (!name.Contains(".meta"))
                {
                    CheckFileOrDirectoryReturnBundleName(item, path + "/" + name);
                }
            }
            if (listfileinfo.Count == 0)
                isover = true;
            else
            {
                Debug.LogError(listfileinfo.Count);
            }
        }
    
    
        public static string CheckFileOrDirectoryReturnBundleName(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
        {
            FileInfo fileInfo = fileSystemInfo as FileInfo;
            if (fileInfo != null)
            {
                string[] strs = path.Split('.');
                string[] dictors = strs[0].Split('/');
                string name = "";
                for (int i = 1; i < dictors.Length; i++)
                {
                    if (i < dictors.Length - 1)
                    {
                        name += dictors[i] + "/";
                    }
                    else
                    {
                        name += dictors[i];
                    }
                }
                AssetBundleBuild assetBundleBuild = new AssetBundleBuild();
                assetBundleBuild.assetBundleName = name;
                assetBundleBuild.assetBundleVariant = "bytes";
                assetBundleBuild.assetNames = new string[] { path };
                listassets.Add(assetBundleBuild);
                return name;
            }
            else
            {
                SearchFileAssetBundleBuild(path);
                return null;
            }
        }
    
    
    }
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    
    public class Constant
    {
        public static string SD_DIR = "SD_DIR";
    }
    public class BundleSystem
    {
        //打包、、、、、、、、、、、、、、、、、、、、、、
        [MenuItem("Tools/打包所有设置AssetLable项目")]
        public static void BundlerAssets()
        {
            // Debug.LogError("打包Assets");
            BuildPipeline.BuildAssetBundles(BuilderAssetsBunlds.GetOutAssetsDirecotion(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
        }
    
        [MenuItem("Tools/打包选中文件夹下所有项目")]
        public static void BundSelectionAssets()
        {
            BuilderAssetsBunlds.SetAssetBundleBuilds();
            while (true)
            {
                if (BuilderAssetsBunlds.GetState())
                    break;
                else
                    Debug.LogError("等待.....");
            }
            BuildPipeline.BuildAssetBundles(BuilderAssetsBunlds.GetOutAssetsDirecotion(), BuilderAssetsBunlds.GetAssetBundleBuilds(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    
        }
    
    
        [MenuItem("Tools/设置Assetbundle名字")]
        public static void SetAssetBundellabls()
        {
            BuilderAssetsBunlds.CheckFileSystemInfo();
        }
    
        [MenuItem("Tools/设置配置文件")]
        public static void SetAssetConfig()
        {
            BuilderAssetsBunlds.CheckAssetBundleDir(BuilderAssetsBunlds.GetAssetBundleStringPath());
        }
    
        [MenuItem("Tools/测试")]
        static void PackAsset()
        {
            Debug.Log("Make AssetsBundle");
            //  
            List<AssetBundleBuild> builds = new List<AssetBundleBuild>();
            AssetBundleBuild build = new AssetBundleBuild();
    
            build.assetBundleName = "first";
            build.assetBundleVariant = "u3";
            // build.assetNames[0] = "Assets/Resources/mascot.prefab";  
            build.assetNames = new string[] { "Assets/PNG/结算副本.png" };
            builds.Add(build);
            // 第一个参数为打包文件的输出路径,第二个参数为打包资源的列表,第三个参数为打包需要的操作,第四个为打包的输出的环境  
            //BuildPipeline.BuildAssetBundles(@"Assets/Bundle", builds.ToArray(),
            //    BuildAssetBundleOptions.None, BuildTarget.Android);
            BuildPipeline.BuildAssetBundles(@"Assets/Bundle", builds.ToArray(), BuildAssetBundleOptions.None, BuildTarget.Android);
            Debug.Log("11111" + builds.ToArray() + "222222");
        }
    }

     上篇传送门

    http://www.cnblogs.com/lzy575566/p/7714510.html

  • 相关阅读:
    [职场]最近聊到30岁以上的程序员,该何去何从了?你有啥想法?
    想跳槽涨薪,想进大厂,如何准备面试呢?
    [面试分享]想跳槽涨薪,想进大厂,如何准备面试呢?
    缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题...
    8天玩转并行开发——第八天 用VS性能向导解剖你的程序
    8天入门wpf—— 第一天 基础概念介绍
    8天玩转并行开发——第六天 异步编程模型
    8天入门wpf—— 第八天 最后的补充
    6天通吃树结构—— 第二天 平衡二叉树
    8天入门wpf—— 第七天 画刷
  • 原文地址:https://www.cnblogs.com/lzy575566/p/7895291.html
Copyright © 2020-2023  润新知