public void AddDependency(AssetMap asset) { if (dependencys == null) { dependencys = new List <AssetMap>(); } dependencys.Add(asset); }
public void AddReference(AssetMap asset) { if (references == null) { references = new List <AssetMap>(); } references.Add(asset); }
//设置依赖文件的Assetbundle分配 // 1.生成引用与依赖的映射关系 // 2.查找打包规则中的最小Order进行设置 private void checkDependency(Dictionary <string, AssetMap> files) { //设置依赖文件的Assetbundle名称 foreach (AssetMap asset in files.Values) { if (!asset.IsBinding) { continue; //过滤非显示bundle rule下的资源 } List <AssetMap> dependencys = asset.Dependencys; if (dependencys == null) { continue; } for (int j = 0; j < dependencys.Count; j++) { AssetImporter importer = AssetImporter.GetAtPath(dependencys[j].AssetPath); if (!string.IsNullOrEmpty(importer.assetBundleName)) { continue; //已经被设置 } AssetMap depAsset = dependencys[j]; //查询引用文件中最小的Order,使用最小Order的Assetbundle名称 AssetBuildRule depAssetRule = findRuleByOrder(depAsset.References, depAsset.Rule); if (depAssetRule == null || depAssetRule.BuildType == (int)BundleBuildType.Ignore) { continue; } // Builder.AddBuildLog(string.Format("set dep assetbundle name , path {0} : {1}", depAsset.AssetPath, depAssetRule.AssetBundleName)); BuildUtil.SetAssetbundleName(importer, depAssetRule); } } }
/// <summary> /// 设置资源的AB名称 /// </summary> private void SetAbName() { string savePath = BuilderPreference.BUILD_PATH + "/tempsizefile.txt"; if (File.Exists(savePath)) { File.Delete(savePath); } AssetDatabase.Refresh(); // 设置ab名 AssetBuildRule[] rules = AssetBuildRuleManager.Instance.Rules; Builder.AddBuildLog("<Assetbundle Building> Start set AssetBundleName..."); Dictionary <string, List <AssetBuildRule> > path2ruleMap = new Dictionary <string, List <AssetBuildRule> >(); for (int i = 0; i < rules.Length; i++) { List <AssetBuildRule> ruleList = rules[i].TreeToList(); for (int j = 0; j < ruleList.Count; j++) { AssetBuildRule rule = ruleList[j]; List <AssetBuildRule> pathRules = null; if (!path2ruleMap.TryGetValue(rule.Path, out pathRules)) { pathRules = new List <AssetBuildRule>(); path2ruleMap[rule.Path] = pathRules; } pathRules.Add(rule); } } //获取根目录下的所有文件 List <string> files = new List <string>(); for (int i = 0; i < rules.Length; i++) { List <string> rootFiles = BuildUtil.SearchFiles(rules[i], path2ruleMap); if (rootFiles != null) { files.AddRange(rootFiles); } } Builder.AssetMaps = new Dictionary <string, AssetMap>(); Dictionary <string, AssetMap> assetMaps = Builder.AssetMaps; //构建映射关系 for (int i = 0; i < files.Count; i++) { AssetMap fileAssetMap = null; FileType fileType = BuildUtil.GetFileType(new FileInfo(files[i])); if (!assetMaps.TryGetValue(files[i], out fileAssetMap)) { AssetBuildRule rule = findRuleByPath(files[i], path2ruleMap, fileType); if (rule == null) { Debug.LogError("Cant find bundle rule!" + files[i]); } fileAssetMap = new AssetMap(files[i], rule); assetMaps[files[i]] = fileAssetMap; } fileAssetMap.IsBinding = true; //显示设置bundle规则的文件 //被忽略的规则不查找依赖 if (fileAssetMap.Rule.BuildType == (int)BundleBuildType.Ignore) { continue; } string[] dependency = AssetDatabase.GetDependencies(files[i]); for (int j = 0; j < dependency.Length; j++) { string relativePath = BuildUtil.Replace(dependency[j]); string extension = Path.GetExtension(dependency[j]); if (BuilderPreference.ExcludeFiles.Contains(extension) || relativePath.Equals(files[i])) { continue; } AssetMap assetMap = null; FileType depFileType = BuildUtil.GetFileType(new FileInfo(relativePath)); if (!assetMaps.TryGetValue(relativePath, out assetMap)) { AssetBuildRule rule = findRuleByPath(relativePath, path2ruleMap, depFileType); rule = rule == null ? fileAssetMap.Rule : rule; assetMap = new AssetMap(relativePath, rule); assetMaps[relativePath] = assetMap; } assetMap.AddReference(fileAssetMap); fileAssetMap.AddDependency(assetMap); } } //根据明确的子目录设置AB名,即定义了指定的打包规则的目录 foreach (AssetMap asset in assetMaps.Values) { if (asset.Rule.BuildType == (int)BundleBuildType.Ignore || !asset.IsBinding) { continue; } // Builder.AddBuildLog(string.Format("set assetbundle name , path {0} : {1}", asset.AssetPath, asset.Rule.AssetBundleName)); BuildUtil.SetAssetbundleName(asset.AssetPath, asset.Rule); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Builder.AddBuildLog("<Assetbundle Building> set assetbundle name ... end"); //设置依赖文件的Assetbundle分配 this.checkDependency(assetMaps); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Builder.AddBuildLog("<Assetbundle Building> Check Dependency... end"); }