void ResetView() { if (!File.Exists(BMSettings_Path)) { BMEditUtility.CreateAsset <BMSettings>(BMSettings_Path); } settings = AssetDatabase.LoadAssetAtPath <BMSettings>(BMSettings_Path); titleFields = settings.GetType().GetFields(); }
private void OnEnable() { _settings = target as BMSettings; _newSceneStyle = new GUIStyle(); _newSceneStyle.normal.textColor = Color.green; _scenesVersionDict = BMEditUtility.GetDictionaryFromFile(_settings.scenesVersionFile); if (_scenesVersionDict == null) { _scenesVersionDict = new Dictionary <string, string>(); } }
static void MoveAssetBundle() { string streamingAssetsPath = Application.streamingAssetsPath; BMEditUtility.DelFolder(streamingAssetsPath); if (!Directory.Exists(streamingAssetsPath)) { Directory.CreateDirectory(streamingAssetsPath); } BMEditUtility.CopyDir(Output_Path, streamingAssetsPath); Logger.Log("Move all bundle files over. to " + streamingAssetsPath); }
private void GenerateAtlasSpritePrefab(string atlasDir) { Dictionary <string, string> md5Map = new Dictionary <string, string>(); FileInfo[] resFiles = BMEditUtility.GetAllFiles(atlasDir, "*.*"); for (int j = 0; j < resFiles.Length; j++) { FileInfo info = resFiles[j]; if (info.FullName.EndsWith(".meta", StringComparison.Ordinal) || info.FullName.EndsWith(".txt", StringComparison.Ordinal)) { continue; } string dirName = Path.GetFileName(info.DirectoryName); string outPath = $"{_settings.atlasSpritePrefabDir}{dirName}/"; string spriteFileName = Path.GetFileName(info.FullName); string spriteName = Path.GetFileNameWithoutExtension(info.FullName); string texPath = BMEditUtility.Absolute2Relativity(info.FullName); string md5 = HashHelper.ComputeMD5(texPath); md5Map.Add(texPath, md5); TextureImporter ti = AssetImporter.GetAtPath(texPath) as TextureImporter; if (ti) { if (!Directory.Exists(outPath)) { Directory.CreateDirectory(outPath); } GameObject spritePrefab = new GameObject(spriteName); SpriteRenderer spriteRenderer = spritePrefab.AddComponent <SpriteRenderer>(); Vector4 border = ti.spriteBorder; ti.spritePackingTag = "Atlas_" + dirName; ti.SaveAndReimport(); spriteRenderer.sprite = AssetDatabase.LoadAssetAtPath <Sprite>(texPath);; //spritePrefab.hideFlags = HideFlags.HideInHierarchy; var savePath = outPath + spriteName + ".prefab"; if (File.Exists(savePath)) { File.Delete(savePath); } PrefabUtility.SaveAsPrefabAsset(spritePrefab, savePath); //var texture2D = AssetDatabase.LoadAssetAtPath<Texture2D>(rPath); //var sprite = Sprite.Create(texture2D, new Rect(0,0,texture2D.width,texture2D.height), new Vector2(0.5f,0.5f), 400, 0,SpriteMeshType.FullRect,border); DestroyImmediate(spritePrefab); } } //Save md5 BMEditUtility.SaveDictionary(Path.Combine(atlasDir, "manifest.txt"), md5Map); }
static void ClearManifestFiles() { FileInfo[] manifestFiles = BMEditUtility.GetAllFiles(Output_Path, "*.manifest"); for (int i = 0; i < manifestFiles.Length; i++) { FileInfo fileInfo = manifestFiles[i]; string path = fileInfo.DirectoryName + "/" + fileInfo.Name; //相对路径 Debug.Log(path); if (File.Exists(path)) { File.Delete(path); } EditorUtility.DisplayProgressBar("Clear Manifest Files...", path, (float)(i + 1.0f) / (float)manifestFiles.Length); } EditorUtility.ClearProgressBar(); }
private void UpdatePackingTag(string dir) { FileInfo[] resFiles = BMEditUtility.GetAllFiles(dir, "*.*"); for (int i = 0; i < resFiles.Length; i++) { FileInfo info = resFiles[i]; string rPath = BMEditUtility.Absolute2Relativity(info.FullName); if (Path.GetExtension(rPath) == ".meta") { continue; } string dirName = Path.GetFileName(Path.GetDirectoryName(rPath)); TextureImporter ti = AssetImporter.GetAtPath(rPath) as TextureImporter; if (ti) { ti.spritePackingTag = "UISprite_" + dirName; ti.SaveAndReimport(); } } }
static void SaveBundleInfo() { int total = 0; for (int i = 0; i < buildInfoList.Count; i++) { BuildInfo buildInfo = buildInfoList[i]; foreach (var sub in buildInfo.subBuildInfoMap.Values) { total++; buildInfoJson["bundles"].Add(sub.ToJson()); } } string json = buildInfoJson.ToJson(); BMEditUtility.SaveUTF8TextFile(Output_Path + "/" + BMConfig.BundleDataFile, JsonFormatter.PrettyPrint(json)); BMEditUtility.SaveUTF8TextFile(Output_Path + "/" + BMConfig.VersionFile, version.ToString()); //BMEditUtility.SaveDictionary(historyBuildInfoPath, historyBuildInfoPath); EditorPrefs.SetString(settings.AppName + BM_Build_Version, version.ToString()); Logger.Log(string.Format("Bundle total num:{0}", total)); }
static void FetchBuildInfoList(List <string> folders, string searchPattern, CompressType compressType, BuildType buildType) { //包含所有资源的bundle for (int i = 0; i < folders.Count; i++) { if (!Directory.Exists(folders[i])) { continue; } string resDir = BMEditUtility.Relativity2Absolute(folders[i]); if (resDir == null) { continue; } BuildInfo buildInfo = FetchBuildInfo(resDir, searchPattern, buildType); buildInfo.buildName = folders[i].EndsWith("/")?folders[i].Substring(0, folders[i].Length - 1):folders[i]; buildInfo.buildType = buildType; buildInfo.compressType = compressType; buildInfoList.Add(buildInfo); } }
private bool CheckModify(string atlasDir) { Dictionary <string, string> md5Map = BMEditUtility.GetDictionaryFromFile(Path.Combine(atlasDir, "manifest.txt")); bool modify = false; if (md5Map == null) { modify = true; } else { FileInfo[] resFiles = BMEditUtility.GetAllFiles(atlasDir, "*.*"); for (int i = 0; i < resFiles.Length; i++) { FileInfo info = resFiles[i]; if (info.FullName.EndsWith(".meta", StringComparison.Ordinal) || info.FullName.EndsWith(".txt", StringComparison.Ordinal)) { continue; } string spriteFileName = Path.GetFileName(info.FullName); string oldmd5; string md5 = HashHelper.ComputeMD5(Path.Combine(atlasDir, spriteFileName)); if (md5Map.TryGetValue(spriteFileName, out oldmd5)) { if (md5 != oldmd5) { modify = true; break; } } else { modify = true; break; } } } return(modify); }
private static void StartBuild(bool forceBuild, Language language, BuildTarget buildTarget, bool moveBundle = false) { //加载打包配置 BundleBuilder.settings = AssetDatabase.LoadAssetAtPath <BMSettings>(BMSettings_Path); //加载场景版本号 BundleBuilder.scenesVersionDict = BMEditUtility.GetDictionaryFromFile(BundleBuilder.settings.scenesVersionFile); if (BundleBuilder.scenesVersionDict == null) { BundleBuilder.scenesVersionDict = new Dictionary <string, string>(); } //Output_Path = Application.dataPath.Replace("Assets", "TestBundle"); BundleBuilder.Output_Root_Path = Application.dataPath.Replace("Assets", BundleBuilder.settings.BuildOutputDirName); BundleBuilder.Output_Path = BundleBuilder.Output_Root_Path + "/" + language.ToString() + "/" + buildTarget.ToString(); string historyBuildInfoPath = BundleBuilder.Output_Path + "/" + BMConfig.BundleDataFile; BundleBuilder.historyBuildInfo = forceBuild ? null : LoadHistoryBundleData(historyBuildInfoPath); if (BundleBuilder.settings.tempForceBuild) { forceBuild = true; BundleBuilder.settings.tempForceBuild = false; BMEditUtility.SaveSetting(BundleBuilder.settings); } BundleBuilder.StartBuild(forceBuild, Language.zh_CN, buildTarget, true, BundleBuilder.settings.encodeLuaFile, moveBundle); }
public override void OnInspectorGUI() { base.OnInspectorGUI(); if (!string.IsNullOrEmpty(_settings.scenesVersionFile)) { EditorGUILayout.Space(); foreach (var folder in _settings.scenesFolderList) { FileInfo[] sceneFiles = BMEditUtility.GetAllFiles(folder, _settings.scenesPattern); for (int i = 0; i < sceneFiles.Length; i++) { string path = BMEditUtility.Absolute2Relativity(sceneFiles[i].DirectoryName) + "/" + sceneFiles[i].Name; //相对路径 if (_scenesVersionDict.TryGetValue(path, out string version)) { var oldVer = version; version = EditorGUILayout.TextField(path.Replace(_settings.resDir, ""), version); if (version != oldVer) { _scenesVersionDict[path] = version; BMEditUtility.SaveDictionary(_settings.scenesVersionFile, _scenesVersionDict); } } else { EditorGUILayout.TextField(path.Replace(_settings.resDir, ""), "0"); } } } if (GUILayout.Button("Save Scene Version")) { BMEditUtility.SaveDictionary(_settings.scenesVersionFile, _scenesVersionDict); } //重制所有场景版本号 if (GUILayout.Button("Reset All Scenes Version")) { _scenesVersionDict = new Dictionary <string, string>(); BMEditUtility.SaveDictionary(_settings.scenesVersionFile, _scenesVersionDict); // _settings.sceneVersions = new List<int>(); // _settings.scenePaths = new List<string>(); // serializedObject.ApplyModifiedProperties(); // BMEditUtility.SaveSetting(_settings); } } EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Generate Atlas Sprite")) { GenerateAtlasSprite(false); } if (GUILayout.Button("Force Generate Atlas Sprite")) { GenerateAtlasSprite(true); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); //uiSpriteDir _settings.uiSpriteDir = EditorGUILayout.TextField("UI Sprite", _settings.uiSpriteDir); if (!string.IsNullOrEmpty(_settings.uiSpriteDir)) { if (GUILayout.Button("Update All Packing Tag")) { UpdatePackingTag(_settings.uiSpriteDir); } } }
//======================= // 流程函数 //======================= public static void StartBuild(bool forceBuild, Language language, BuildTarget buildTag, bool generate, bool luaEncoded, bool moveBundle) { buildTarget = buildTag; buildStartTime = EditorApplication.timeSinceStartup; tempLuaPaths = new List <string>(); isForceBuild = forceBuild; isLuaEncoded = luaEncoded; //记录打包次数 string verStr = EditorPrefs.GetString(settings.AppName + BM_Build_Version, null); if (string.IsNullOrEmpty(verStr)) { version = new Version(0, 0, 0, 1); } else { version = new Version(verStr); version = new Version(version.Major, version.Minor, version.Build, version.Revision + 1); } buildInfoJson = new JsonData(); buildInfoJson["resDir"] = settings.resDir; buildInfoJson["platform"] = buildTarget.ToString(); buildInfoJson["suffix"] = settings.Suffix_Bundle; buildInfoJson["useHashName"] = settings.useHashName; buildInfoJson["language"] = language.ToString(); buildInfoJson["bundles"] = new JsonData(); ignoreSuffixs = settings.Ignore_Suffix.Split(','); ignoreFolders = settings.Ignore_Folder.Split(','); //强制打包时情况原来的目录 if (isForceBuild && Directory.Exists(Output_Path)) { BMEditUtility.DelFolder(Output_Path); } Directory.CreateDirectory(Output_Path); //清空控制台日志 Debug.ClearDeveloperConsole(); //清除AssetBundleName (这步可以不做) //RemoveAllAssetBundleName(); //获取所有Build信息 FetchAllBuildInfo(); //计算AssetBundle信息 CalcAssetBundleInfos(); //做增量过滤 if (!isForceBuild)//是否是强制重新Build { IncrementFilter(); } //生成AssetBundle if (generate) { GenerateAssetBundle(); } //计算Bundle文件大小 if (generate) { CalcBundleFileSize(); } //写入Bundle信息 SaveBundleInfo(); //清除manifest文件 if (settings.clearManifestFile) { ClearManifestFiles(); } //移动生成后的所有bundle文件 if (moveBundle) { MoveAssetBundle(); } Logger.Log("Generate Assets Bundle Over. time consuming:{0}s", EditorApplication.timeSinceStartup - buildStartTime); }
//======================= // 工具函数 //======================= //获取Build信息 static BuildInfo FetchBuildInfo(string resDir, string searchPattern, BuildType buildType) { BuildInfo buildInfo = new BuildInfo(); buildInfo.assetPaths = new List <string>(); FileInfo[] resFiles = BMEditUtility.GetAllFiles(resDir, searchPattern); for (int i = 0; i < resFiles.Length; i++) { FileInfo fileInfo = resFiles[i]; string lowerName = fileInfo.Name.ToLower(); string dirPath = BMEditUtility.Absolute2Relativity(fileInfo.DirectoryName) + "/"; //过滤一些文件 if ((fileInfo.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) { continue; } if ((fileInfo.Directory.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) { continue; } if (IgnoreFile(lowerName, dirPath)) { continue; } string path = dirPath + fileInfo.Name; //相对路径 if (buildType == BuildType.Lua) { string temp = path + "." + BMUtility.EncryptWithMD5(path) + ".bytes"; if (File.Exists(temp)) { File.Delete(temp); } if (isLuaEncoded) { if (!EncodeLuaFile(path, temp)) { Debug.Log("Encode lua file fail!"); break; } } else { File.Copy(path, temp); } buildInfo.assetPaths.Add(temp); tempLuaPaths.Add(temp); } else { buildInfo.assetPaths.Add(path); } //Logger.Log("path:{0}", path); EditorUtility.DisplayCancelableProgressBar("Fetch Build Info...", path, (float)(i + 1.0f) / (float)resFiles.Length); } //EditorUtility.ClearProgressBar(); if (buildType == BuildType.Lua) { AssetDatabase.Refresh(); } return(buildInfo); }
static void CalcAssetBundleInfos() { for (int i = 0; i < buildInfoList.Count; i++) { BuildInfo buildInfo = buildInfoList[i]; buildInfo.subBuildInfoMap = new Dictionary <string, SubBuildInfo>(); for (int j = 0; j < buildInfo.assetPaths.Count; j++) { string path = buildInfo.assetPaths[j]; string dirName = Path.GetDirectoryName(path); string name; int version = 0; switch (buildInfo.buildType) { case BuildType.Pack: name = BMUtility.Path2Name(dirName); break; case BuildType.Scene: name = BMUtility.Path2Name(dirName + "/" + Path.GetFileNameWithoutExtension(path)); if (scenesVersionDict.TryGetValue(path, out string verStr)) { version = int.Parse(verStr); } else { //新场景 version = 1; scenesVersionDict.Add(path, version.ToString()); BMEditUtility.SaveDictionary(settings.scenesVersionFile, scenesVersionDict); } break; case BuildType.Shader: name = BMUtility.Path2Name(buildInfo.buildName); break; case BuildType.Lua: name = BMUtility.Path2Name(buildInfo.buildName); break; default: // BuildType.Single: name = BMUtility.Path2Name(dirName + "/" + Path.GetFileName(path)); break; } string md5 = BMUtility.EncryptWithMD5(name + "." + settings.Suffix_Bundle); SubBuildInfo subInfo = null; if (!buildInfo.subBuildInfoMap.TryGetValue(md5, out subInfo)) { string abName = name; if (settings.useHashName) { abName = md5; } subInfo = new SubBuildInfo() { bundleName = name, buildMd5 = md5, buildType = buildInfo.buildType, version = version, assetBundleBuild = new AssetBundleBuild() { assetBundleName = abName, assetBundleVariant = settings.Suffix_Bundle, }, assetPaths = new List <string>(), assetHashs = new List <string>(), dependenceMap = new Dictionary <string, string[]>(), dependenceHashMap = new Dictionary <string, string[]>(), }; buildInfo.subBuildInfoMap.Add(md5, subInfo); } //添加依赖关系 AddDependence(path, subInfo.dependenceMap); string hash = HashHelper.ComputeMD5(path); subInfo.assetPaths.Add(path.ToLower()); subInfo.assetHashs.Add(hash); AssetBundleBuild abb = subInfo.assetBundleBuild; abb.assetNames = subInfo.assetPaths.ToArray(); //abb.addressableNames = subInfo.assetPaths.ToArray(); subInfo.assetBundleBuild = abb; EditorUtility.DisplayProgressBar("Calc Asset Bundle Build Infos...", path, (float)(j + 1.0f) / (float)buildInfo.assetPaths.Count); } } EditorUtility.ClearProgressBar(); Logger.Log("Calc Asset Bundle Infos Over."); }