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(false); }, null); buildApkServerEntity = new BuildApkEntity(null, null); buildApkWatermarkEntity = new BuildApkEntity(() => { BuildAndroid(true); }, null); } [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(bool isWatermark) { HotfixMainResDomain hotfixMainResDomain = Resources.Load("HotfixMainResDomain"); if (hotfixMainResDomain == null) { Debug.LogError("HotfixMainResDomain 资源在Resources下不存在,请检查!"); return; } // 设置包名和项目名 PlayerSettings.productName = hotfixMainResDomain.projectInfo.projectName; PlayerSettings.applicationIdentifier = hotfixMainResDomain.projectInfo.projectPackageName; string[] scenelist = default; if (isWatermark) { scenelist = new[] { hotfixMainResDomain.projectInfo.loadingScenePath, $"Assets/Main/main_{deviceType.ToString()}.unity" }; PlayerSettings.applicationIdentifier += "_watermark"; } else { scenelist = new[] { $"Assets/Main/main_{deviceType.ToString()}.unity" }; } // 配置构建选项 BuildPlayerOptions buildOptions = new BuildPlayerOptions { scenes = scenelist, 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 } }