前段时间说了AssetBundle打包,先设置AssetLabels,再执行打包,但是这样有个弊端就是所有设置了AssetLabels的资源都会打包,这次说说不设置AssetLabels,该如何打包A
Posted 飞天艾特小猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前段时间说了AssetBundle打包,先设置AssetLabels,再执行打包,但是这样有个弊端就是所有设置了AssetLabels的资源都会打包,这次说说不设置AssetLabels,该如何打包A相关的知识,希望对你有一定的参考价值。
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
以上是关于前段时间说了AssetBundle打包,先设置AssetLabels,再执行打包,但是这样有个弊端就是所有设置了AssetLabels的资源都会打包,这次说说不设置AssetLabels,该如何打包A的主要内容,如果未能解决你的问题,请参考以下文章