using UnityEngine; using UnityEditor; using System.IO; using System; using GameEditor.FrameTool; public class AutoPack : EditorWindow { static bool isObb = false; bool isBuild = false; static bool isZs = false; static string[] versionArr = new string[15]; static int verIndex = 0; static string curProjectDir; static string m_ExcelPath; static string[] excelArr; static int excelIndex=0; //打包数据 [MenuItem("自动化打包/一键导出")] private static void EzBuildPack() { curProjectDir = Environment.CurrentDirectory.Replace('\\', '/'); verIndex = EditorPrefs.GetInt("verIndex"); m_ExcelPath = EditorPrefs.GetString("m_ExcelPath"); excelArr = Directory.GetDirectories(m_ExcelPath, "master_*"); Debug.Log(EditorPrefs.GetString("m_Bench")); if (excelArr!=null) { for (int i = 0; i < excelArr.Length; i++) { if (excelArr[i]== EditorPrefs.GetString("m_Bench")) { excelIndex = i; } } } string[] _strArr = Directory.GetFiles(curProjectDir + "/AssetBundles/", "*.txt"); Debug.Log("version列表数量:"+_strArr.Length); for (int i = 0; i < _strArr.Length; i++) { string[] pathSpl = _strArr[i].Split('/'); string _str = pathSpl[pathSpl.Length-1]; versionArr[i] = _str; } //创建窗口 Rect wr = new Rect(0, 0, 400, 500); var buildWin = GetWindowWithRect(wr, true); buildWin.titleContent = new GUIContent("打包工具"); buildWin.Show(); } private void OnGUI() { EditorGUILayout.BeginVertical(); EditorGUILayout.Space(); EditorGUILayout.Space(); if (excelArr!=null&& excelArr.Length>0) { excelIndex = EditorGUILayout.Popup("选择excel文件:", excelIndex, excelArr); EditorGUILayout.Space(); if (GUILayout.Button("一键导表", GUILayout.Height(40f))) { EditorPrefs.SetString("m_Bench", excelArr[excelIndex]); GameEditor.Core.DataConfig.DataConfigWindow.excelALLConfig(false, excelArr[excelIndex] + "/base_data"); } } if (GUILayout.Button("单打lua资源", GUILayout.Height(40f))) { if (FrameTool.BuildLuaAssetBundles()) { string exportPath = GameEditor.AssetBundle.AssetBundleConfig.GetExportPath(EditorUserBuildSettings.activeBuildTarget); string targetPath = FrameTool.GetStreamingAssetPath(EditorUserBuildSettings.activeBuildTarget); File.Copy(exportPath + "/lzma/luabytes.unity3d", targetPath + "/lzma/luabytes.unity3d", true); File.Copy(exportPath + "/lzma/resconfigs.unity3d", targetPath + "/lzma/resconfigs.unity3d", true); File.Copy(exportPath + "/files.unity3d", targetPath + "/files.unity3d", true); } } EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); verIndex = EditorGUILayout.Popup("选择version配置文件:", verIndex, versionArr); EditorGUILayout.Space(); #if UNITY_ANDROID isObb = EditorGUILayout.ToggleLeft("是否导出obb包", isObb); #endif isBuild = EditorGUILayout.ToggleLeft("是否需要build资源", isBuild); isZs = EditorGUILayout.ToggleLeft("是否从正式场景导出", isZs); EditorGUILayout.Space(); if (GUILayout.Button("导出工程", GUILayout.Height(40f))) { Debug.Log("开始导出工程"); EditorPrefs.SetInt("verIndex", verIndex); string targetPath = Application.dataPath + "/Resources/version.txt"; string copyPath = curProjectDir + "/AssetBundles/" + versionArr[verIndex]; Debug.Log("version文件路径:" + copyPath); if (File.Exists(targetPath)) { File.Delete(targetPath); } File.Copy(copyPath, targetPath, true); AssetDatabase.Refresh(); if (isBuild) { Debug.Log("开始build资源"); //打包游戏 FrameTool.BuildGameAssetBundles(); //拷贝AssetBundle到流媒体目录 FrameTool.CopyAssetBundleToStreamingAssets(); //刷新资源配置 GameEditor.ResourcesPathEditor.CreateResourcePathConfig(); Debug.Log("完成build资源"); } #if UNITY_ANDROID string sceneName = "Assets/LuaFramework/Scenes/LogoHwTest.unity"; if (isZs) { sceneName = "Assets/LuaFramework/Scenes/LogoHwRelease.unity"; } ExportAS( sceneName); #elif UNITY_IOS string sceneName = "Assets/LuaFramework/Scenes/Logo.unity"; ExportXcode(sceneName); #endif } } public static void ExportAS( string _sceneName) { PlayerSettings.productName = "ex_android_jl"; PlayerSettings.Android.useAPKExpansionFiles = isObb; string outPath = "D:/exAndroid/unity_ex_as"; if (isObb) { outPath = "D:/exAndroid/unity_ex_obb"; } if (Directory.Exists(outPath + "/ex_android_jl")) { Directory.Delete(outPath + "/ex_android_jl/", true); } EditorUserBuildSettings.exportAsGoogleAndroidProject = true; EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle; // 设置需要打包的场景 string launchScene = _sceneName; Debug.Log("打包场景:" + launchScene); BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); buildPlayerOptions.locationPathName = outPath; buildPlayerOptions.options = BuildOptions.None; buildPlayerOptions.options |= BuildOptions.AcceptExternalModificationsToPlayer; buildPlayerOptions.scenes = new[] { launchScene }; buildPlayerOptions.target = BuildTarget.Android; // 调用开始打包 BuildPipeline.BuildPlayer(buildPlayerOptions); Debug.Log("android工程导出路径"+ outPath + "/ex_android_jl"); Debug.Log("导出完成"); ///打开python工具所在路径 GameEditor.Core.DataConfig.ConfigExportWindow.OpenDirectory("C:/Users/aaa/Desktop/pythonPack"); } private static void ExportXcode(string _sceneName) { PlayerSettings.productName = "太初行"; string mainXcodePath = isZs? "/Volumes/ELEMENTS/JieLing/Packager/IOS/MHT_HW_RELEASE": "/Volumes/ELEMENTS/JieLing/Packager/IOS/MHT_HW_TEST"; string outPath = isZs?"/Volumes/ELEMENTS/JieLing/Packager/IOS/exXcodePro_Release":"/Volumes/ELEMENTS/JieLing/Packager/IOS/exXcodePro_Test"; if (Directory.Exists(outPath)) { Directory.Delete(outPath, true); } // 设置需要打包的场景 string launchScene = _sceneName; Debug.Log("打包场景:" + launchScene); BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); buildPlayerOptions.locationPathName = outPath; buildPlayerOptions.options = BuildOptions.None; buildPlayerOptions.options |= BuildOptions.AcceptExternalModificationsToPlayer; buildPlayerOptions.scenes = new[] { launchScene }; buildPlayerOptions.target = BuildTarget.iOS; // 调用开始打包 BuildPipeline.BuildPlayer(buildPlayerOptions); Debug.Log("打包完成"); Debug.Log("导出工程路径:"+ outPath); if (Directory.Exists(mainXcodePath)&& Directory.Exists(outPath)) { Debug.Log("替换xcode资源"); Directory.Delete(mainXcodePath+"/Data", true); Directory.Move(outPath+"/Data",mainXcodePath+"/Data"); Directory.Delete(mainXcodePath+"/Classes/Native", true); Directory.Move(outPath+"/Classes/Native",mainXcodePath+"/Classes/Native"); } } }