From ed89e73d26d577eb3bf59866054ad16fc870b16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Fri, 20 Jun 2025 11:36:29 +0800 Subject: [PATCH] fix #576 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 资源清单加密和解密 --- .../AssetBundleBuilderSetting.cs | 24 +++-- .../AssetBundleBuilder/BuildParameters.cs | 5 + .../BaseTasks/TaskCreateCatalog.cs | 3 +- .../BaseTasks/TaskCreateManifest.cs | 12 +-- .../BaseTasks/TaskCreateReport.cs | 3 +- ...yption.cs => DefaultEncryptionServices.cs} | 0 ...meta => DefaultEncryptionServices.cs.meta} | 0 .../DefaultManifestServices.cs | 15 +++ .../DefaultManifestServices.cs.meta | 11 +++ .../VisualViewers/BuildPipelineViewerBase.cs | 95 ++++++++++++++----- .../BuiltinBuildPipelineViewer.cs | 13 ++- .../BuiltinBuildPipelineViewer.uxml | 2 +- .../EditorSimulateBuildPipelineViewer.cs | 1 - .../RawfileBuildPipelineViewer.cs | 11 ++- .../RawfileBuildPipelineViewer.uxml | 2 +- .../ScriptableBuildPipelineViewer.cs | 11 ++- .../ScriptableBuildPipelineViewer.uxml | 2 +- .../AssetBundleReporter/ReportSummary.cs | 5 +- .../VisualViewers/ReporterSummaryViewer.cs | 3 +- .../DefaultBuildinFileSystem.cs | 9 ++ .../DefaultBuildinFileSystemBuild.cs | 21 ++-- .../Operation/DBFSInitializeOperation.cs | 4 +- .../LoadBuildinPackageManifestOperation.cs | 2 +- .../DefaultCacheFileSystem.cs | 11 ++- .../LoadCachePackageManifestOperation.cs | 2 +- .../LoadEditorPackageManifestOperation.cs | 2 +- .../DefaultWebRemoteFileSystem.cs | 11 ++- .../LoadWebRemotePackageManifestOperation.cs | 2 +- .../DefaultWebServerFileSystem.cs | 9 ++ .../Operation/DWSFSInitializeOperation.cs | 4 +- .../LoadWebServerPackageManifestOperation.cs | 2 +- .../FileSystem/FileSystemParametersDefine.cs | 1 + .../Runtime/ResourcePackage/ManifestTools.cs | 32 +++++-- .../Internal/DeserializeManifestOperation.cs | 25 ++++- .../Runtime/Services/IManifestServices.cs | 19 ++++ .../Services/IManifestServices.cs.meta | 11 +++ .../YooAsset/Runtime/Utility/BufferWriter.cs | 10 ++ 37 files changed, 310 insertions(+), 85 deletions(-) rename Assets/YooAsset/Editor/AssetBundleBuilder/{DefaultEncryption.cs => DefaultEncryptionServices.cs} (100%) rename Assets/YooAsset/Editor/AssetBundleBuilder/{DefaultEncryption.cs.meta => DefaultEncryptionServices.cs.meta} (100%) create mode 100644 Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs create mode 100644 Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta create mode 100644 Assets/YooAsset/Runtime/Services/IManifestServices.cs create mode 100644 Assets/YooAsset/Runtime/Services/IManifestServices.cs.meta diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs index 671722b4..4f1948b1 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs @@ -67,15 +67,27 @@ namespace YooAsset.Editor EditorPrefs.SetString(key, buildinFileCopyParams); } - // EncyptionClassName - public static string GetPackageEncyptionClassName(string packageName, string buildPipeline) + // EncyptionServicesClassName + public static string GetPackageEncyptionServicesClassName(string packageName, string buildPipeline) { - string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName"; - return EditorPrefs.GetString(key, string.Empty); + string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionServicesClassName"; + return EditorPrefs.GetString(key, $"{typeof(EncryptionNone).FullName}"); } - public static void SetPackageEncyptionClassName(string packageName, string buildPipeline, string encyptionClassName) + public static void SetPackageEncyptionServicesClassName(string packageName, string buildPipeline, string encyptionClassName) { - string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName"; + string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionServicesClassName"; + EditorPrefs.SetString(key, encyptionClassName); + } + + // ManifestServicesClassName + public static string GetPackageManifestServicesClassName(string packageName, string buildPipeline) + { + string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestServicesClassName"; + return EditorPrefs.GetString(key, $"{typeof(ManifestNone).FullName}"); + } + public static void SetPackageManifestServicesClassName(string packageName, string buildPipeline, string encyptionClassName) + { + string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestServicesClassName"; EditorPrefs.SetString(key, encyptionClassName); } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs index e701dabe..58938c4f 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs @@ -98,6 +98,11 @@ namespace YooAsset.Editor /// public IEncryptionServices EncryptionServices; + /// + /// 资源清单服务类 + /// + public IManifestServices ManifestServices; + 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 67dabdde..03b8af32 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs @@ -14,7 +14,8 @@ namespace YooAsset.Editor { string buildinRootDirectory = buildParametersContext.GetBuildinRootDirectory(); string buildPackageName = buildParametersContext.Parameters.PackageName; - DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(buildPackageName, buildinRootDirectory); + var manifestServices = buildParametersContext.Parameters.ManifestServices; + DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(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 a23dd021..5d5c6e62 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs @@ -58,7 +58,7 @@ namespace YooAsset.Editor if (processBundleDepends) ProcessBuiltinBundleDependency(context, manifest); - // 创建补丁清单文本文件 + // 创建资源清单文本文件 { string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion); string filePath = $"{packageOutputDirectory}/{fileName}"; @@ -66,18 +66,18 @@ namespace YooAsset.Editor BuildLogger.Log($"Create package manifest file: {filePath}"); } - // 创建补丁清单二进制文件 + // 创建资源清单二进制文件 string packageHash; string packagePath; { string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion); packagePath = $"{packageOutputDirectory}/{fileName}"; - ManifestTools.SerializeToBinary(packagePath, manifest); + ManifestTools.SerializeToBinary(packagePath, manifest, buildParameters.ManifestServices); packageHash = HashUtility.FileCRC32(packagePath); BuildLogger.Log($"Create package manifest file: {packagePath}"); } - // 创建补丁清单哈希文件 + // 创建资源清单哈希文件 { string fileName = YooAssetSettingsData.GetPackageHashFileName(buildParameters.PackageName, buildParameters.PackageVersion); string filePath = $"{packageOutputDirectory}/{fileName}"; @@ -85,7 +85,7 @@ namespace YooAsset.Editor BuildLogger.Log($"Create package manifest hash file: {filePath}"); } - // 创建补丁清单版本文件 + // 创建资源清单版本文件 { string fileName = YooAssetSettingsData.GetPackageVersionFileName(buildParameters.PackageName); string filePath = $"{packageOutputDirectory}/{fileName}"; @@ -97,7 +97,7 @@ namespace YooAsset.Editor { ManifestContext manifestContext = new ManifestContext(); byte[] bytesData = FileUtility.ReadAllBytes(packagePath); - manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData); + manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData, buildParameters.ManifestServices); context.SetContextObject(manifestContext); } } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs index 3a358bf5..79bf4f5d 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs @@ -43,7 +43,8 @@ namespace YooAsset.Editor buildReport.Summary.EnableSharePackRule = buildParameters.EnableSharePackRule; buildReport.Summary.SingleReferencedPackAlone = buildParameters.SingleReferencedPackAlone; buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle; - buildReport.Summary.EncryptionClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName; + buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName; + buildReport.Summary.ManifestServicesClassName = buildParameters.ManifestServices == null ? "null" : buildParameters.ManifestServices.GetType().FullName; if (buildParameters is BuiltinBuildParameters) { var builtinBuildParameters = buildParameters as BuiltinBuildParameters; diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs similarity index 100% rename from Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs rename to Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs.meta similarity index 100% rename from Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta rename to Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs.meta diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs new file mode 100644 index 00000000..62ebc1ea --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs @@ -0,0 +1,15 @@ + +namespace YooAsset.Editor +{ + public class ManifestNone : IManifestServices + { + public byte[] ProcessManifest(byte[] fileData) + { + return fileData; + } + public byte[] RestoreManifest(byte[] fileData) + { + return fileData; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta new file mode 100644 index 00000000..73371bc0 --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 446513b0ea9f5d445ade0cfb09c5073b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs index 01cfbf68..261e194f 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs @@ -44,19 +44,33 @@ namespace YooAsset.Editor } /// - /// 创建加密类实例 + /// 创建资源加密服务类实例 /// - protected IEncryptionServices CreateEncryptionInstance() + protected IEncryptionServices CreateEncryptionServicesInstance() { - var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, PipelineName); - var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); - var classType = encryptionClassTypes.Find(x => x.FullName.Equals(encyptionClassName)); + var className = AssetBundleBuilderSetting.GetPackageEncyptionServicesClassName(PackageName, PipelineName); + var classTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); + var classType = classTypes.Find(x => x.FullName.Equals(className)); if (classType != null) return (IEncryptionServices)Activator.CreateInstance(classType); else return null; } + /// + /// 创建资源清单服务类实例 + /// + protected IManifestServices CreateManifestServicesInstance() + { + var className = AssetBundleBuilderSetting.GetPackageManifestServicesClassName(PackageName, PipelineName); + var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestServices)); + var classType = classTypes.Find(x => x.FullName.Equals(className)); + if (classType != null) + return (IManifestServices)Activator.CreateInstance(classType); + else + return null; + } + #region UI元素通用处理方法 protected void SetBuildOutputField(TextField textField) { @@ -149,35 +163,66 @@ namespace YooAsset.Editor }); UIElementsTools.SetElementLabelMinWidth(toggle, LabelMinWidth); } - protected PopupField CreateEncryptionField(VisualElement container) + protected PopupField CreateEncryptionServicesField(VisualElement container) { - // 加密方法 - var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); - if (encryptionClassTypes.Count > 0) + // 加密服务类 + var classTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); + if (classTypes.Count > 0) { - var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, PipelineName); - int defaultIndex = encryptionClassTypes.FindIndex(x => x.FullName.Equals(encyptionClassName)); + var className = AssetBundleBuilderSetting.GetPackageEncyptionServicesClassName(PackageName, PipelineName); + int defaultIndex = classTypes.FindIndex(x => x.FullName.Equals(className)); if (defaultIndex < 0) defaultIndex = 0; - var encryptionField = new PopupField(encryptionClassTypes, defaultIndex); - encryptionField.label = "Encryption"; - encryptionField.style.width = StyleWidth; - encryptionField.RegisterValueChangedCallback(evt => + var popupField = new PopupField(classTypes, defaultIndex); + popupField.label = "Encryption Services"; + popupField.style.width = StyleWidth; + popupField.RegisterValueChangedCallback(evt => { - AssetBundleBuilderSetting.SetPackageEncyptionClassName(PackageName, PipelineName, encryptionField.value.FullName); + AssetBundleBuilderSetting.SetPackageEncyptionServicesClassName(PackageName, PipelineName, popupField.value.FullName); }); - container.Add(encryptionField); - UIElementsTools.SetElementLabelMinWidth(encryptionField, LabelMinWidth); - return encryptionField; + container.Add(popupField); + UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); + return popupField; } else { - var encryptionField = new PopupField(); - encryptionField.label = "Encryption"; - encryptionField.style.width = StyleWidth; - container.Add(encryptionField); - UIElementsTools.SetElementLabelMinWidth(encryptionField, LabelMinWidth); - return encryptionField; + var popupField = new PopupField(); + popupField.label = "Encryption Services"; + popupField.style.width = StyleWidth; + container.Add(popupField); + UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); + return popupField; + } + } + protected PopupField CreateManifestServicesField(VisualElement container) + { + // 清单服务类 + var classTypes = EditorTools.GetAssignableTypes(typeof(IManifestServices)); + if (classTypes.Count > 0) + { + var className = AssetBundleBuilderSetting.GetPackageManifestServicesClassName(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.style.width = StyleWidth; + popupField.RegisterValueChangedCallback(evt => + { + AssetBundleBuilderSetting.SetPackageManifestServicesClassName(PackageName, PipelineName, popupField.value.FullName); + }); + container.Add(popupField); + UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); + return popupField; + } + else + { + var popupField = new PopupField(); + popupField.label = "Manifest Services"; + popupField.style.width = StyleWidth; + container.Add(popupField); + UIElementsTools.SetElementLabelMinWidth(popupField, LabelMinWidth); + return popupField; } } #endregion diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs index 42e47242..7254835d 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.cs @@ -16,7 +16,8 @@ namespace YooAsset.Editor protected TemplateContainer Root; protected TextField _buildOutputField; protected TextField _buildVersionField; - protected PopupField _encryptionField; + protected PopupField _encryptionServicesField; + protected PopupField _manifestServicesField; protected EnumField _compressionField; protected EnumField _outputNameStyleField; protected EnumField _copyBuildinFileOptionField; @@ -43,9 +44,10 @@ namespace YooAsset.Editor _buildVersionField = Root.Q("BuildVersion"); SetBuildVersionField(_buildVersionField); - // 加密方法 - var encryptionContainer = Root.Q("EncryptionContainer"); - _encryptionField = CreateEncryptionField(encryptionContainer); + // 服务类 + var popupContainer = Root.Q("PopupContainer"); + _encryptionServicesField = CreateEncryptionServicesField(popupContainer); + _manifestServicesField = CreateManifestServicesField(popupContainer); // 压缩方式选项 _compressionField = Root.Q("Compression"); @@ -116,7 +118,8 @@ namespace YooAsset.Editor buildParameters.CompressOption = compressOption; buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; - buildParameters.EncryptionServices = CreateEncryptionInstance(); + buildParameters.EncryptionServices = CreateEncryptionServicesInstance(); + buildParameters.ManifestServices = CreateManifestServicesInstance(); BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.uxml b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.uxml index 63ce7602..7c7f8bf2 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.uxml +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuiltinBuildPipeline/BuiltinBuildPipelineViewer.uxml @@ -4,7 +4,7 @@ - + diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/EditorSimulateBuildpipeline/EditorSimulateBuildPipelineViewer.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/EditorSimulateBuildpipeline/EditorSimulateBuildPipelineViewer.cs index c67c5bbb..1e1422c2 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/EditorSimulateBuildpipeline/EditorSimulateBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/EditorSimulateBuildpipeline/EditorSimulateBuildPipelineViewer.cs @@ -74,7 +74,6 @@ namespace YooAsset.Editor buildParameters.FileNameStyle = fileNameStyle; buildParameters.BuildinFileCopyOption = buildinFileCopyOption; buildParameters.BuildinFileCopyParams = buildinFileCopyParams; - buildParameters.EncryptionServices = CreateEncryptionInstance(); EditorSimulateBuildPipeline pipeline = new EditorSimulateBuildPipeline(); 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 3067acc8..230de5c8 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.cs @@ -16,7 +16,8 @@ namespace YooAsset.Editor protected TemplateContainer Root; protected TextField _buildOutputField; protected TextField _buildVersionField; - protected PopupField _encryptionField; + protected PopupField _encryptionServicesField; + protected PopupField _manifestServicesField; protected EnumField _outputNameStyleField; protected EnumField _copyBuildinFileOptionField; protected TextField _copyBuildinFileTagsField; @@ -43,8 +44,9 @@ namespace YooAsset.Editor SetBuildVersionField(_buildVersionField); // 加密方法 - var encryptionContainer = Root.Q("EncryptionContainer"); - _encryptionField = CreateEncryptionField(encryptionContainer); + var popupContainer = Root.Q("PopupContainer"); + _encryptionServicesField = CreateEncryptionServicesField(popupContainer); + _manifestServicesField = CreateManifestServicesField(popupContainer); // 输出文件名称样式 _outputNameStyleField = Root.Q("FileNameStyle"); @@ -108,7 +110,8 @@ namespace YooAsset.Editor buildParameters.BuildinFileCopyParams = buildinFileCopyParams; buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; - buildParameters.EncryptionServices = CreateEncryptionInstance(); + buildParameters.EncryptionServices = CreateEncryptionServicesInstance(); + buildParameters.ManifestServices = CreateManifestServicesInstance(); RawFileBuildPipeline pipeline = new RawFileBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.uxml b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.uxml index 11c468ce..24ef3807 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.uxml +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/RawfileBuildpipeline/RawfileBuildPipelineViewer.uxml @@ -4,7 +4,7 @@ - + diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs index 442da077..f010a688 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.cs @@ -16,7 +16,8 @@ namespace YooAsset.Editor protected TemplateContainer Root; protected TextField _buildOutputField; protected TextField _buildVersionField; - protected PopupField _encryptionField; + protected PopupField _encryptionServicesField; + protected PopupField _manifestServicesField; protected EnumField _compressionField; protected EnumField _outputNameStyleField; protected EnumField _copyBuildinFileOptionField; @@ -44,8 +45,9 @@ namespace YooAsset.Editor SetBuildVersionField(_buildVersionField); // 加密方法 - var encryptionContainer = Root.Q("EncryptionContainer"); - _encryptionField = CreateEncryptionField(encryptionContainer); + var popupContainer = Root.Q("PopupContainer"); + _encryptionServicesField = CreateEncryptionServicesField(popupContainer); + _manifestServicesField = CreateManifestServicesField(popupContainer); // 压缩方式选项 _compressionField = Root.Q("Compression"); @@ -118,7 +120,8 @@ namespace YooAsset.Editor buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.BuiltinShadersBundleName = builtinShaderBundleName; - buildParameters.EncryptionServices = CreateEncryptionInstance(); + buildParameters.EncryptionServices = CreateEncryptionServicesInstance(); + buildParameters.ManifestServices = CreateManifestServicesInstance(); ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.uxml b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.uxml index 63ce7602..7c7f8bf2 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.uxml +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/VisualViewers/ScriptableBuildPipeline/ScriptableBuildPipelineViewer.uxml @@ -4,7 +4,7 @@ - + diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs index 994f004f..893f43f9 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs @@ -71,9 +71,10 @@ namespace YooAsset.Editor public bool UseAssetDependencyDB; public bool EnableSharePackRule; public bool SingleReferencedPackAlone; - public string EncryptionClassName; + public string EncryptionServicesClassName; + public string ManifestServicesClassName; public EFileNameStyle FileNameStyle; - + // 引擎参数 public ECompressOption CompressOption; public bool DisableWriteTypeTree; diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs index 672d4683..5f44e1bd 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs @@ -66,7 +66,8 @@ namespace YooAsset.Editor BindListViewItem("Use Asset Dependency DB", $"{buildReport.Summary.UseAssetDependencyDB}"); BindListViewItem("Enable Share Pack Rule", $"{buildReport.Summary.EnableSharePackRule}"); BindListViewItem("Single Referenced Pack Alone", $"{buildReport.Summary.SingleReferencedPackAlone}"); - BindListViewItem("Encryption Class Name", buildReport.Summary.EncryptionClassName); + BindListViewItem("Encryption Services", buildReport.Summary.EncryptionServicesClassName); + BindListViewItem("Manifest Services", buildReport.Summary.ManifestServicesClassName); BindListViewItem("FileNameStyle", $"{buildReport.Summary.FileNameStyle}"); BindListViewItem("CompressOption", $"{buildReport.Summary.CompressOption}"); BindListViewItem("DisableWriteTypeTree", $"{buildReport.Summary.DisableWriteTypeTree}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index d061b6ea..d9600089 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -88,6 +88,11 @@ namespace YooAsset /// 自定义参数:解密方法类 /// public IDecryptionServices DecryptionServices { private set; get; } + + /// + /// 自定义参数:资源清单服务类 + /// + public IManifestServices ManifestServices { private set; get; } #endregion @@ -174,6 +179,10 @@ namespace YooAsset { DecryptionServices = (IDecryptionServices)value; } + else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) + { + ManifestServices = (IManifestServices)value; + } else { YooLogger.Warning($"Invalid parameter : {name}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs index 8ac5b494..1f960d17 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs @@ -11,7 +11,7 @@ namespace YooAsset /// /// 在构建应用程序前自动生成内置资源目录文件。 - /// 原理:搜索StreamingAssets目录下的所有资源文件,然后将这些文件信息写入文件,并存储在Resources目录下。 + /// 原理:搜索StreamingAssets目录下的所有资源文件,将这些文件信息写入文件,然后在运行时做查询用途。 /// public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report) { @@ -21,7 +21,7 @@ namespace YooAsset DirectoryInfo rootDirectory = new DirectoryInfo(rootPath); if (rootDirectory.Exists == false) { - UnityEngine.Debug.LogWarning($"Can not found StreamingAssets root directory : {rootPath}"); + Debug.LogWarning($"Can not found StreamingAssets root directory : {rootPath}"); return; } @@ -31,10 +31,17 @@ namespace YooAsset { string packageName = subDirectory.Name; string pacakgeDirectory = subDirectory.FullName; - bool result = CreateBuildinCatalogFile(packageName, pacakgeDirectory); - if (result == false) + try { - throw new System.Exception($"Create package {packageName} catalog file failed ! See the detail error in console !"); + 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}"); } } } @@ -42,7 +49,7 @@ namespace YooAsset /// /// 生成包裹的内置资源目录文件 /// - public static bool CreateBuildinCatalogFile(string packageName, string pacakgeDirectory) + public static bool CreateBuildinCatalogFile(IManifestServices services, string packageName, string pacakgeDirectory) { // 获取资源清单版本 string packageVersion; @@ -70,7 +77,7 @@ namespace YooAsset } var binaryData = FileUtility.ReadAllBytes(manifestFilePath); - packageManifest = ManifestTools.DeserializeFromBinary(binaryData); + packageManifest = ManifestTools.DeserializeFromBinary(binaryData, services); } // 获取文件名映射关系 diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs index 2cc48f3a..ac46ab57 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSInitializeOperation.cs @@ -106,10 +106,11 @@ namespace YooAsset if (_loadCatalogFileOp == null) { #if UNITY_EDITOR + /* // 兼容性初始化 // 说明:内置文件系统在编辑器下运行时需要动态生成 string packageRoot = _fileSystem.FileRoot; - bool result = DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(_fileSystem.PackageName, packageRoot); + bool result = DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(_fileSystem.ManifestServices, _fileSystem.PackageName, packageRoot); if (result == false) { _steps = ESteps.Done; @@ -117,6 +118,7 @@ namespace YooAsset Error = $"Create package catalog file failed ! See the detail error in console !"; return; } + */ #endif _loadCatalogFileOp = new LoadBuildinCatalogFileOperation(_fileSystem); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs index ccc5c652..0e65591d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinPackageManifestOperation.cs @@ -85,7 +85,7 @@ namespace YooAsset { if (_deserializer == null) { - _deserializer = new DeserializeManifestOperation(_webDataRequestOp.Result); + _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestServices, _webDataRequestOp.Result); _deserializer.StartOperation(); AddChildOperation(_deserializer); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index 77de987f..8a3ac1da 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -58,7 +58,7 @@ namespace YooAsset /// /// 自定义参数:远程服务接口 /// - public IRemoteServices RemoteServices { private set; get; } = null; + public IRemoteServices RemoteServices { private set; get; } /// /// 自定义参数:初始化的时候缓存文件校验级别 @@ -99,6 +99,11 @@ namespace YooAsset /// 自定义参数:解密方法类 /// public IDecryptionServices DecryptionServices { private set; get; } + + /// + /// 自定义参数:资源清单服务类 + /// + public IManifestServices ManifestServices { private set; get; } #endregion @@ -221,6 +226,10 @@ namespace YooAsset { DecryptionServices = (IDecryptionServices)value; } + else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) + { + ManifestServices = (IManifestServices)value; + } else { YooLogger.Warning($"Invalid parameter : {name}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/LoadCachePackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/LoadCachePackageManifestOperation.cs index 711f19cd..4f349184 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/LoadCachePackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/LoadCachePackageManifestOperation.cs @@ -75,7 +75,7 @@ namespace YooAsset { if (_deserializer == null) { - _deserializer = new DeserializeManifestOperation(_fileData); + _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestServices, _fileData); _deserializer.StartOperation(); AddChildOperation(_deserializer); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/internal/LoadEditorPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/internal/LoadEditorPackageManifestOperation.cs index cad37d04..c6ebcc4b 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/internal/LoadEditorPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/internal/LoadEditorPackageManifestOperation.cs @@ -75,7 +75,7 @@ namespace YooAsset { if (_deserializer == null) { - _deserializer = new DeserializeManifestOperation(_fileData); + _deserializer = new DeserializeManifestOperation(null, _fileData); _deserializer.StartOperation(); AddChildOperation(_deserializer); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs index 45c20696..e956ac3a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs @@ -46,12 +46,17 @@ namespace YooAsset /// /// 自定义参数:跨域下载服务接口 /// - public IRemoteServices RemoteServices { private set; get; } = null; + public IRemoteServices RemoteServices { private set; get; } /// /// 自定义参数:解密方法类 /// public IWebDecryptionServices DecryptionServices { private set; get; } + + /// + /// 自定义参数:资源清单服务类 + /// + public IManifestServices ManifestServices { private set; get; } #endregion @@ -111,6 +116,10 @@ namespace YooAsset { DecryptionServices = (IWebDecryptionServices)value; } + else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) + { + ManifestServices = (IManifestServices)value; + } else { YooLogger.Warning($"Invalid parameter : {name}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/internal/LoadWebRemotePackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/internal/LoadWebRemotePackageManifestOperation.cs index 13b2a653..b2cb756f 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/internal/LoadWebRemotePackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/internal/LoadWebRemotePackageManifestOperation.cs @@ -88,7 +88,7 @@ namespace YooAsset { if (_deserializer == null) { - _deserializer = new DeserializeManifestOperation(_webDataRequestOp.Result); + _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestServices, _webDataRequestOp.Result); _deserializer.StartOperation(); AddChildOperation(_deserializer); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs index a910c202..149d6c6b 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs @@ -61,6 +61,11 @@ namespace YooAsset /// 自定义参数:解密方法类 /// public IWebDecryptionServices DecryptionServices { private set; get; } + + /// + /// 自定义参数:资源清单服务类 + /// + public IManifestServices ManifestServices { private set; get; } #endregion @@ -116,6 +121,10 @@ namespace YooAsset { DecryptionServices = (IWebDecryptionServices)value; } + else if (name == FileSystemParametersDefine.MANIFEST_SERVICES) + { + ManifestServices = (IManifestServices)value; + } else { YooLogger.Warning($"Invalid parameter : {name}"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSInitializeOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSInitializeOperation.cs index ae2a5dc9..79c4daab 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSInitializeOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSInitializeOperation.cs @@ -33,10 +33,11 @@ namespace YooAsset if (_loadCatalogFileOp == null) { #if UNITY_EDITOR + /* // 兼容性初始化 // 说明:内置文件系统在编辑器下运行时需要动态生成 string packageRoot = _fileSystem.FileRoot; - bool result = DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(_fileSystem.PackageName, packageRoot); + bool result = DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(_fileSystem.ManifestServices, _fileSystem.PackageName, packageRoot); if (result == false) { _steps = ESteps.Done; @@ -44,6 +45,7 @@ namespace YooAsset Error = $"Create package catalog file failed ! See the detail error in console !"; return; } + */ #endif _loadCatalogFileOp = new LoadWebServerCatalogFileOperation(_fileSystem); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerPackageManifestOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerPackageManifestOperation.cs index e727b86a..0dbce2d2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerPackageManifestOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerPackageManifestOperation.cs @@ -85,7 +85,7 @@ namespace YooAsset { if (_deserializer == null) { - _deserializer = new DeserializeManifestOperation(_webDataRequestOp.Result); + _deserializer = new DeserializeManifestOperation(_fileSystem.ManifestServices, _webDataRequestOp.Result); _deserializer.StartOperation(); AddChildOperation(_deserializer); } diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs index 6c61693f..9985afc2 100644 --- a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs @@ -7,6 +7,7 @@ namespace YooAsset public const string INSTALL_CLEAR_MODE = "INSTALL_CLEAR_MODE"; public const string REMOTE_SERVICES = "REMOTE_SERVICES"; public const string DECRYPTION_SERVICES = "DECRYPTION_SERVICES"; + public const string MANIFEST_SERVICES = "MANIFEST_SERVICES"; public const string APPEND_FILE_EXTENSION = "APPEND_FILE_EXTENSION"; public const string DISABLE_CATALOG_FILE = "DISABLE_CATALOG_FILE"; public const string DISABLE_UNITY_WEB_CACHE = "DISABLE_UNITY_WEB_CACHE"; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs index 2890aea6..e7f71754 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) + public static void SerializeToBinary(string savePath, PackageManifest manifest, IManifestServices services) { using (FileStream fs = new FileStream(savePath, FileMode.Create)) { @@ -96,9 +96,20 @@ namespace YooAsset buffer.WriteInt32Array(packageBundle.DependBundleIDs); } - // 写入文件流 - buffer.WriteToStream(fs); - fs.Flush(); + // 清单处理操作 + if (services != null) + { + var tempBytes = buffer.GetBytes(); + var resultBytes = services.ProcessManifest(tempBytes); + fs.Write(resultBytes, 0, resultBytes.Length); + fs.Flush(); + } + else + { + // 写入文件流 + buffer.WriteToStream(fs); + fs.Flush(); + } } } @@ -113,10 +124,19 @@ namespace YooAsset /// /// 反序列化(二进制文件) /// - public static PackageManifest DeserializeFromBinary(byte[] binaryData) + public static PackageManifest DeserializeFromBinary(byte[] binaryData, IManifestServices services) { // 创建缓存器 - BufferReader buffer = new BufferReader(binaryData); + BufferReader buffer; + if (services != null) + { + var resultBytes = services.RestoreManifest(binaryData); + buffer = new BufferReader(resultBytes); + } + else + { + buffer = new BufferReader(binaryData); + } // 读取文件标记 uint fileSign = buffer.ReadUInt32(); diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs index 824854a2..50689ea9 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs @@ -10,6 +10,7 @@ namespace YooAsset private enum ESteps { None, + RestoreFileData, DeserializeFileHeader, PrepareAssetList, DeserializeAssetList, @@ -19,7 +20,9 @@ namespace YooAsset Done, } - private readonly BufferReader _buffer; + private readonly IManifestServices _services; + private byte[] _sourceData; + private BufferReader _buffer; private int _packageAssetCount; private int _packageBundleCount; private int _progressTotalValue; @@ -30,13 +33,14 @@ namespace YooAsset /// public PackageManifest Manifest { private set; get; } - public DeserializeManifestOperation(byte[] binaryData) + public DeserializeManifestOperation(IManifestServices services, byte[] binaryData) { - _buffer = new BufferReader(binaryData); + _services = services; + _sourceData = binaryData; } internal override void InternalStart() { - _steps = ESteps.DeserializeFileHeader; + _steps = ESteps.RestoreFileData; } internal override void InternalUpdate() { @@ -45,6 +49,19 @@ namespace YooAsset try { + if (_steps == ESteps.RestoreFileData) + { + if (_services != null) + { + var resultData = _services.RestoreManifest(_sourceData); + if (resultData != null) + _sourceData = resultData; + } + + _buffer = new BufferReader(_sourceData); + _steps = ESteps.DeserializeFileHeader; + } + if (_steps == ESteps.DeserializeFileHeader) { if (_buffer.IsValid == false) diff --git a/Assets/YooAsset/Runtime/Services/IManifestServices.cs b/Assets/YooAsset/Runtime/Services/IManifestServices.cs new file mode 100644 index 00000000..0b7c65d1 --- /dev/null +++ b/Assets/YooAsset/Runtime/Services/IManifestServices.cs @@ -0,0 +1,19 @@ + +namespace YooAsset +{ + /// + /// 资源清单文件处理服务接口 + /// + public interface IManifestServices + { + /// + /// 处理资源清单(压缩和加密) + /// + byte[] ProcessManifest(byte[] fileData); + + /// + /// 还原资源清单(解压和解密) + /// + byte[] RestoreManifest(byte[] fileData); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/Services/IManifestServices.cs.meta b/Assets/YooAsset/Runtime/Services/IManifestServices.cs.meta new file mode 100644 index 00000000..28a5906d --- /dev/null +++ b/Assets/YooAsset/Runtime/Services/IManifestServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7378f37c14fe59b4dbb5c1259a3f19c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/Utility/BufferWriter.cs b/Assets/YooAsset/Runtime/Utility/BufferWriter.cs index 553b62fe..f1acec27 100644 --- a/Assets/YooAsset/Runtime/Utility/BufferWriter.cs +++ b/Assets/YooAsset/Runtime/Utility/BufferWriter.cs @@ -36,6 +36,16 @@ namespace YooAsset _index = 0; } + /// + /// 获取有效数据 + /// + public byte[] GetBytes() + { + byte[] newArray = new byte[_index]; + Buffer.BlockCopy(_buffer, 0, newArray, 0, _index); + return newArray; + } + /// /// 将有效数据写入文件流 ///