//根据打包后的Manifest刷新XML public void RefreshXMLTableByManifest(AssetBundleManifest manifest) { HashSet <string> bundleHash = new HashSet <string>(); foreach (var t in XMLTable.BundleInfos) { var defaultBundleName = t.GetBundleNameWithLangExtension(eAssetLanguageVarType.Default); var dependences = manifest.GetAllDependencies(defaultBundleName); t.dependenceBundleName = new string[dependences.Length]; for (int i = 0; i < dependences.Length; i++) { t.dependenceBundleName[i] = AssetI8NHelper.GetBundleNameWithOutLangStr(dependences[i]); } var hash = manifest.GetAssetBundleHash(defaultBundleName); if (bundleHash.Contains(hash.ToString())) { //fileHash重名的,打印出来,并且使用bundleName来合并,避免冲突 t.bundleFileName = defaultBundleName + "_" + hash.ToString(); CommonLog.Error(string.Format("卧槽,有bundleFileHash冲突,bundle信息为,bundleName:{0},bundleHash:{1},asset:{2}" , defaultBundleName, hash.ToString(), t.assets[0].resPath)); } else { bundleHash.Add(defaultBundleName); t.bundleFileName = defaultBundleName; } } }
/// <summary> /// 获取BundleName带语言后缀名 /// </summary> /// <param name="lang"></param> /// <returns></returns> public string GetBundleFileNameWithLangExtension(eAssetLanguageVarType lang) { if (hasOtherLanguage) { return(AssetI8NHelper.GetLangBundleStr(bundleFileName, lang) + BundleExtension); } else { return(bundleFileName + BundleExtension); } }
/// <summary> /// 获取BundleName带语言后缀名 /// </summary> /// <param name="lang"></param> /// <returns></returns> public string GetBundleNameWithLangExtension(eAssetLanguageVarType lang) { if (hasOtherLanguage) { return(AssetI8NHelper.GetLangBundleStr(bundleNameMD5Struct.GetMD5Str(!isComplexName), lang)); } else { return(bundleNameMD5Struct.GetMD5Str(!isComplexName)); } }
/// <summary> /// 通过XML生成BuildMap /// </summary> private void CollectABBuildMap() { //收集所有AssetBundle文件夹 var abInfo = new AssetBundleBuild[AssetBundleRawInfoList.Count]; Dictionary <string, List <string> > assetBundleDict = new Dictionary <string, List <string> >(); for (int i = 0; i < abInfo.Length; i++) { var xmlInfo = AssetBundleRawInfoList[i]; if (IsOpenProgressUI) { EditorUtility.DisplayProgressBar("Loading", xmlInfo.assetFullName, (float)i / abInfo.Length); } ////先刷新Import ////修改bundle名 //AssetImporter ai = AssetImporter.GetAtPath(xmlInfo.assetFullName); // //ai.assetBundleName = xmlInfo.bundleName; // //if (xmlInfo.HasOtherLanguage) { ai.assetBundleVariant = AssetI8NHelper.GetLangBundleVariantStr(xmlInfo.Language); } //else //{ // ai.assetBundleVariant = null; //} var info = new AssetBundleBuild(); info.assetBundleName = xmlInfo.bundleMD5Struct.GetMD5Str(!xmlInfo.isComplexName); if (xmlInfo.HasOtherLanguage) { info.assetBundleVariant = AssetI8NHelper.GetLangBundleVariantStr(xmlInfo.Language); } else { info.assetBundleVariant = null; } info.addressableNames = new string[] { xmlInfo.resPath.ToLower() }; info.assetNames = new string[] { xmlInfo.assetFullName }; abInfo[i] = info; } this.BuildMap = abInfo; }
private static List <AssetBundleXMLRawData> RefreshNewNameAndGetAssetBundleList() { List <AssetBundleXMLRawData> list = new List <AssetBundleXMLRawData>(); //非Default的资源 List <AssetBundleXMLRawData> foreignlist = new List <AssetBundleXMLRawData>(); bool checkConfig = AssetBundleBuilderExtSetting.Instance.InitProjectSettingFromFile(); if (!checkConfig) { return(null); } var paths = AssetDatabase.GetAllAssetPaths(); bool isBreak = false; for (int i = 0; i < paths.Length; i++) { var path = paths[i]; if (!path.Contains(".")) { continue; } //不需要打包的文件类型 if (!CheckNeedPackFile(path)) { continue; } if (!path.Contains("/AssetBundles/") && !AssetBundleBuilderExtSetting.Instance.CheckIsInExtFolderAsset(path) && !AssetBundleBuilderExtSetting.Instance.CheckIsSpriteInTagAsset(path)) { continue; } //if (!path.Contains("/AssetBundles/")) continue; //不导文件夹 if (AssetDatabase.IsValidFolder(path)) { continue; } //是否取消打包 isBreak = EditorUtility.DisplayCancelableProgressBar("Loading", path, (float)i / paths.Length); if (isBreak) { CommonLog.Log("终止打包"); return(null); } AssetBundleXMLRawData xmlRawData = new AssetBundleXMLRawData(); var extensionName = Path.GetExtension(path); //path.Remove(0,path.LastIndexOf(".", StringComparison.Ordinal)); var withoutExtensionPath = path.Replace(extensionName, string.Empty); //path.Substring(0, path.LastIndexOf(".", StringComparison.Ordinal)); int abResourceStartIndex = withoutExtensionPath.LastIndexOf("AssetBundles", StringComparison.Ordinal); var resPath = AssetI8NHelper.GetDefaultPathLanguage(abResourceStartIndex >= 0 ? withoutExtensionPath.Substring(abResourceStartIndex) : withoutExtensionPath); //剔除 Assets/ if (resPath.StartsWith("Assets/")) { int startIndex = resPath.IndexOf("/", StringComparison.Ordinal) + 1; resPath = resPath.Substring(startIndex); } var langType = AssetI8NHelper.GetPathLanguage(path); xmlRawData.resPath = resPath; xmlRawData.resPathMD5Struct = MD5Creater.Md5Struct(xmlRawData.resPath); xmlRawData.Language = langType; string fileName = Path.GetFileNameWithoutExtension(resPath); string bundleName = Path.GetDirectoryName(resPath.Substring(0, resPath.LastIndexOf("/", StringComparison.Ordinal))); //设置bundleName,使用时,使用下面的MD5 xmlRawData.bundleName = AssetBundleBuilderExtSetting.Instance.GetGroupMappedBundlePath(xmlRawData.resPath, extensionName); xmlRawData.bundleMD5Struct = MD5Creater.Md5Struct( AssetBundleBuilderExtSetting.Instance.GetGroupMappedBundlePath(xmlRawData.resPath, extensionName)); //fullName带后缀名 //int assetStartIndex = path.IndexOf("Assets", StringComparison.Ordinal); xmlRawData.assetFullName = path; //path.Substring(assetStartIndex); //int resStartIndex = resPath.LastIndexOf("/", StringComparison.Ordinal) + 1; xmlRawData.resShortName = Path.GetFileName(resPath); //resPath.Substring(resStartIndex); xmlRawData.OtherLanguages[(int)langType] = true; list.Add(xmlRawData); foreignlist.Add(xmlRawData); } //第二遍开始计算asset的多语言信息 foreach (var xmlRaw in list) { if (xmlRaw.Language == eAssetLanguageVarType.Default) { foreach (var xmlForeign in foreignlist) { if (xmlForeign.bundleName == xmlRaw.bundleName) { xmlRaw.OtherLanguages[(int)xmlForeign.Language] = true; } } } } return(list); }
protected virtual string FindAssetPath(string name) { /* search assets */ if (EditorKeyPathWithRealPath == null) { EditorKeyPathWithRealPath = new Dictionary <string, string[]>(); var assetGuids = AssetDatabase.FindAssets("", new string[] { "Assets/Game", "Assets/AssetBundles", "Assets/Configs" }); AllEditorAssetsPath.Clear(); foreach (var data in assetGuids) { AllEditorAssetsPath.Add(AssetDatabase.GUIDToAssetPath(data)); } foreach (var path in AllEditorAssetsPath) { if (path.Contains(".meta")) { continue; } if (path.Contains(".psd") || path.Contains(".tga")) { continue; } if (path.Contains(".mp3") || path.Contains(".wav")) { continue; } //必须是AB目录下的文件 //if (p.Contains(ABAssetStart) && p.Contains(".") && !AssetDatabase.IsValidFolder(p)) if (path.Contains(".") && !AssetDatabase.IsValidFolder(path)) { //排除其他语言格式 bool otherLan = false; foreach (var lan in System.Enum.GetNames(typeof(eAssetLanguageVarType))) { if (lan == "Default") { continue; } if (path.Contains("." + lan)) { otherLan = true; } } if (otherLan) { continue; } var bundlePath = GetAssetBundlePath(path); if (string.IsNullOrEmpty(bundlePath)) { continue; } EditorKeyPathWithRealPath[bundlePath] = new string[(int)eAssetLanguageVarType._Size_] { path, null, null, null, null }; var hashSet = new HashSet <eAssetLanguageVarType> { eAssetLanguageVarType.Default }; } } //加入存在的语言 foreach (var path in AllEditorAssetsPath) { if (path.Contains(".meta")) { continue; } if (path.Contains(".psd") || path.Contains(".tga")) { continue; } if (path.Contains(".mp3") || path.Contains(".wav")) { continue; } //必须是AB目录下的文件 //if (p.Contains(ABAssetStart) && p.Split('.').Length > 2 && !AssetDatabase.IsValidFolder(p)) if (path.Split('.').Length > 2 && !AssetDatabase.IsValidFolder(path)) { //排除其他语言格式 var lanType = AssetI8NHelper.GetPathLanguage(path.Replace(Path.GetExtension(path), "")); if (lanType == eAssetLanguageVarType.Default) { continue; } var bundlePath = GetAssetBundlePath(path); if (string.IsNullOrEmpty(bundlePath)) { continue; } var assetPath = bundlePath.Replace(AssetI8NHelper.GetLangFileExtensionStr(lanType), ""); if (EditorKeyPathWithRealPath.ContainsKey(assetPath)) { EditorKeyPathWithRealPath[assetPath][(int)lanType] = path; } else { CommonLog.Error("未找到多语言资源,资源:{0} ,不存在对应的原始资源:{1}", path, assetPath); } } } } string[] assetpath = null; var hasRes = EditorKeyPathWithRealPath.TryGetValue(name, out assetpath); if (hasRes) { //检查是否有其他语言 if (AssetLanguageVar != eAssetLanguageVarType.Default && EditorKeyPathWithRealPath[name][(int)AssetLanguageVar] != null) { return(assetpath[(int)AssetLanguageVar]); } return(assetpath[0]); } else { return(null); } }