Files
plugin-library/Assets/00.StaryEvoTools/Editor/Build/BuildApkWindow.cs
zhangzheng 4d8a107012 111
2026-03-17 17:40:27 +08:00

234 lines
8.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;
namespace Stary.Evo.Editor
{
public class BuildApkWindow : OdinEditorWindow
{
public static OdinEditorWindow window;
[MenuItem("Evo/Dev/Apk打包工具", false, 4)]
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;
[HideLabel] [Title("包裹列表", titleAlignment: TitleAlignments.Centered)] [ValueDropdown("GetBuildPackageNames")]
public string selectedPackageNames;
[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>("HotfixMainResDomain");
if (hotfixMainResDomain == null)
{
Debug.LogError("HotfixMainResDomain 资源在Resources下不存在请检查");
return;
}
ChangePlayerSchema.SetPlayerMode(PLayerMode.HOST_PLAYMODE);
string packageName = "";
// 检测包名格式
if (!IsValidPackageName(selectedPackageNames))
{
// 不是有效包名格式,添加前缀 com.xosmo.
packageName = "com.xosmo." + selectedPackageNames;
// 设置包名和项目名
PlayerSettings.productName = selectedPackageNames;
PlayerSettings.applicationIdentifier = packageName;
}
else
{
// 分割包名字符串
string[] segments = selectedPackageNames.Split('.');
// 返回最后一个部分
packageName = segments[segments.Length - 1];
PlayerSettings.productName = packageName;
PlayerSettings.applicationIdentifier = selectedPackageNames;
}
string[] scenelist = default;
if (isWatermark)
{
scenelist = new[]
{
hotfixMainResDomain.projectInfo.loadingScenePath,
$"Assets/Main/main_{deviceType.ToString()}.unity"
};
PlayerSettings.productName += "_watermark";
PlayerSettings.applicationIdentifier += "_watermark";
Sprite xosmo = Resources.Load<Sprite>("logo");
PlayerSettings.virtualRealitySplashScreen = xosmo.texture;
PlayerSettings.SplashScreen.showUnityLogo = false;
PlayerSettings.SplashScreen.logos = new[]
{
PlayerSettings.SplashScreenLogo.Create(3f, xosmo),
};
}
else
{
scenelist = new[]
{
$"Assets/Main/main_{deviceType.ToString()}.unity"
};
PlayerSettings.virtualRealitySplashScreen = null;
PlayerSettings.SplashScreen.showUnityLogo = false;
PlayerSettings.SplashScreen.logos = null;
}
// 配置构建选项
// BuildPlayerOptions buildOptions = new BuildPlayerOptions
// {
// scenes = scenelist,
// locationPathName = $"Builds/Android/{PlayerSettings.productName}.apk",
// target = BuildTarget.Android,
// options = BuildOptions.None
// };
//
// // 执行打包
// var 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
}
/// <summary>
/// 检测当前所有包裹
/// </summary>
/// <returns></returns>
private List<string> GetBuildPackageNames()
{
List<string> result = new List<string>();
foreach (var name in CreatAssetWindow.GetCreatDomainAllName())
{
result.Add(name);
}
if (selectedPackageNames.IsNullOrEmpty())
{
if (result.Count > 0)
{
selectedPackageNames = result[0];
}
else
{
selectedPackageNames = "";
}
}
return result;
}
/// <summary>
/// 检测字符串是否是有效的包名格式
/// </summary>
/// <param name="packageName">要检测的字符串</param>
/// <returns>是否是有效的包名格式</returns>
private bool IsValidPackageName(string packageName)
{
if (string.IsNullOrEmpty(packageName))
return false;
// 包名只能包含小写字母、数字和点
foreach (char c in packageName)
{
if (!char.IsLower(c) && !char.IsDigit(c) && c != '.')
return false;
}
// 不能以点开头或结尾
if (packageName.StartsWith(".") || packageName.EndsWith("."))
return false;
// 不能包含连续的点
if (packageName.Contains(".."))
return false;
// 至少包含一个点
if (!packageName.Contains("."))
return false;
return true;
}
}
}