using System; using System.Collections.Generic; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Stary.Evo; using UnityEditor; using UnityEditor.Build.Reporting; using UnityEngine; using BuildReport = UnityEditor.Build.Reporting.BuildReport; public class BuildApkWindow : OdinEditorWindow { public static OdinEditorWindow window; [MenuItem("Evo/Apk打包工具")] static void ShowWindows() { window = (BuildApkWindow)EditorWindow.GetWindow(typeof(BuildApkWindow)); window.maxSize = new Vector2(400, 500); window.Show(); } protected override void Initialize() { base.Initialize(); buildApkLocalEntity = new BuildApkEntity(BuildAndroid, BuildAndroid); buildApkServerEntity = new BuildApkEntity(BuildAndroid, BuildAndroid); buildApkWatermarkEntity = new BuildApkEntity(BuildAndroid, BuildAndroid); } [EnumToggleButtons, HideLabel] public DeviceType deviceType; [BoxGroup("Build(清空打包缓存)", centerLabel: true, order: 1)] [Button("清空打包缓存")] void OnClearCache() { // 清理Library缓存目录 // 使用System.IO删除 // try { // System.IO.Directory.Delete(Application.dataPath + "/../Library/AssetImportState", true); // Debug.Log("成功删除AssetImportState"); // } catch (System.Exception e) { // Debug.LogError($"删除失败: {e.Message}"); // } // 使用System.IO删除 try { System.IO.Directory.Delete(Application.dataPath + "/../Library/BuildCache", true); Debug.Log("成功删除BuildCache"); } catch (System.Exception e) { Debug.LogError($"删除失败: {e.Message}"); } // 使用System.IO删除 try { System.IO.Directory.Delete(Application.dataPath + "/../Library/ScriptAssemblies", true); Debug.Log("成功删除ScriptAssemblies"); } catch (System.Exception e) { Debug.LogError($"删除失败: {e.Message}"); } AssetDatabase.Refresh(); EditorUtility.DisplayDialog("缓存清理", "已成功清除所有打包缓存文件", "确定"); } [BoxGroup("Build(普通包\\服务器本地包)", centerLabel: true, order: 2), HideLabel] public BuildApkEntity buildApkLocalEntity; [BoxGroup("Build(服务器热更包)", centerLabel: true, order: 3), HideLabel] public BuildApkEntity buildApkServerEntity; [BoxGroup("Build(水印包)", centerLabel: true, order: 4), HideLabel] public BuildApkEntity buildApkWatermarkEntity; public void BuildAndroid() { HotfixMainResDomain hotfixMainResDomain = Resources.Load("HotfixMainResDomain"); if (hotfixMainResDomain == null) { Debug.LogError("HotfixMainResDomain 资源在Resources下不存在,请检查!"); return; } if (hotfixMainResDomain.projectInfo.loadingScene == null) { Debug.LogError("HotfixMainResDomain 资源中loadingScene索引不存在,请检查!"); return; } // 设置包名和项目名 PlayerSettings.productName = hotfixMainResDomain.projectInfo.projectName; PlayerSettings.applicationIdentifier = hotfixMainResDomain.projectInfo.projectPackageName; // 获取loadingScene的Assets相对路径 string loadingScenePath = AssetDatabase.GetAssetPath(hotfixMainResDomain.projectInfo.loadingScene); if (string.IsNullOrEmpty(loadingScenePath)) { Debug.LogError("LoadingScene路径获取失败,请检查场景资源设置"); return; } // 配置构建选项 BuildPlayerOptions buildOptions = new BuildPlayerOptions { scenes = new[] { $"{loadingScenePath}", $"Assets/Main/main_{deviceType.ToString()}.unity" }, locationPathName = $"Builds/Android/{PlayerSettings.applicationIdentifier}.apk", target = BuildTarget.Android, options = BuildOptions.None }; // 执行打包 BuildReport report = BuildPipeline.BuildPlayer(buildOptions); BuildSummary summary = report.summary; if (summary.result == BuildResult.Succeeded) { Debug.Log("Build succeeded: " + summary.totalSize + " bytes"); } if (summary.result == BuildResult.Failed) { Debug.LogError("Build failed"); } } public enum DeviceType { Xreal, Rokid } }