From 48d2b36d4e4bef2c88a76afe50c640be28e51975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Wed, 23 Jul 2025 15:38:29 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=E6=94=B9=E8=BF=9B=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E5=8A=A0=E5=AF=86=E5=92=8C=E8=A7=A3=E5=AF=86?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AssetBundleBuilderSetting.cs | 24 ++- .../AssetBundleBuilder/BuildParameters.cs | 8 +- .../BaseTasks/TaskCreateCatalog.cs | 4 +- .../BaseTasks/TaskCreateManifest.cs | 4 +- .../BaseTasks/TaskCreateReport.cs | 4 +- .../DefaultManifestServices.cs | 10 +- .../VisualViewers/BuildPipelineViewerBase.cs | 73 +++++++-- .../BuiltinBuildPipelineViewer.cs | 9 +- .../RawfileBuildPipelineViewer.cs | 9 +- .../ScriptableBuildPipelineViewer.cs | 9 +- .../AssetBundleReporter/ReportSummary.cs | 3 +- .../VisualViewers/ReporterSummaryViewer.cs | 3 +- .../DefaultBuildinFileSystem/CatalogTools.cs | 108 ++++++++++++ .../DefaultBuildinFileSystem.cs | 4 +- .../DefaultBuildinFileSystemBuild.cs | 155 ------------------ .../DefaultCacheFileSystem.cs | 4 +- .../DefaultWebRemoteFileSystem.cs | 4 +- .../DefaultWebServerFileSystem.cs | 4 +- .../Runtime/ResourcePackage/ManifestTools.cs | 4 +- .../Internal/DeserializeManifestOperation.cs | 4 +- .../Services/IManifestProcessServices.cs | 14 ++ ....meta => IManifestProcessServices.cs.meta} | 0 .../Services/IManifestRestoreServices.cs | 14 ++ .../IManifestRestoreServices.cs.meta} | 2 +- .../Runtime/Services/IManifestServices.cs | 19 --- 25 files changed, 268 insertions(+), 228 deletions(-) delete mode 100644 Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs create mode 100644 Assets/YooAsset/Runtime/Services/IManifestProcessServices.cs rename Assets/YooAsset/Runtime/Services/{IManifestServices.cs.meta => IManifestProcessServices.cs.meta} (100%) create mode 100644 Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs rename Assets/YooAsset/Runtime/{FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs.meta => Services/IManifestRestoreServices.cs.meta} (83%) delete mode 100644 Assets/YooAsset/Runtime/Services/IManifestServices.cs diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs index 4f1948b1..3bb0ad7b 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs @@ -79,15 +79,27 @@ namespace YooAsset.Editor EditorPrefs.SetString(key, encyptionClassName); } - // ManifestServicesClassName - public static string GetPackageManifestServicesClassName(string packageName, string buildPipeline) + // ManifestProcessServicesClassName + public static string GetPackageManifestProcessServicesClassName(string packageName, string buildPipeline) { - string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestServicesClassName"; - return EditorPrefs.GetString(key, $"{typeof(ManifestNone).FullName}"); + string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestProcessServicesClassName"; + return EditorPrefs.GetString(key, $"{typeof(ManifestProcessNone).FullName}"); } - public static void SetPackageManifestServicesClassName(string packageName, string buildPipeline, string encyptionClassName) + public static void SetPackageManifestProcessServicesClassName(string packageName, string buildPipeline, string encyptionClassName) { - string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestServicesClassName"; + string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestProcessServicesClassName"; + EditorPrefs.SetString(key, encyptionClassName); + } + + // ManifestRestoreServicesClassName + public static string GetPackageManifestRestoreServicesClassName(string packageName, string buildPipeline) + { + string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestRestoreServicesClassName"; + return EditorPrefs.GetString(key, $"{typeof(ManifestRestoreNone).FullName}"); + } + public static void SetPackageManifestRestoreServicesClassName(string packageName, string buildPipeline, string encyptionClassName) + { + string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestRestoreServicesClassName"; EditorPrefs.SetString(key, encyptionClassName); } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs index 58938c4f..95db7e3c 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs @@ -99,10 +99,14 @@ namespace YooAsset.Editor public IEncryptionServices EncryptionServices; /// - /// 资源清单服务类 + /// 资源清单加密服务类 /// - public IManifestServices ManifestServices; + public IManifestProcessServices ManifestProcessServices; + /// + /// 资源清单解密服务类 + /// + public IManifestRestoreServices ManifestRestoreServices; private string _pipelineOutputDirectory = string.Empty; private string _packageOutputDirectory = string.Empty; diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs index 03b8af32..e408a20e 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs @@ -14,8 +14,8 @@ namespace YooAsset.Editor { string buildinRootDirectory = buildParametersContext.GetBuildinRootDirectory(); string buildPackageName = buildParametersContext.Parameters.PackageName; - var manifestServices = buildParametersContext.Parameters.ManifestServices; - DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(manifestServices, buildPackageName, buildinRootDirectory); + var manifestServices = buildParametersContext.Parameters.ManifestRestoreServices; + CatalogTools.CreateCatalogFile(manifestServices, buildPackageName, buildinRootDirectory); // 刷新目录 AssetDatabase.Refresh(); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs index 5d5c6e62..d0e6efd1 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs @@ -72,7 +72,7 @@ namespace YooAsset.Editor { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion); packagePath = $"{packageOutputDirectory}/{fileName}"; - ManifestTools.SerializeToBinary(packagePath, manifest, buildParameters.ManifestServices); + ManifestTools.SerializeToBinary(packagePath, manifest, buildParameters.ManifestProcessServices); packageHash = HashUtility.FileCRC32(packagePath); BuildLogger.Log($"Create package manifest file: {packagePath}"); } @@ -97,7 +97,7 @@ namespace YooAsset.Editor { ManifestContext manifestContext = new ManifestContext(); byte[] bytesData = FileUtility.ReadAllBytes(packagePath); - manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData, buildParameters.ManifestServices); + manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData, buildParameters.ManifestRestoreServices); context.SetContextObject(manifestContext); } } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs index 79bf4f5d..7c1e5ce0 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs @@ -44,7 +44,9 @@ namespace YooAsset.Editor buildReport.Summary.SingleReferencedPackAlone = buildParameters.SingleReferencedPackAlone; buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle; buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName; - buildReport.Summary.ManifestServicesClassName = buildParameters.ManifestServices == null ? "null" : buildParameters.ManifestServices.GetType().FullName; + buildReport.Summary.ManifestProcessServicesClassName = buildParameters.ManifestProcessServices == null ? "null" : buildParameters.ManifestProcessServices.GetType().FullName; + buildReport.Summary.ManifestRestoreServicesClassName = buildParameters.ManifestRestoreServices == null ? "null" : buildParameters.ManifestRestoreServices.GetType().FullName; + if (buildParameters is BuiltinBuildParameters) { var builtinBuildParameters = buildParameters as BuiltinBuildParameters; diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs index 62ebc1ea..e423d246 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs @@ -1,13 +1,17 @@  namespace YooAsset.Editor { - public class ManifestNone : IManifestServices + public class ManifestProcessNone : IManifestProcessServices { - public byte[] ProcessManifest(byte[] fileData) + byte[] IManifestProcessServices.ProcessManifest(byte[] fileData) { return fileData; } - public byte[] RestoreManifest(byte[] fileData) + } + + public class ManifestRestoreNone : IManifestRestoreServices + { + byte[] IManifestRestoreServices.RestoreManifest(byte[] fileData) { return fileData; } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs index dce8b86b..4b65e3b5 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs @@ -44,7 +44,7 @@ namespace YooAsset.Editor } /// - /// 创建资源加密服务类实例 + /// 创建资源包加密服务类实例 /// protected IEncryptionServices CreateEncryptionServicesInstance() { @@ -58,15 +58,29 @@ namespace YooAsset.Editor } /// - /// 创建资源清单服务类实例 + /// 创建资源清单加密服务类实例 /// - protected IManifestServices CreateManifestServicesInstance() + protected IManifestProcessServices CreateManifestProcessServicesInstance() { - var className = AssetBundleBuilderSetting.GetPackageManifestServicesClassName(PackageName, PipelineName); - var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestServices)); + var className = AssetBundleBuilderSetting.GetPackageManifestProcessServicesClassName(PackageName, PipelineName); + var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestProcessServices)); var classType = classTypes.Find(x => x.FullName.Equals(className)); if (classType != null) - return (IManifestServices)Activator.CreateInstance(classType); + return (IManifestProcessServices)Activator.CreateInstance(classType); + else + return null; + } + + /// + /// 创建资源清单解密服务类实例 + /// + protected IManifestRestoreServices CreateManifestRestoreServicesInstance() + { + var className = AssetBundleBuilderSetting.GetPackageManifestRestoreServicesClassName(PackageName, PipelineName); + var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestRestoreServices)); + var classType = classTypes.Find(x => x.FullName.Equals(className)); + if (classType != null) + return (IManifestRestoreServices)Activator.CreateInstance(classType); else return null; } @@ -169,7 +183,7 @@ namespace YooAsset.Editor } protected PopupField CreateEncryptionServicesField(VisualElement container) { - // 加密服务类 + // 资源包加密服务类 var classTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); if (classTypes.Count > 0) { @@ -198,22 +212,22 @@ namespace YooAsset.Editor return popupField; } } - protected PopupField CreateManifestServicesField(VisualElement container) + protected PopupField CreateManifestProcessServicesField(VisualElement container) { - // 清单服务类 - var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestServices)); + // 资源清单加密服务类 + var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestProcessServices)); if (classTypes.Count > 0) { - var className = AssetBundleBuilderSetting.GetPackageManifestServicesClassName(PackageName, PipelineName); + var className = AssetBundleBuilderSetting.GetPackageManifestProcessServicesClassName(PackageName, PipelineName); int defaultIndex = classTypes.FindIndex(x => x.FullName.Equals(className)); if (defaultIndex < 0) defaultIndex = 0; var popupField = new PopupField(classTypes, defaultIndex); - popupField.label = "Manifest Services"; + popupField.label = "Manifest Process Services"; popupField.style.width = StyleWidth; popupField.RegisterValueChangedCallback(evt => { - AssetBundleBuilderSetting.SetPackageManifestServicesClassName(PackageName, PipelineName, popupField.value.FullName); + AssetBundleBuilderSetting.SetPackageManifestProcessServicesClassName(PackageName, PipelineName, popupField.value.FullName); }); container.Add(popupField); UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); @@ -222,7 +236,38 @@ namespace YooAsset.Editor else { var popupField = new PopupField(); - popupField.label = "Manifest Services"; + popupField.label = "Manifest Process Services"; + popupField.style.width = StyleWidth; + container.Add(popupField); + UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); + return popupField; + } + } + protected PopupField CreateManifestRestoreServicesField(VisualElement container) + { + // 资源清单加密服务类 + var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestRestoreServices)); + if (classTypes.Count > 0) + { + var className = AssetBundleBuilderSetting.GetPackageManifestRestoreServicesClassName(PackageName, PipelineName); + int defaultIndex = classTypes.FindIndex(x => x.FullName.Equals(className)); + if (defaultIndex < 0) + defaultIndex = 0; + var popupField = new PopupField(classTypes, defaultIndex); + popupField.label = "Manifest Restore Services"; + popupField.style.width = StyleWidth; + popupField.RegisterValueChangedCallback(evt => + { + AssetBundleBuilderSetting.SetPackageManifestRestoreServicesClassName(PackageName, PipelineName, popupField.value.FullName); + }); + container.Add(popupField); + UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); + return popupField; + } + else + { + var popupField = new PopupField(); + popupField.label = "Manifest Restore Services"; popupField.style.width = StyleWidth; container.Add(popupField); UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs index e1004451..df39d4e4 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs @@ -17,7 +17,8 @@ namespace YooAsset.Editor protected TextField _buildOutputField; protected TextField _buildVersionField; protected PopupField _encryptionServicesField; - protected PopupField _manifestServicesField; + protected PopupField _manifestProcessServicesField; + protected PopupField _manifestRestoreServicesField; protected EnumField _compressionField; protected EnumField _outputNameStyleField; protected EnumField _copyBuildinFileOptionField; @@ -47,7 +48,8 @@ namespace YooAsset.Editor // 服务类 var popupContainer = Root.Q("PopupContainer"); _encryptionServicesField = CreateEncryptionServicesField(popupContainer); - _manifestServicesField = CreateManifestServicesField(popupContainer); + _manifestProcessServicesField = CreateManifestProcessServicesField(popupContainer); + _manifestRestoreServicesField = CreateManifestRestoreServicesField(popupContainer); // 压缩方式选项 _compressionField = Root.Q("Compression"); @@ -120,7 +122,8 @@ namespace YooAsset.Editor buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.EncryptionServices = CreateEncryptionServicesInstance(); - buildParameters.ManifestServices = CreateManifestServicesInstance(); + buildParameters.ManifestProcessServices = CreateManifestProcessServicesInstance(); + buildParameters.ManifestRestoreServices = CreateManifestRestoreServicesInstance(); BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.cs index 300a1929..2383d14b 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.cs @@ -17,7 +17,8 @@ namespace YooAsset.Editor protected TextField _buildOutputField; protected TextField _buildVersionField; protected PopupField _encryptionServicesField; - protected PopupField _manifestServicesField; + protected PopupField _manifestProcessServicesField; + protected PopupField _manifestRestoreServicesField; protected EnumField _outputNameStyleField; protected EnumField _copyBuildinFileOptionField; protected TextField _copyBuildinFileTagsField; @@ -46,7 +47,8 @@ namespace YooAsset.Editor // 加密方法 var popupContainer = Root.Q("PopupContainer"); _encryptionServicesField = CreateEncryptionServicesField(popupContainer); - _manifestServicesField = CreateManifestServicesField(popupContainer); + _manifestProcessServicesField = CreateManifestProcessServicesField(popupContainer); + _manifestRestoreServicesField = CreateManifestRestoreServicesField(popupContainer); // 输出文件名称样式 _outputNameStyleField = Root.Q("FileNameStyle"); @@ -112,7 +114,8 @@ namespace YooAsset.Editor buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.EncryptionServices = CreateEncryptionServicesInstance(); - buildParameters.ManifestServices = CreateManifestServicesInstance(); + buildParameters.ManifestProcessServices = CreateManifestProcessServicesInstance(); + buildParameters.ManifestRestoreServices = CreateManifestRestoreServicesInstance(); RawFileBuildPipeline pipeline = new RawFileBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs index 99f38921..0cdcca38 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs @@ -17,7 +17,8 @@ namespace YooAsset.Editor protected TextField _buildOutputField; protected TextField _buildVersionField; protected PopupField _encryptionServicesField; - protected PopupField _manifestServicesField; + protected PopupField _manifestProcessServicesField; + protected PopupField _manifestRestoreServicesField; protected EnumField _compressionField; protected EnumField _outputNameStyleField; protected EnumField _copyBuildinFileOptionField; @@ -47,7 +48,8 @@ namespace YooAsset.Editor // 加密方法 var popupContainer = Root.Q("PopupContainer"); _encryptionServicesField = CreateEncryptionServicesField(popupContainer); - _manifestServicesField = CreateManifestServicesField(popupContainer); + _manifestProcessServicesField = CreateManifestProcessServicesField(popupContainer); + _manifestRestoreServicesField = CreateManifestRestoreServicesField(popupContainer); // 压缩方式选项 _compressionField = Root.Q("Compression"); @@ -122,7 +124,8 @@ namespace YooAsset.Editor buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.BuiltinShadersBundleName = builtinShaderBundleName; buildParameters.EncryptionServices = CreateEncryptionServicesInstance(); - buildParameters.ManifestServices = CreateManifestServicesInstance(); + buildParameters.ManifestProcessServices = CreateManifestProcessServicesInstance(); + buildParameters.ManifestRestoreServices = CreateManifestRestoreServicesInstance(); ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs index 893f43f9..1730d852 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs @@ -72,7 +72,8 @@ namespace YooAsset.Editor public bool EnableSharePackRule; public bool SingleReferencedPackAlone; public string EncryptionServicesClassName; - public string ManifestServicesClassName; + public string ManifestProcessServicesClassName; + public string ManifestRestoreServicesClassName; public EFileNameStyle FileNameStyle; // 引擎参数 diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs index 5f44e1bd..e34672a4 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs @@ -67,7 +67,8 @@ namespace YooAsset.Editor BindListViewItem("Enable Share Pack Rule", $"{buildReport.Summary.EnableSharePackRule}"); BindListViewItem("Single Referenced Pack Alone", $"{buildReport.Summary.SingleReferencedPackAlone}"); BindListViewItem("Encryption Services", buildReport.Summary.EncryptionServicesClassName); - BindListViewItem("Manifest Services", buildReport.Summary.ManifestServicesClassName); + BindListViewItem("Manifest Process Services", buildReport.Summary.ManifestProcessServicesClassName); + BindListViewItem("Manifest Restore Services", buildReport.Summary.ManifestRestoreServicesClassName); BindListViewItem("FileNameStyle", $"{buildReport.Summary.FileNameStyle}"); BindListViewItem("CompressOption", $"{buildReport.Summary.CompressOption}"); BindListViewItem("DisableWriteTypeTree", $"{buildReport.Summary.DisableWriteTypeTree}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs index 0d45e132..1b96888d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs @@ -7,6 +7,114 @@ namespace YooAsset { internal static class CatalogTools { +#if UNITY_EDITOR + /// + /// 生成包裹的内置资源目录文件 + /// 说明:根据指定目录下的文件生成清单文件。 + /// + public static bool CreateCatalogFile(IManifestRestoreServices services, string packageName, string packageDirectory) + { + // 获取资源清单版本 + string packageVersion; + { + string versionFileName = YooAssetSettingsData.GetPackageVersionFileName(packageName); + string versionFilePath = $"{packageDirectory}/{versionFileName}"; + if (File.Exists(versionFilePath) == false) + { + Debug.LogError($"Can not found package version file : {versionFilePath}"); + return false; + } + + packageVersion = FileUtility.ReadAllText(versionFilePath); + } + + // 加载资源清单文件 + PackageManifest packageManifest; + { + string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(packageName, packageVersion); + string manifestFilePath = $"{packageDirectory}/{manifestFileName}"; + if (File.Exists(manifestFilePath) == false) + { + Debug.LogError($"Can not found package manifest file : {manifestFilePath}"); + return false; + } + + var binaryData = FileUtility.ReadAllBytes(manifestFilePath); + packageManifest = ManifestTools.DeserializeFromBinary(binaryData, services); + } + + // 获取文件名映射关系 + Dictionary fileMapping = new Dictionary(); + { + foreach (var packageBundle in packageManifest.BundleList) + { + fileMapping.Add(packageBundle.FileName, packageBundle.BundleGUID); + } + } + + // 创建内置清单实例 + var buildinFileCatalog = new DefaultBuildinFileCatalog(); + buildinFileCatalog.FileVersion = CatalogDefine.FileVersion; + buildinFileCatalog.PackageName = packageName; + buildinFileCatalog.PackageVersion = packageVersion; + + // 创建白名单查询集合 + HashSet whiteFileList = new HashSet + { + "link.xml", + "buildlogtep.json", + $"{packageName}.version", + $"{packageName}_{packageVersion}.bytes", + $"{packageName}_{packageVersion}.hash", + $"{packageName}_{packageVersion}.json", + $"{packageName}_{packageVersion}.report", + DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName, + DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName + }; + + // 记录所有内置资源文件 + DirectoryInfo rootDirectory = new DirectoryInfo(packageDirectory); + FileInfo[] fileInfos = rootDirectory.GetFiles(); + foreach (var fileInfo in fileInfos) + { + if (fileInfo.Extension == ".meta") + continue; + + if (whiteFileList.Contains(fileInfo.Name)) + continue; + + string fileName = fileInfo.Name; + if (fileMapping.TryGetValue(fileName, out string bundleGUID)) + { + var wrapper = new DefaultBuildinFileCatalog.FileWrapper(); + wrapper.BundleGUID = bundleGUID; + wrapper.FileName = fileName; + buildinFileCatalog.Wrappers.Add(wrapper); + } + else + { + Debug.LogWarning($"Failed mapping file : {fileName}"); + } + } + + // 创建输出文件 + string jsonFilePath = $"{packageDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName}"; + if (File.Exists(jsonFilePath)) + File.Delete(jsonFilePath); + SerializeToJson(jsonFilePath, buildinFileCatalog); + + // 创建输出文件 + string binaryFilePath = $"{packageDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName}"; + if (File.Exists(binaryFilePath)) + File.Delete(binaryFilePath); + SerializeToBinary(binaryFilePath, buildinFileCatalog); + + UnityEditor.AssetDatabase.Refresh(); + Debug.Log($"Succeed to save catalog file : {binaryFilePath}"); + return true; + } +#endif + /// /// 序列化(JSON文件) /// diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index 61e2800b..751e767a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -92,7 +92,7 @@ namespace YooAsset /// /// 自定义参数:资源清单服务类 /// - public IManifestServices ManifestServices { private set; get; } + public IManifestRestoreServices ManifestServices { private set; get; } /// /// 自定义参数:拷贝内置文件服务类 @@ -186,7 +186,7 @@ namespace YooAsset } else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) { - ManifestServices = (IManifestServices)value; + ManifestServices = (IManifestRestoreServices)value; } else if (name == FileSystemParametersDefine.COPY_LOCAL_FILE_SERVICES) { diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs deleted file mode 100644 index 957dd678..00000000 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs +++ /dev/null @@ -1,155 +0,0 @@ -#if UNITY_EDITOR -using System.Collections.Generic; -using System.IO; -using UnityEngine; - -namespace YooAsset -{ - public class DefaultBuildinFileSystemBuild : UnityEditor.Build.IPreprocessBuildWithReport - { - public int callbackOrder { get { return 0; } } - - /// - /// 在构建应用程序前自动生成内置资源目录文件。 - /// 原理:搜索StreamingAssets目录下的所有资源文件,将这些文件信息写入文件,然后在运行时做查询用途。 - /// - public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report) - { - YooLogger.Log("Begin to create catalog file !"); - - string rootPath = YooAssetSettingsData.GetYooDefaultBuildinRoot(); - DirectoryInfo rootDirectory = new DirectoryInfo(rootPath); - if (rootDirectory.Exists == false) - { - Debug.LogWarning($"Can not found StreamingAssets root directory : {rootPath}"); - return; - } - - // 搜索所有Package目录 - DirectoryInfo[] subDirectories = rootDirectory.GetDirectories(); - foreach (var subDirectory in subDirectories) - { - string packageName = subDirectory.Name; - string pacakgeDirectory = subDirectory.FullName; - try - { - bool result = CreateBuildinCatalogFile(null, packageName, pacakgeDirectory); - if (result == false) - { - Debug.LogError($"Create package {packageName} catalog file failed ! See the detail error in console !"); - } - } - catch (System.Exception ex) - { - Debug.LogError($"Create package {packageName} catalog file failed ! {ex.Message}"); - } - } - } - - /// - /// 生成包裹的内置资源目录文件 - /// - public static bool CreateBuildinCatalogFile(IManifestServices services, string packageName, string packageDirectory) - { - // 获取资源清单版本 - string packageVersion; - { - string versionFileName = YooAssetSettingsData.GetPackageVersionFileName(packageName); - string versionFilePath = $"{packageDirectory}/{versionFileName}"; - if (File.Exists(versionFilePath) == false) - { - Debug.LogError($"Can not found package version file : {versionFilePath}"); - return false; - } - - packageVersion = FileUtility.ReadAllText(versionFilePath); - } - - // 加载资源清单文件 - PackageManifest packageManifest; - { - string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(packageName, packageVersion); - string manifestFilePath = $"{packageDirectory}/{manifestFileName}"; - if (File.Exists(manifestFilePath) == false) - { - Debug.LogError($"Can not found package manifest file : {manifestFilePath}"); - return false; - } - - var binaryData = FileUtility.ReadAllBytes(manifestFilePath); - packageManifest = ManifestTools.DeserializeFromBinary(binaryData, services); - } - - // 获取文件名映射关系 - Dictionary fileMapping = new Dictionary(); - { - foreach (var packageBundle in packageManifest.BundleList) - { - fileMapping.Add(packageBundle.FileName, packageBundle.BundleGUID); - } - } - - // 创建内置清单实例 - var buildinFileCatalog = new DefaultBuildinFileCatalog(); - buildinFileCatalog.FileVersion = CatalogDefine.FileVersion; - buildinFileCatalog.PackageName = packageName; - buildinFileCatalog.PackageVersion = packageVersion; - - // 创建白名单查询集合 - HashSet whiteFileList = new HashSet - { - "link.xml", - "buildlogtep.json", - $"{packageName}.version", - $"{packageName}_{packageVersion}.bytes", - $"{packageName}_{packageVersion}.hash", - $"{packageName}_{packageVersion}.json", - $"{packageName}_{packageVersion}.report", - DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName, - DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName - }; - - // 记录所有内置资源文件 - DirectoryInfo rootDirectory = new DirectoryInfo(packageDirectory); - FileInfo[] fileInfos = rootDirectory.GetFiles(); - foreach (var fileInfo in fileInfos) - { - if (fileInfo.Extension == ".meta") - continue; - - if (whiteFileList.Contains(fileInfo.Name)) - continue; - - string fileName = fileInfo.Name; - if (fileMapping.TryGetValue(fileName, out string bundleGUID)) - { - var wrapper = new DefaultBuildinFileCatalog.FileWrapper(); - wrapper.BundleGUID = bundleGUID; - wrapper.FileName = fileName; - buildinFileCatalog.Wrappers.Add(wrapper); - } - else - { - Debug.LogWarning($"Failed mapping file : {fileName}"); - } - } - - // 创建输出文件 - string jsonFilePath = $"{packageDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName}"; - if (File.Exists(jsonFilePath)) - File.Delete(jsonFilePath); - CatalogTools.SerializeToJson(jsonFilePath, buildinFileCatalog); - - // 创建输出文件 - string binaryFilePath = $"{packageDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName}"; - if (File.Exists(binaryFilePath)) - File.Delete(binaryFilePath); - CatalogTools.SerializeToBinary(binaryFilePath, buildinFileCatalog); - - UnityEditor.AssetDatabase.Refresh(); - Debug.Log($"Succeed to save buildin file catalog : {binaryFilePath}"); - return true; - } - } -} -#endif \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index cc78c4f0..fa6ff31d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -108,7 +108,7 @@ namespace YooAsset /// /// 自定义参数:资源清单服务类 /// - public IManifestServices ManifestServices { private set; get; } + public IManifestRestoreServices ManifestServices { private set; get; } /// /// 自定义参数:拷贝内置文件服务类 @@ -253,7 +253,7 @@ namespace YooAsset } else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) { - ManifestServices = (IManifestServices)value; + ManifestServices = (IManifestRestoreServices)value; } else if (name == FileSystemParametersDefine.COPY_LOCAL_FILE_SERVICES) { diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs index e956ac3a..99e97cda 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs @@ -56,7 +56,7 @@ namespace YooAsset /// /// 自定义参数:资源清单服务类 /// - public IManifestServices ManifestServices { private set; get; } + public IManifestRestoreServices ManifestServices { private set; get; } #endregion @@ -118,7 +118,7 @@ namespace YooAsset } else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) { - ManifestServices = (IManifestServices)value; + ManifestServices = (IManifestRestoreServices)value; } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs index 149d6c6b..0d2a211e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs @@ -65,7 +65,7 @@ namespace YooAsset /// /// 自定义参数:资源清单服务类 /// - public IManifestServices ManifestServices { private set; get; } + public IManifestRestoreServices ManifestServices { private set; get; } #endregion @@ -123,7 +123,7 @@ namespace YooAsset } else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) { - ManifestServices = (IManifestServices)value; + ManifestServices = (IManifestRestoreServices)value; } else { diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs index e7f71754..65729273 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs @@ -44,7 +44,7 @@ namespace YooAsset /// /// 序列化(二进制文件) /// - public static void SerializeToBinary(string savePath, PackageManifest manifest, IManifestServices services) + public static void SerializeToBinary(string savePath, PackageManifest manifest, IManifestProcessServices services) { using (FileStream fs = new FileStream(savePath, FileMode.Create)) { @@ -124,7 +124,7 @@ namespace YooAsset /// /// 反序列化(二进制文件) /// - public static PackageManifest DeserializeFromBinary(byte[] binaryData, IManifestServices services) + public static PackageManifest DeserializeFromBinary(byte[] binaryData, IManifestRestoreServices services) { // 创建缓存器 BufferReader buffer; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs index 50689ea9..5ab3f406 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs @@ -20,7 +20,7 @@ namespace YooAsset Done, } - private readonly IManifestServices _services; + private readonly IManifestRestoreServices _services; private byte[] _sourceData; private BufferReader _buffer; private int _packageAssetCount; @@ -33,7 +33,7 @@ namespace YooAsset /// public PackageManifest Manifest { private set; get; } - public DeserializeManifestOperation(IManifestServices services, byte[] binaryData) + public DeserializeManifestOperation(IManifestRestoreServices services, byte[] binaryData) { _services = services; _sourceData = binaryData; diff --git a/Assets/YooAsset/Runtime/Services/IManifestProcessServices.cs b/Assets/YooAsset/Runtime/Services/IManifestProcessServices.cs new file mode 100644 index 00000000..76fd42ac --- /dev/null +++ b/Assets/YooAsset/Runtime/Services/IManifestProcessServices.cs @@ -0,0 +1,14 @@ + +namespace YooAsset +{ + /// + /// 资源清单文件处理服务接口 + /// + public interface IManifestProcessServices + { + /// + /// 处理资源清单(压缩或加密) + /// + byte[] ProcessManifest(byte[] fileData); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/Services/IManifestServices.cs.meta b/Assets/YooAsset/Runtime/Services/IManifestProcessServices.cs.meta similarity index 100% rename from Assets/YooAsset/Runtime/Services/IManifestServices.cs.meta rename to Assets/YooAsset/Runtime/Services/IManifestProcessServices.cs.meta diff --git a/Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs b/Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs new file mode 100644 index 00000000..4fc3599e --- /dev/null +++ b/Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs @@ -0,0 +1,14 @@ + +namespace YooAsset +{ + /// + /// 资源清单文件处理服务接口 + /// + public interface IManifestRestoreServices + { + /// + /// 还原资源清单(解压或解密) + /// + byte[] RestoreManifest(byte[] fileData); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs.meta b/Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs.meta similarity index 83% rename from Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs.meta rename to Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs.meta index 5400d792..4fd5c835 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs.meta +++ b/Assets/YooAsset/Runtime/Services/IManifestRestoreServices.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6b5abe115ebfe1344b674db78b2edf6c +guid: b17060f9f11771e4cbcb0201fce446e6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/YooAsset/Runtime/Services/IManifestServices.cs b/Assets/YooAsset/Runtime/Services/IManifestServices.cs deleted file mode 100644 index 0b7c65d1..00000000 --- a/Assets/YooAsset/Runtime/Services/IManifestServices.cs +++ /dev/null @@ -1,19 +0,0 @@ - -namespace YooAsset -{ - /// - /// 资源清单文件处理服务接口 - /// - public interface IManifestServices - { - /// - /// 处理资源清单(压缩和加密) - /// - byte[] ProcessManifest(byte[] fileData); - - /// - /// 还原资源清单(解压和解密) - /// - byte[] RestoreManifest(byte[] fileData); - } -} \ No newline at end of file