From 6dea74ee0f6c8d457222a3cb38f0c026daae61da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Thu, 13 Nov 2025 20:42:10 +0800 Subject: [PATCH] modify --- Client/Assets/Editor/BuildCLI.meta | 3 + .../Assets/Editor/BuildCLI/AppBuildHelper.cs | 98 +++++++++++++ .../Editor/BuildCLI/AppBuildHelper.cs.meta | 3 + .../Assets/Editor/BuildCLI/BuildParameter.cs | 83 +++++++++++ .../Editor/BuildCLI/BuildParameter.cs.meta | 3 + .../Editor/BuildCLI/ResourceBuildHelper.cs | 135 ++++++++++++++++++ .../BuildCLI/ResourceBuildHelper.cs.meta | 3 + Client/Assets/Editor/SAOL1.Editor.asmdef | 6 +- .../com.alicizax.unity.editor.extension | 2 +- 9 files changed, 331 insertions(+), 5 deletions(-) create mode 100644 Client/Assets/Editor/BuildCLI.meta create mode 100644 Client/Assets/Editor/BuildCLI/AppBuildHelper.cs create mode 100644 Client/Assets/Editor/BuildCLI/AppBuildHelper.cs.meta create mode 100644 Client/Assets/Editor/BuildCLI/BuildParameter.cs create mode 100644 Client/Assets/Editor/BuildCLI/BuildParameter.cs.meta create mode 100644 Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs create mode 100644 Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs.meta diff --git a/Client/Assets/Editor/BuildCLI.meta b/Client/Assets/Editor/BuildCLI.meta new file mode 100644 index 0000000..cdbc8ab --- /dev/null +++ b/Client/Assets/Editor/BuildCLI.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 69ea7963a8cfa4645b9345e57aef8331 +timeCreated: 1737867267 \ No newline at end of file diff --git a/Client/Assets/Editor/BuildCLI/AppBuildHelper.cs b/Client/Assets/Editor/BuildCLI/AppBuildHelper.cs new file mode 100644 index 0000000..184f71f --- /dev/null +++ b/Client/Assets/Editor/BuildCLI/AppBuildHelper.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using AlicizaX.Editor; +using AlicizaX; +using AlicizaX.Debugger.Runtime; +using AlicizaX.Framework.Runtime.ABase; +using UnityEditor; +using UnityEngine; + +public static class AppBuildHelper +{ + public static void GeneratAppBuilderSetting(string language, DebuggerActiveWindowType debugMode, int resMode) + { + const string AppBuilderSettingPath = "Assets/Resources/ModuleDynamicBindInfo.bytes"; + ModuleDynamicBindInfo appBuilderSetting = new ModuleDynamicBindInfo(); + appBuilderSetting.Language = language; + appBuilderSetting.DebuggerActiveWindowType = debugMode; + appBuilderSetting.ResMode = resMode; + File.WriteAllText(AppBuilderSettingPath, Utility.Json.ToJson(appBuilderSetting)); + } + + public static void BuildApplication(AppBuildParameter appBuildParameter, bool showExplorer = false) + { + if (!Directory.Exists(appBuildParameter.OutPutPath)) + { + Directory.CreateDirectory(appBuildParameter.OutPutPath); + } + + Debug.Log("Starting build application"); + + GeneratAppBuilderSetting(appBuildParameter.Language, appBuildParameter.ShowDebugWnd, appBuildParameter.ResMode); + + Debug.Log("Generate AppBuilderSetting.bytes"); + + PlayerSettings.fullScreenMode = appBuildParameter.FullScreenMode; + if (appBuildParameter.FullScreenMode == FullScreenMode.Windowed) + { + PlayerSettings.defaultScreenWidth = appBuildParameter.WindowedScreenSize.x; + PlayerSettings.defaultScreenHeight = appBuildParameter.WindowedScreenSize.y; + } + + if (!string.IsNullOrEmpty(appBuildParameter.Version)) + { + } + + try + { + var options = new BuildPlayerOptions + { + scenes = appBuildParameter.Scenes, + locationPathName = Path.Combine(appBuildParameter.OutPutPath, appBuildParameter.FileName), + target = appBuildParameter.BuildTarget, + options = appBuildParameter.DevelopBuild ? BuildOptions.Development : BuildOptions.None + }; + + var report = BuildPipeline.BuildPlayer(options); + HandleBuildReport(report); + if (showExplorer) + { + DirectoryInfo directoryInfo = Directory.GetParent(report.summary.outputPath); + if (directoryInfo != null) OpenFolder.Execute(directoryInfo.FullName); + } + } + catch (Exception e) + { + Debug.Log($"构建过程中发生异常: {e.Message}"); + } + } + + private static void HandleBuildReport(UnityEditor.Build.Reporting.BuildReport report) + { + if (report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded) + { + Debug.Log($"整包构建完成:${report.summary.outputPath}"); + } + else + { +#if UNITY_2023_1_OR_NEWER + Debug.LogError(report.SummarizeErrors()); +#else + var errors = new List(); + foreach (var step in report.steps) + { + foreach (var msg in step.messages) + { + if (msg.type == LogType.Error || msg.type == LogType.Exception) + { + errors.Add($"[Step: {step.name}] {msg.content}"); + } + } + } + Debug.LogError($"构建失败,错误信息:\n{string.Join("\n", errors)}"); +#endif + } + } +} diff --git a/Client/Assets/Editor/BuildCLI/AppBuildHelper.cs.meta b/Client/Assets/Editor/BuildCLI/AppBuildHelper.cs.meta new file mode 100644 index 0000000..1bd56d3 --- /dev/null +++ b/Client/Assets/Editor/BuildCLI/AppBuildHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 154ce1f8cc3455246af4a6501d246f02 +timeCreated: 1740128549 \ No newline at end of file diff --git a/Client/Assets/Editor/BuildCLI/BuildParameter.cs b/Client/Assets/Editor/BuildCLI/BuildParameter.cs new file mode 100644 index 0000000..8b42833 --- /dev/null +++ b/Client/Assets/Editor/BuildCLI/BuildParameter.cs @@ -0,0 +1,83 @@ +using System; +using AlicizaX; +using AlicizaX.Debugger.Runtime; +using UnityEditor; +using UnityEngine; +using UnityEngine.Serialization; +using YooAsset; +using YooAsset.Editor; + + +public class AppBuildParameter +{ + public BuildTarget BuildTarget; + public string OutPutPath; + public DebuggerActiveWindowType ShowDebugWnd; + public bool DevelopBuild; + public int ResMode; + public string FileName; + public string Language; + public string[] Scenes; + + /// + /// 版本 + /// + public string Version; + + /// + /// 是否全屏 + /// + public FullScreenMode FullScreenMode; + + /// + /// 窗口化大小 + /// + public Vector2Int WindowedScreenSize; +} + + +public class ResourceBuildParameter +{ + public BuildTarget ResourceBuildTarget; + public string PackageVersion; + public bool UseDefaultPackageVersion; + public string OutputPath; + public ResourceBuildMode BuildMode; + + public ECompressOption CompressOption = ECompressOption.LZ4; + public EFileNameStyle FileNameStyle = EFileNameStyle.BundleName_HashName; + + /// + /// 从文件头里剥离Unity版本信息 + /// + public bool StripUnityVersion = false; + + /// + /// 禁止写入类型树结构(可以降低包体和内存并提高加载效率) + /// + public bool DisableWriteTypeTree = false; + + /// + /// 忽略类型树变化(无效参数) + /// + public bool IgnoreTypeTreeChanges = true; + + /// + /// 使用可寻址地址代替资源路径 + /// 说明:开启此项可以节省运行时清单占用的内存! + /// + public bool ReplaceAssetPathWithAddress = false; + + /// + /// 自动建立资源对象对图集的依赖关系 + /// + public bool TrackSpriteAtlasDependencies = false; + + public string EncryptionServiceType = "AlicizaX.Resource.Editor.FileOffsetEncryption"; +} + +public enum ResourceBuildMode +{ + Offline, + Online, +} diff --git a/Client/Assets/Editor/BuildCLI/BuildParameter.cs.meta b/Client/Assets/Editor/BuildCLI/BuildParameter.cs.meta new file mode 100644 index 0000000..947c929 --- /dev/null +++ b/Client/Assets/Editor/BuildCLI/BuildParameter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4d5b605d55cc82844b76260841f92475 +timeCreated: 1741577226 \ No newline at end of file diff --git a/Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs b/Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs new file mode 100644 index 0000000..41bddf3 --- /dev/null +++ b/Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; +using YooAsset; +using YooAsset.Editor; + +public static class ResourceBuildHelper +{ + private const bool EnableSharePack = true; + private const string BuildPackageName = "DefaultPackage"; + + private static string GeneratePackageVersion() + { + int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute; + return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes; + } + + public static void BuildResourcePackage(ResourceBuildParameter buildParameter) + { + if (!Directory.Exists(buildParameter.OutputPath)) + { + Directory.CreateDirectory(buildParameter.OutputPath); + } + + try + { + string copyParams = string.Empty; + EBuildinFileCopyOption copyOption = EBuildinFileCopyOption.None; + if (buildParameter.BuildMode == ResourceBuildMode.Online) + { + copyOption = EBuildinFileCopyOption.ClearAndCopyByTags; + copyParams = "Launch"; + } + else + { + copyOption = EBuildinFileCopyOption.ClearAndCopyAll; + } + + var parameters = new ScriptableBuildParameters + { + BuildOutputRoot = buildParameter.OutputPath, + BuildTarget = buildParameter.ResourceBuildTarget, + PackageName = BuildPackageName, + BuildBundleType = (int)EBuildBundleType.AssetBundle, + BuildPipeline = EBuildPipeline.ScriptableBuildPipeline.ToString(), + BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(), + PackageVersion = buildParameter.UseDefaultPackageVersion ? GeneratePackageVersion() : buildParameter.PackageVersion, + CompressOption = buildParameter.CompressOption, + BuiltinShadersBundleName = GetBuiltinShaderBundleName(), + VerifyBuildingResult = true, + ClearBuildCacheFiles = false, + BuildinFileCopyOption = copyOption, + BuildinFileCopyParams = copyParams, + EnableSharePackRule = EnableSharePack, + FileNameStyle = buildParameter.FileNameStyle, + EncryptionServices = CreateEncryptionInstance(buildParameter.EncryptionServiceType), + ReplaceAssetPathWithAddress = buildParameter.ReplaceAssetPathWithAddress, + StripUnityVersion = buildParameter.StripUnityVersion, + DisableWriteTypeTree = buildParameter.DisableWriteTypeTree, + IgnoreTypeTreeChanges = buildParameter.IgnoreTypeTreeChanges, + TrackSpriteAtlasDependencies = buildParameter.TrackSpriteAtlasDependencies, + }; + + ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline(); + var report = pipeline.Run(parameters, true); + + if (report.Success) + { + // if (_copyAfterBuild && !string.IsNullOrEmpty(_copyDestination)) + // { + // CopyFiles(report.OutputPackageDirectory, _copyDestination); + // } + Debug.Log($"AB包构建完成!\n输出目录: {report.OutputPackageDirectory}"); + } + else + { + Debug.Log($"错误信息: {report.ErrorInfo}"); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + + /// + /// 内置着色器资源包名称 + /// 注意:和自动收集的着色器资源包名保持一致! + /// + private static string GetBuiltinShaderBundleName() + { + var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName; + var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult(); + return packRuleResult.GetBundleName(BuildPackageName, uniqueBundleName); + } + + private static void CopyFiles(string source, string destination) + { + try + { + if (!Directory.Exists(destination)) + { + Directory.CreateDirectory(destination); + } + + foreach (string file in Directory.GetFiles(source)) + { + File.Copy(file, Path.Combine(destination, Path.GetFileName(file)), true); + } + + Debug.Log($"文件拷贝完成: {source} -> {destination}"); + } + catch (Exception e) + { + Debug.LogError($"文件拷贝失败: {e.Message}"); + } + } + + private static IEncryptionServices CreateEncryptionInstance(string encryptionService) + { + if (string.IsNullOrEmpty(encryptionService)) return null; + + var type = Type.GetType(encryptionService); + if (type != null) + { + return (IEncryptionServices)Activator.CreateInstance(type); + } + + return null; + } +} diff --git a/Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs.meta b/Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs.meta new file mode 100644 index 0000000..ec1cb06 --- /dev/null +++ b/Client/Assets/Editor/BuildCLI/ResourceBuildHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0418e1e75999064ca53a72ff542a08c +timeCreated: 1740128311 \ No newline at end of file diff --git a/Client/Assets/Editor/SAOL1.Editor.asmdef b/Client/Assets/Editor/SAOL1.Editor.asmdef index 958e562..de2626c 100644 --- a/Client/Assets/Editor/SAOL1.Editor.asmdef +++ b/Client/Assets/Editor/SAOL1.Editor.asmdef @@ -3,15 +3,13 @@ "rootNamespace": "SAOL1.Editor", "references": [ "GUID:8d62da4aabd2a19419c7378d23ea5849", - "GUID:75b6f2078d190f14dbda4a5b747d709c", - "GUID:a19b414bea3b97240a91aeab9a8eab36", "GUID:99a2a63c2a1143c4ba448165a98a5108", "GUID:e34a5702dd353724aa315fb8011f08c3", "GUID:4d1926c9df5b052469a1c63448b7609a", - "GUID:acfef7cabed3b0a42b25edb1cd4fa259", "GUID:2373f786d14518f44b0f475db77ba4de", "GUID:82bdcc42401007348aadb37dd5adc131", - "GUID:1619e00706139ce488ff80c0daeea8e7" + "GUID:1619e00706139ce488ff80c0daeea8e7", + "GUID:fb064c8bf96bac94e90d2f39090daa94" ], "includePlatforms": [ "Editor" diff --git a/Client/Packages/com.alicizax.unity.editor.extension b/Client/Packages/com.alicizax.unity.editor.extension index 2803678..d124be0 160000 --- a/Client/Packages/com.alicizax.unity.editor.extension +++ b/Client/Packages/com.alicizax.unity.editor.extension @@ -1 +1 @@ -Subproject commit 28036786c8ddfe5be745e698746f3673e6cb2985 +Subproject commit d124be0855fb459853b8dac3f9e2d7bf123b03d8