private static void SetDepBundleName(List <string> deps, string bundleName, BuildBundleCollection collection) { Dictionary <string, int> originals = new Dictionary <string, int>(); for (int i = 0; i < deps.Count; i++) { string depBundleName = ""; if (!depBundleCaches.TryGetValue(deps[i], out depBundleName)) { depBundleCaches.Add(deps[i], bundleName); continue; } else if (bundleName == depBundleName) { continue; } int index; if (!originals.TryGetValue(deps[i], out index)) { index = originals.Count; originals.Add(deps[i], index); } string sharedName = bundleName + "_shared_" + index; // 相同索引的存到一个包里 depBundleCaches[deps[i]] = sharedName; collection.bundleNames.Add(sharedName.ToLower()); } }
private static string TryParseBundleName(string main, BuildBundleCollection collection) { string bundleName = ""; if (collection.config.buildType == ENBuildType.AllInOne) { // 直接使用指定包名 bundleName = collection.config.bundleName; } else if (collection.config.buildType == ENBuildType.ByFolder) { // 获取文件夹名 string folderName = Path.GetDirectoryName(main); if (collection.originalPaths.Contains(folderName) || collection.originalPaths.Contains(main)) { folderName = Path.ChangeExtension(main, null); } bundleName = folderName.Replace("Assets/", ""); } else if (collection.config.buildType == ENBuildType.ByGroups) { } else if (collection.config.buildType == ENBuildType.OneByOne) { bundleName = Path.ChangeExtension(main, null).Replace("Assets/", null); } collection.bundleNames.Add(bundleName); return(bundleName); }
private static void SetAllBundleNames() { collections = new List <BuildBundleCollection>(); foreach (AssetBundleConfigItem config in BuildConfig.bundles) { BuildBundleCollection c = new BuildBundleCollection(); c.config = config; collections.Add(c); } // original path // 外层资源的路径 foreach (BuildBundleCollection c in collections) { c.originalPaths = c.config.GetOriginalPaths(); } // main path // 具体资源路径 foreach (BuildBundleCollection c in collections) { c.mainPaths = c.config.GetMainPaths(); } // 通过具体资源路径,先设置包名,后处理依赖项相关的 foreach (BuildBundleCollection c in collections) { foreach (string main in c.mainPaths) { SetBundleName(main, TryParseBundleName(main, c)); } } // 处理依赖项 depBundleCaches = new Dictionary <string, string>(); // <资源路径,包名> foreach (BuildBundleCollection c in collections) { foreach (string main in c.mainPaths) { List <string> deps = CollectDependenciesPaths(main, c); foreach (string dep in deps) { c.deps.Add(dep); } SetDepBundleName(deps, TryParseBundleName(main, c), c); } } // 设置依赖项的包名 foreach (KeyValuePair <string, string> e in depBundleCaches) { SetBundleName(e.Key, e.Value); } // 清除没用的包名 AssetDatabase.RemoveUnusedAssetBundleNames(); }
private static List <string> CollectDependenciesPaths(string main, BuildBundleCollection collection) { string[] dependencies = AssetDatabase.GetDependencies(main, true); if (dependencies.Length < 1) { // 没依赖项 return(new List <string>()); } List <string> assets = new List <string>(); foreach (string asset in dependencies) { if (main == asset || Path.GetExtension(asset) == ".cs" || Path.GetExtension(asset) == ".dll") { continue; } BuildBundleCollection result = collections.FindLast((c) => { return(c.mainPaths.Contains(asset) || c.deps.Contains(asset)); }); if (null == result || result == collection) { assets.Add(asset); continue; } if (result.config.order < collection.config.order) { continue; } if (result.config.order >= collection.config.order) { throw new System.Exception($"{collection.config.bundleName}不能依赖{result.config.bundleName}!"); } } // assets.Sort((left, right)); return(assets); }