public static BuildAssetBundleSetting Parse(string content) { BuildAssetBundleSetting ret = new BuildAssetBundleSetting(); XmlDocument doc = new XmlDocument(); doc.LoadXml(content); XmlNodeList xmlBundles = doc.DocumentElement.SelectNodes("/xml/bundles/bundle"); foreach (XmlNode xmlBundle in xmlBundles) { BundleSetting bs = new BundleSetting(); bs.name = xmlBundle.Attributes.GetNamedItem("name").Value; bs.src = xmlBundle.Attributes.GetNamedItem("src").Value; bs.subfixs = ParseSubfixStr(xmlBundle.Attributes.GetNamedItem("subfix").Value); bs.platforms = ParsePlatformStr(xmlBundle.Attributes.GetNamedItem("platform").Value); { var nodes = xmlBundle.SelectNodes("includes/elem"); foreach (XmlNode elem in nodes) { PathSetting ps = new PathSetting(); ps.val = Path.Combine(bs.src, elem.InnerText).Replace("\\", "/"); ps.platforms = ParsePlatformStr(elem.Attributes.GetNamedItem("platform").Value); bs.includes.Add(ps.val, ps); } } { var nodes = xmlBundle.SelectNodes("excludes/elem"); foreach (XmlNode elem in nodes) { PathSetting ps = new PathSetting(); ps.val = Path.Combine(bs.src, elem.InnerText).Replace("\\", "/"); ps.platforms = ParsePlatformStr(elem.Attributes.GetNamedItem("platform").Value); bs.excludes.Add(ps.val, ps); } } Debug.Assert(!ret.bundleSettingMap.ContainsKey(bs.name)); ret.bundleSettingMap.Add(bs.name, bs); } return(ret); }
public static void BuildWin() { string outDir = Path.Combine(Application.streamingAssetsPath, AssetBundleHelp.Abs_Out_Dir); BuildAssetBundleOptions buildOpt = BuildAssetBundleOptions.None; BuildTarget buildTarget = BuildTarget.StandaloneWindows; List <AssetBundleBuild> buildList = new List <AssetBundleBuild>(); string dataPathParentDir = Path.GetDirectoryName(Application.dataPath); BuildAssetBundleSetting babs = BuildAssetBundleSetting.ParseFile(BuildAssetBundleSetting.GetDefaultSettingFilePath()); foreach (var setting in babs.bundleSettingMap.Values) { HashSet <string> assetNames = new HashSet <string>(); { string absAssetDir = Path.Combine(Application.dataPath, setting.src); foreach (string fileFormat in setting.subfixs) { var resFiles = Directory.GetFiles(absAssetDir, fileFormat, SearchOption.AllDirectories); foreach (var elem in resFiles) { string assetPath = ExtractRelativePath(elem, dataPathParentDir); bool needPck = true; if (setting.excludes.TryGetValue(assetPath, out BuildAssetBundleSetting.PathSetting ps)) { if (BuildAssetBundleSetting.IsPlatformMatch(ps.platforms)) { needPck = false; } } if (needPck) { assetNames.Add(assetPath); } } } } { foreach (var ps in setting.includes.Values) { if (BuildAssetBundleSetting.IsPlatformMatch(ps.platforms)) { assetNames.Add(ps.val); } } } AssetBundleBuild abd = new AssetBundleBuild(); abd.assetBundleName = setting.name; abd.assetNames = new List <string>(assetNames).ToArray(); if (abd.assetNames.Length > 0) { buildList.Add(abd); } } Directory.CreateDirectory(outDir); AssetBundleManifest buildRet = BuildPipeline.BuildAssetBundles(outDir, buildList.ToArray(), buildOpt, buildTarget); { Dictionary <string, AssetBundleMetaData> metaDatas = new Dictionary <string, AssetBundleMetaData>(); var allBundles = buildRet.GetAllAssetBundles(); foreach (var elem in allBundles) { var abDp = buildRet.GetAllDependencies(elem); var abDdp = buildRet.GetDirectDependencies(elem); var abHash = buildRet.GetAssetBundleHash(elem); var xx = abHash; var metaData = new AssetBundleMetaData(); metaData.bundleName = elem; metaData.hash = abHash.ToString(); metaData.directDependencies = new List <string>(abDp); foreach (var buildInfo in buildList) { if (buildInfo.assetBundleName == elem) { metaData.assetNames = new List <string>(buildInfo.assetNames); break; } } metaDatas.Add(metaData.bundleName, metaData); } foreach (var kv in metaDatas) { HashSet <string> dependencies = new HashSet <string>(); Stack <string> waitCheckDp = new Stack <string>(kv.Value.directDependencies); while (waitCheckDp.Count > 0) { string dp = waitCheckDp.Pop(); if (!dependencies.Contains(dp)) { dependencies.Add(dp); if (metaDatas.TryGetValue(dp, out AssetBundleMetaData dbMetaData)) { foreach (var relateDp in dbMetaData.directDependencies) { if (!dependencies.Contains(relateDp)) { waitCheckDp.Push(relateDp); } } } } } dependencies.Remove(kv.Key); kv.Value.dependencies = new List <string>(dependencies); } // var jsonStr = JsonConvert.SerializeObject(new AssetBundleMetaDataMap() { datas = metaDatas }, Formatting.Indented); var jsonStr = JsonConvert.SerializeObject(metaDatas, Newtonsoft.Json.Formatting.Indented); // jsonStr = jsonStr + jsonStr; File.WriteAllText(Path.Combine(outDir, AssetBundleHelp.Asset_Bundle_Meta_Data_Name), jsonStr); } }