Files
plugin-library/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs

140 lines
4.6 KiB
C#
Raw Normal View History

2025-07-02 16:28:08 +08:00
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>("HotfixMainResDomain");
if (hotfixMainResDomain == null)
{
Debug.LogError("HotfixMainResDomain 资源在Resources下不存在请检查");
2025-07-02 17:58:55 +08:00
return;
2025-07-02 16:28:08 +08:00
}
2025-07-02 17:58:55 +08:00
if (hotfixMainResDomain.projectInfo.loadingScene == null)
{
Debug.LogError("HotfixMainResDomain 资源中loadingScene索引不存在请检查");
return;
}
2025-07-02 16:28:08 +08:00
// 设置包名和项目名
PlayerSettings.productName = hotfixMainResDomain.projectInfo.projectName;
PlayerSettings.applicationIdentifier = hotfixMainResDomain.projectInfo.projectPackageName;
2025-07-02 17:58:55 +08:00
// 获取loadingScene的Assets相对路径
string loadingScenePath = AssetDatabase.GetAssetPath(hotfixMainResDomain.projectInfo.loadingScene);
if (string.IsNullOrEmpty(loadingScenePath))
{
Debug.LogError("LoadingScene路径获取失败请检查场景资源设置");
return;
}
2025-07-02 16:28:08 +08:00
// 配置构建选项
BuildPlayerOptions buildOptions = new BuildPlayerOptions
{
scenes = new[]
{
2025-07-02 17:58:55 +08:00
$"{loadingScenePath}",
2025-07-02 16:28:08 +08:00
$"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
}
}