예제 #1
0
        /// <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);
        }
예제 #2
0
        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();
        }
예제 #3
0
        /// <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();
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        /// <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);
        }
예제 #7
0
        /// <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();
        }
예제 #8
0
        /// <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();
 }
예제 #10
0
        /// <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);
        }
예제 #11
0
        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);
                }
            }
        }
예제 #13
0
        /// <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();
        }
예제 #15
0
        /// <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);
        }
예제 #16
0
        private static string GetAssetBundleManifestFilePath()
        {
            var relativeAssetBundlesOutputPathForPlatform = Path.Combine(Utility.AssetBundles, ColaEditHelper.GetPlatformName());

            return(Path.Combine(relativeAssetBundlesOutputPathForPlatform, ColaEditHelper.GetPlatformName()) + ".manifest");
        }
 static void ClearAllABNames()
 {
     ColaEditHelper.ClearAllAssetBundleName();
 }
예제 #18
0
 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();
        }