/// <summary> /// Build AssetBunle /// </summary> /// <param name="buildTargetGroup"></param> private static void BuildAssetBundle(BuildTargetGroup buildTargetGroup) { var isHotUpdateBuild = ContainsEnvOption(EnvOption.HOT_UPDATE_BUILD); var beginTime = System.DateTime.Now; if (!isHotUpdateBuild || (isHotUpdateBuild && ContainsEnvOption(EnvOption.ANALYZE_BUNDLE))) { AssetBundleAnalyzer.AutoAnalyzeAssetBundleName(); } Debug.Log("=================Build AutoAnalyzeAssetBundleName Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); beginTime = System.DateTime.Now; ColaEditHelper.BuildManifest(); ColaEditHelper.BuildAssetBundles(); if (!isHotUpdateBuild) { ColaEditHelper.CopyAssetBundlesTo(Path.Combine(Application.streamingAssetsPath, Utility.AssetBundles)); AssetDatabase.Refresh(); BuildVideoFiles(); } Debug.Log("=================Build BuildAssetBundle Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
public static void ExportUIView() { var uiObj = Selection.activeGameObject; if (null == uiObj) { return; } var UIViewName = uiObj.name; if (!UIViewName.StartsWith("UI", StringComparison.CurrentCultureIgnoreCase)) { UIViewName = "UI" + UIViewName; } UIViewName = UIViewName.Substring(0, 2).ToUpper() + UIViewName.Substring(2); //ToUpperFirst uiObj.name = UIViewName; uiExportElementDic.Clear(); nestExportInfoList.Clear(); UICollection = null; UIComponentIndex = -1; ProcessUIPrefab(uiObj); GenUIViewCode(UIViewName); var prefabPath = Constants.UIExportPrefabPath + UIViewName + ".prefab"; ColaEditHelper.CreateOrReplacePrefab(uiObj, prefabPath); AssetDatabase.Refresh(); }
/// <summary> /// UpLoadCDN /// </summary> /// <param name="buildTargetGroup"></param> private static void UpLoadCDN(BuildTargetGroup buildTargetGroup) { var beginTime = System.DateTime.Now; var isMotherPkg = ContainsEnvOption(EnvOption.MOTHER_PKG); var isHotUpdateBuild = ContainsEnvOption(EnvOption.HOT_UPDATE_BUILD); if (isHotUpdateBuild || isMotherPkg) { //upload appversion.json var CDN_AppVersionPath = string.Format(CDNVersionControlUrl, ColaEditHelper.GetPlatformName(), "app_version.json"); FileHelper.CopyFile(Resource_AppVersionPath, CDN_AppVersionPath, true); //upload version.txt and assets var reltaRoot = ColaEditHelper.CreateAssetBundleDirectory(); var updateFilePath = reltaRoot + "/updates.txt"; using (var sr = new StreamReader(updateFilePath)) { var content = sr.ReadLine(); while (null != content) { var reltaPath = reltaRoot + "/" + content; var destPath = CDNResourceUrl + content; FileHelper.CopyFile(reltaPath, destPath, true); content = sr.ReadLine(); } } FileHelper.CopyFile(reltaRoot + "/versions.txt", CDNResourceUrl + "versions.txt", true); } Debug.Log("=================UpLoadCDN Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
public static void GetAllAssets(string rootDir) { assetInfoDict.Clear(); DirectoryInfo dirinfo = new DirectoryInfo(rootDir); FileInfo[] fs = dirinfo.GetFiles("*.*", SearchOption.AllDirectories); int ind = 0; buildRules = ColaEditHelper.GetScriptableObjectAsset <BuildRules>(BUILD_RULES_PATH); foreach (var f in fs) { curProgress = (float)ind / (float)fs.Length; curRootAsset = "正在分析依赖:" + f.Name; EditorUtility.DisplayProgressBar(curRootAsset, curRootAsset, curProgress); ind++; int index = f.FullName.IndexOf("Assets"); if (index != -1) { string assetPath = f.FullName.Substring(index); if (assetPath.EndsWith(".meta", StringComparison.Ordinal) || assetPath.EndsWith(".cs", System.StringComparison.CurrentCulture)) { continue; } UnityEngine.Object asset = AssetDatabase.LoadMainAssetAtPath(assetPath); string upath = AssetDatabase.GetAssetPath(asset); if (buildRules.IsInBuildRules(upath)) { EditorUtility.UnloadUnusedAssetsImmediate(); continue; } if (assetInfoDict.ContainsKey(assetPath) == false && assetPath.StartsWith("Assets") && !(asset is LightingDataAsset) && asset != null ) { AssetInfo info = new AssetInfo(upath, true); //标记一下是文件夹下根资源 CreateDeps(info); } EditorUtility.UnloadUnusedAssetsImmediate(); } EditorUtility.UnloadUnusedAssetsImmediate(); } EditorUtility.ClearProgressBar(); int setIndex = 0; foreach (KeyValuePair <string, AssetInfo> kv in assetInfoDict) { EditorUtility.DisplayProgressBar("正在设置AssetBundleName: ", kv.Key, (float)setIndex / (float)assetInfoDict.Count); setIndex++; AssetInfo a = kv.Value; a.SetAssetBundleName(PIECE_THRESHOLD); } EditorUtility.ClearProgressBar(); EditorUtility.UnloadUnusedAssetsImmediate(); AssetDatabase.SaveAssets(); }
/// <summary> /// 最后的出包环节 /// </summary> /// <param name="buildTargetGroup"></param> private static void InternalBuildPkg(BuildTargetGroup buildTargetGroup) { var beginTime = System.DateTime.Now; if (!ContainsEnvOption(EnvOption.HOT_UPDATE_BUILD)) { ColaEditHelper.BuildStandalonePlayer(ColaEditHelper.ProjectRoot + "/Build"); } Debug.Log("=================Build Pkg Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
/// <summary> /// Build AssetBunle /// </summary> /// <param name="buildTargetGroup"></param> private static void BuildAssetBundle(BuildTargetGroup buildTargetGroup) { var beginTime = System.DateTime.Now; ColaEditHelper.BuildManifest(); ColaEditHelper.BuildAssetBundles(); ColaEditHelper.CopyAssetBundlesTo(Path.Combine(Application.streamingAssetsPath, Utility.AssetBundles)); AssetDatabase.Refresh(); Debug.Log("=================Build BuildAssetBundle Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
/// <summary> /// 自动处理AppVersion /// </summary> private static void BuildAppVersion() { var isMotherPkg = ContainsEnvOption(EnvOption.MOTHER_PKG); var isHotUpdateBuild = ContainsEnvOption(EnvOption.HOT_UPDATE_BUILD); var appAsset = ColaEditHelper.GetScriptableObjectAsset <AppVersion>(AppVersionPath); if (isHotUpdateBuild) { appAsset.HotUpdateVersion += 1; } else if (isMotherPkg) { appAsset.HotUpdateVersion = 0; appAsset.StoreVersion += 1; appAsset.BuildVersion = 0; } if (!isMotherPkg && !isHotUpdateBuild) { appAsset.BuildVersion += 1; } appAsset.OnValueChanged(); EditorUtility.SetDirty(appAsset); AssetDatabase.SaveAssets(); if (null != appAsset) { var jsonStr = JsonMapper.ToJson(appAsset); var cachePath = ColaEditHelper.TempCachePath + "/" + AppVersionFileName; FileHelper.DeleteFile(cachePath); FileHelper.WriteString(cachePath, jsonStr); if (!isHotUpdateBuild) { FileHelper.CopyFile(cachePath, Resource_AppVersionPath, true); PlayerSettings.bundleVersion = appAsset.Version; } } if (!isHotUpdateBuild) { FileHelper.DeleteFile(Resource_VersionPath); var outputPath = ColaEditHelper.CreateAssetBundleDirectory(); var versionsTxt = outputPath + "/versions.txt"; FileHelper.CopyFile(versionsTxt, Resource_VersionPath, true); } AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); }
/// <summary> /// Build Lua /// </summary> /// <param name="buildTargetGroup"></param> private static void BuildLua(BuildTargetGroup buildTargetGroup) { var beginTime = System.DateTime.Now; if (AppConst.LuaBundleMode) { ColaEditHelper.BuildLuaBundle(); } else { ColaEditHelper.BuildLuaFile(); } Debug.Log("=================Build Lua Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
private void DrawMiscUI() { GUILayout.BeginHorizontal("HelpBox"); EditorGUILayout.LabelField("== 快捷功能 =="); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("打开AssetPath目录", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.OpenDirectory(AppConst.AssetPath); } if (GUILayout.Button("打开GameLog文件目录", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.OpenDirectory(Path.Combine(AppConst.AssetPath, "logs")); } GUILayout.EndHorizontal(); }
/// <summary> /// Build Lua /// </summary> /// <param name="buildTargetGroup"></param> private static void BuildLua(BuildTargetGroup buildTargetGroup) { var beginTime = System.DateTime.Now; var isMotherPkg = ContainsEnvOption(EnvOption.MOTHER_PKG); var isHotUpdateBuild = ContainsEnvOption(EnvOption.HOT_UPDATE_BUILD); if (AppConst.LuaBundleMode) { ColaEditHelper.BuildLuaBundle(isMotherPkg, isHotUpdateBuild); } else { ColaEditHelper.BuildLuaFile(isMotherPkg, isHotUpdateBuild); } Debug.Log("=================Build Lua Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
public static void CopyAssetBundlesTo(string outputPath) { if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } var source = ColaEditHelper.GetAssetBundleDirectory(); if (!Directory.Exists(source)) { Debug.Log("No assetBundle output folder, try to build the assetBundles first."); } if (Directory.Exists(outputPath)) { FileUtil.DeleteFileOrDirectory(outputPath); } FileUtil.CopyFileOrDirectory(source, outputPath); }
public static void AutoAnalyzeAssetBundleName() { GetAllAssets(Constants.GameAssetBasePath); //按文件夹标记 var markDirList = buildRules.MarkWithDirList; if (null != markDirList) { foreach (var item in markDirList) { ColaEditHelper.MarkAssetsWithDir(item); } } //标记为一个bundle var markOneBundleList = buildRules.MarkWithOneBundleList; if (null != markOneBundleList) { foreach (var item in markOneBundleList) { var bundleName = item.TrimEnd('/'); var index = bundleName.LastIndexOf('/'); bundleName = bundleName.Substring(index); bundleName = bundleName.TrimStart('/'); bundleName += AppConst.ExtName; ColaEditHelper.MarkAssetsToOneBundle(item, bundleName); } } //按文件标记 var markFileList = buildRules.MarkWithFileList; if (null != markFileList) { foreach (var item in markFileList) { ColaEditHelper.MarkAssetsWithFile(item); } } }
/// <summary> /// 按打包碎片粒SetAssetBundleName /// </summary> /// <param name="pieceThreshold"></param> public void SetAssetBundleName(int pieceThreshold) { var abName = TrimedAssetBundleName(assetPath) + AppConst.ExtName; //大于阀值 if (this.parentSet.Count >= pieceThreshold) { ColaEditHelper.SetAssetBundleNameAndVariant(assetPath, abName, null); //Debug.Log("<color=#6501AB>" + "设置ab,有多个引用: " + this.assetPath + "</color>"); } //根节点 else if (this.parentSet.Count == 0 || this.isRootAsset) { ColaEditHelper.SetAssetBundleNameAndVariant(assetPath, abName, null); //Debug.Log("<color=#025082>" + "设置ab,根资源ab: " + this.assetPath + "</color>"); } else { //其余的子资源 ColaEditHelper.SetAssetBundleNameAndVariant(assetPath, string.Empty, null); //Debug.Log("<color=#DBAF00>" + "清除ab, 仅有1个引用: " + this.assetPath + "</color>"); } }
private void DrawAssetUI() { GUILayout.BeginHorizontal("HelpBox"); EditorGUILayout.LabelField("== 快捷功能 =="); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Build Lua Bundle", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.BuildLuaBundle(); } if (GUILayout.Button("Build Lua File", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.BuildLuaFile(); } if (GUILayout.Button("Mark Lua Bundle", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.MarkAssetsToOneBundle(LuaConst.luaBaseTempDir, AppConst.LuaBaseBundle); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Mark Sprite Bundle", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.MarkAssetsWithDir("Assets/GameAssets/Arts/UI/Atlas/"); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("导出版本Json", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var assetPath = "Assets/Editor/Settings/AppVersion.asset"; var asset = AssetDatabase.LoadAssetAtPath <AppVersion>(assetPath); if (null != asset) { var jsonStr = JsonMapper.ToJson(asset); FileHelper.DeleteFile("Assets/Resources/app_version.json"); FileHelper.WriteString("Assets/Resources/app_version.json", jsonStr); AssetDatabase.Refresh(); } } if (GUILayout.Button("导入Json文件", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var jsonPath = "Assets/Editor/Settings/AppVersion.json"; using (var sr = new StreamReader(jsonPath)) { var jsonStr = sr.ReadToEnd(); var asset = JsonMapper.ToObject <AppVersion>(jsonStr); Debug.Log(asset.UpdateContent); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Zip Lua", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var result = ZipHelper.Zip("Assets/Lua", Path.Combine(Application.dataPath, "../output/luaout.zip")); Debug.Log("Zip Lua结果:" + result); } if (GUILayout.Button("UnZip Lua", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var filePath = Path.Combine("Assets", "../output/luaout.zip"); if (File.Exists(filePath)) { var result = ZipHelper.UnZip(filePath, Path.Combine("Assets", "../output")); Debug.Log("UnZip Lua结果:" + result); } else { Debug.LogError("解压错误!要解压的文件不存在!路径:" + filePath); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("筛选出MD5码变化的lua文件", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var md5Dic = new Dictionary <string, string>(); var luaMd5FilePath = ColaEditHelper.TempCachePath + "/LuaMD5.txt"; if (File.Exists(luaMd5FilePath)) { using (var sm = new StreamReader(luaMd5FilePath, Encoding.UTF8)) { var fileLines = sm.ReadToEnd().Split('\n'); foreach (var item in fileLines) { if (string.IsNullOrEmpty(item)) { continue; } var lineContent = item.Split('|'); if (lineContent.Length == 2) { md5Dic[lineContent[0]] = lineContent[1]; } else { Debug.LogError("LuaMD5.txt格式错误!内容为: " + lineContent); } } } } var luaFiles = new List <string>(Directory.GetFiles(LuaLogicPath, "*.lua", SearchOption.AllDirectories)); var fLength = (float)luaFiles.Count; int diffCnt = 0; for (int i = 0; i < luaFiles.Count; i++) { var fileName = luaFiles[i]; string curMd5 = FileHelper.GetMD5Hash(fileName); if (md5Dic.ContainsKey(fileName) && curMd5 == md5Dic[fileName]) { continue; } diffCnt++; string destPath = Regex.Replace(fileName, "^Assets", "output"); FileHelper.EnsureParentDirExist(destPath); File.Copy(fileName, destPath, true); md5Dic[fileName] = curMd5; EditorUtility.DisplayProgressBar("正在分析Lua差异化..", fileName, i / fLength); } var sb = new StringBuilder(); foreach (var item in md5Dic) { sb.AppendFormat("{0}|{1}", item.Key, item.Value).AppendLine(); } FileHelper.WriteString(luaMd5FilePath, sb.ToString()); EditorUtility.ClearProgressBar(); Debug.LogFormat("Lua差异化分析完毕!共有{0}个差异化文件!", diffCnt); } GUILayout.EndHorizontal(); }
/// <summary> /// UpLoadCDN /// </summary> /// <param name="buildTargetGroup"></param> private static void UpLoadCDN(BuildTargetGroup buildTargetGroup) { var beginTime = System.DateTime.Now; var isMotherPkg = ContainsEnvOption(EnvOption.MOTHER_PKG); var isHotUpdateBuild = ContainsEnvOption(EnvOption.HOT_UPDATE_BUILD); if (isHotUpdateBuild || isMotherPkg) { //上传远端CDN if (ContainsEnvOption(EnvOption.REMOTE_CDN)) { var host = GetEnvironmentVariable(EnvOption.CDN_URL); var userName = GetEnvironmentVariable(EnvOption.CDN_USERNAME); var password = GetEnvironmentVariable(EnvOption.CDN_PASSWORD); var ftpUtil = new FTPUtil(host, userName, password); //复制到本地目录以后打成zip,然后把zip上传到CDN //upload appversion.json var tempCDNRoot = "ColaCache/CDN"; FileHelper.RmDir(tempCDNRoot); var cachePath = ColaEditHelper.TempCachePath + "/" + AppVersionFileName; var CDN_AppVersionPath = string.Format(ColaEditHelper.TempCachePath + "/" + CDNVersionControlUrl, ColaEditHelper.GetPlatformName(), "app_version.json"); FileHelper.CopyFile(cachePath, CDN_AppVersionPath, true); //upload version.txt and assets var reltaRoot = ColaEditHelper.CreateAssetBundleDirectory(); var updateFilePath = reltaRoot + "/updates.txt"; using (var sr = new StreamReader(updateFilePath)) { var content = sr.ReadLine(); while (null != content) { var reltaPath = reltaRoot + "/" + content; var destPath = ColaEditHelper.TempCachePath + "/" + CDNResourceUrl + content; FileHelper.CopyFile(reltaPath, destPath, true); content = sr.ReadLine(); } } FileHelper.CopyFile(reltaRoot + "/versions.txt", ColaEditHelper.TempCachePath + "/" + CDNResourceUrl + "versions.txt", true); //ZIP var zipPath = "ColaCache/hotupdate.zip"; FileHelper.DeleteFile(zipPath); var result = ZipHelper.Zip(tempCDNRoot, zipPath); if (result) { ftpUtil.Upload(zipPath, "Upload/hotupdate.zip"); } else { Debug.LogError("Zip并上传CDN过程中出现错误!"); } } //上传本地CDN,打包机和CDN是同一台机器 else { //upload appversion.json var cachePath = ColaEditHelper.TempCachePath + "/" + AppVersionFileName; var CDN_AppVersionPath = string.Format(CDNVersionControlUrl, ColaEditHelper.GetPlatformName(), "app_version.json"); FileHelper.CopyFile(cachePath, CDN_AppVersionPath, true); //upload version.txt and assets var reltaRoot = ColaEditHelper.CreateAssetBundleDirectory(); var updateFilePath = reltaRoot + "/updates.txt"; using (var sr = new StreamReader(updateFilePath)) { var content = sr.ReadLine(); while (null != content) { var reltaPath = reltaRoot + "/" + content; var destPath = CDNResourceUrl + content; FileHelper.CopyFile(reltaPath, destPath, true); content = sr.ReadLine(); } } FileHelper.CopyFile(reltaRoot + "/versions.txt", CDNResourceUrl + "versions.txt", true); } } Debug.Log("=================UpLoadCDN Time================ : " + (System.DateTime.Now - beginTime).TotalSeconds); }
private static string GetAssetBundleManifestFilePath() { var relativeAssetBundlesOutputPathForPlatform = Path.Combine(Utility.AssetBundles, ColaEditHelper.GetPlatformName()); return(Path.Combine(relativeAssetBundlesOutputPathForPlatform, ColaEditHelper.GetPlatformName()) + ".manifest"); }
static void ClearAllABNames() { ColaEditHelper.ClearAllAssetBundleName(); }
private static AppSetting GetSetting() { return(ColaEditHelper.GetScriptableObjectAsset <AppSetting>("Assets/Editor/Settings/AppSetting.asset")); }
private void DrawAssetUI() { GUILayout.BeginHorizontal("HelpBox"); EditorGUILayout.LabelField("== 快捷功能 =="); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Build Lua To StreamingAsset", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { ColaEditHelper.BuildLuaToStreamingAsset(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Zip Lua", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var result = ZipHelper.Zip("Assets/Lua", Path.Combine(Application.dataPath, "../output/luaout.zip")); Debug.Log("Zip Lua结果:" + result); } if (GUILayout.Button("UnZip Lua", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var filePath = Path.Combine("Assets", "../output/luaout.zip"); if (File.Exists(filePath)) { var result = ZipHelper.UnZip(filePath, Path.Combine("Assets", "../output")); Debug.Log("UnZip Lua结果:" + result); } else { Debug.LogError("解压错误!要解压的文件不存在!路径:" + filePath); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("筛选出MD5码变化的lua文件", GUILayout.ExpandWidth(true), GUILayout.MaxHeight(30))) { var md5Dic = new Dictionary <string, string>(); var luaMd5FilePath = ColaEditHelper.TempCachePath + "/LuaMD5.txt"; if (File.Exists(luaMd5FilePath)) { using (var sm = new StreamReader(luaMd5FilePath, Encoding.UTF8)) { var fileLines = sm.ReadToEnd().Split('\n'); foreach (var item in fileLines) { if (string.IsNullOrEmpty(item)) { continue; } var lineContent = item.Split('|'); if (lineContent.Length == 2) { md5Dic[lineContent[0]] = lineContent[1]; } else { Debug.LogError("LuaMD5.txt格式错误!内容为: " + lineContent); } } } } var luaFiles = new List <string>(Directory.GetFiles(LuaLogicPath, "*.lua", SearchOption.AllDirectories)); var fLength = (float)luaFiles.Count; int diffCnt = 0; for (int i = 0; i < luaFiles.Count; i++) { var fileName = luaFiles[i]; string curMd5 = FileHelper.GetMD5Hash(fileName); if (md5Dic.ContainsKey(fileName) && curMd5 == md5Dic[fileName]) { continue; } diffCnt++; string destPath = Regex.Replace(fileName, "^Assets", "output"); FileHelper.EnsureParentDirExist(destPath); File.Copy(fileName, destPath, true); md5Dic[fileName] = curMd5; EditorUtility.DisplayProgressBar("正在分析Lua差异化..", fileName, i / fLength); } var sb = new StringBuilder(); foreach (var item in md5Dic) { sb.AppendFormat("{0}|{1}", item.Key, item.Value).AppendLine(); } FileHelper.WriteString(luaMd5FilePath, sb.ToString()); EditorUtility.ClearProgressBar(); Debug.LogFormat("Lua差异化分析完毕!共有{0}个差异化文件!", diffCnt); } GUILayout.EndHorizontal(); }